diff --git a/.github/workflows/InfinityAutoPackager.yaml b/.github/workflows/InfinityAutoPackager.yaml new file mode 100644 index 0000000..7431e59 --- /dev/null +++ b/.github/workflows/InfinityAutoPackager.yaml @@ -0,0 +1,35 @@ +# Infinity Auto Packager by AL|EN (alienquake@hotmail.com) +# A tool that automatically generates Infinity Engine mod packages when you publish a release. + +on: + release: + types: [published] +jobs: + InfinityAutoPackager: + runs-on: ubuntu-latest + steps: + + - name: Initial setup + run: | + git lfs uninstall + git config --global core.autocrlf false + git config --global core.ignorecase true + + - name: Clone repository using 'github.ref' from release + uses: actions/checkout@master + + - name: Create Infinity Engine Mod Packages (.iemod and .zip) + uses: ALIENQuake/CreateIEModZipPackage@master + id: CreateIEModZipPackage + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Upload iemod package to latest release + uses: svenstaro/upload-release-action@v1-release + if: github.ref != 'refs/heads/master' + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: ${{ steps.CreateIEModZipPackage.outputs.PackageBaseName }}.iemod + asset_name: ${{ steps.CreateIEModZipPackage.outputs.PackageBaseName }}.iemod + tag: ${{ github.ref }} + overwrite: true diff --git a/iwdification/2da/7eyes.2da b/iwdification/2da/7eyes.2da deleted file mode 100644 index 9fb051f..0000000 --- a/iwdification/2da/7eyes.2da +++ /dev/null @@ -1,10 +0,0 @@ -2DA V1.0 -* - STATE STRREF 1 2 3 4 5 6 7 8 9 -EYEMIND 48 21654 3 5 24 76 128 SPWI411 SPPR102 SPPR311 SPPR716 -EYESWORD 49 21653 12*0 12*0x800000 12*0x100000 12*0x1000000 12*0x8000000 * * * * -EYEMAGE 50 21652 12*0x80000 12*0x40000 12*0x20000 12*0x10000 12*0x400000 * * * * -EYEVENOM 51 21651 12*0x200000 25 * * * * * * * -EYESPIRIT 52 21650 SPWI605 SPWI713 SPWI912 SPPR511 SPPR734 * * * * -EYEFORTITUDE 53 21649 38 45 74 80 109 175 210 * * -EYESTONE 54 21648 134 * * * * * * * * diff --git a/iwdification/2da/cdiaelmw.2da b/iwdification/2da/cdiaelmw.2da deleted file mode 100644 index 762cb4d..0000000 --- a/iwdification/2da/cdiaelmw.2da +++ /dev/null @@ -1,4 +0,0 @@ -2DA V1.0 -0 - RESREF HitAnimation AreaHitAnimation -1 cdi8air cdimsm1h SPPORTAL diff --git a/iwdification/2da/cdidsmon.2da b/iwdification/2da/cdidsmon.2da deleted file mode 100644 index effd5b6..0000000 --- a/iwdification/2da/cdidsmon.2da +++ /dev/null @@ -1,10 +0,0 @@ -2DA V1.0 -0 - RESREF HitAnimation AreaHitAnimation -1 cdis2gb1 cdimsm1h cdimsm1x -2 cdis2gb2 cdimsm1h cdimsm1x -3 cdis2gb3 cdimsm1h cdimsm1x -4 cdis2gb3 cdimsm1h cdimsm1x -5 cdis2lz5 cdimsm1h cdimsm1x -6 cdis2lz6 cdimsm1h cdimsm1x -7 cdis2lz7 cdimsm1h cdimsm1x diff --git a/iwdification/2da/cdieelmw.2da b/iwdification/2da/cdieelmw.2da deleted file mode 100644 index 1b7e45f..0000000 --- a/iwdification/2da/cdieelmw.2da +++ /dev/null @@ -1,4 +0,0 @@ -2DA V1.0 -0 - RESREF HitAnimation AreaHitAnimation -1 cdi8erth cdimsm1h cdiceelx diff --git a/iwdification/2da/cdifelmw.2da b/iwdification/2da/cdifelmw.2da deleted file mode 100644 index 108a5de..0000000 --- a/iwdification/2da/cdifelmw.2da +++ /dev/null @@ -1,4 +0,0 @@ -2DA V1.0 -0 - RESREF HitAnimation AreaHitAnimation -1 cdi8fire cdimsm1h cdicfelx diff --git a/iwdification/2da/cdiinsct.2da b/iwdification/2da/cdiinsct.2da deleted file mode 100644 index 52907dc..0000000 --- a/iwdification/2da/cdiinsct.2da +++ /dev/null @@ -1,5 +0,0 @@ -2DA V1.0 -0 - RESREF HitAnimation AreaHitAnimation -1 cdiibomb cdimsm1h cdiasm1x -2 cdiiborb cdimsm1h cdiasm1x diff --git a/iwdification/2da/cdimsum4.2da b/iwdification/2da/cdimsum4.2da deleted file mode 100644 index 6721a13..0000000 --- a/iwdification/2da/cdimsum4.2da +++ /dev/null @@ -1,6 +0,0 @@ -2DA V1.0 -0 - RESREF HitAnimation AreaHitAnimation -1 cdi4ghst cdimsm1h cdimsm1x -2 cdi4ogre cdimsm1h cdimsm1x -3 cdi4yeti cdimsm1h cdimsm1x diff --git a/iwdification/2da/cdimsum5.2da b/iwdification/2da/cdimsum5.2da deleted file mode 100644 index b9c05f4..0000000 --- a/iwdification/2da/cdimsum5.2da +++ /dev/null @@ -1,6 +0,0 @@ -2DA V1.0 -0 - RESREF HitAnimation AreaHitAnimation -1 cdi5gspi cdimsm1h cdimsm1x -2 cdi5jzom cdimsm1h cdimsm1x -3 cdi5mino cdimsm1h cdimsm1x diff --git a/iwdification/2da/cdimsum6.2da b/iwdification/2da/cdimsum6.2da deleted file mode 100644 index 6c56546..0000000 --- a/iwdification/2da/cdimsum6.2da +++ /dev/null @@ -1,7 +0,0 @@ -2DA V1.0 -0 - RESREF HitAnimation AreaHitAnimation -1 cdi6crwl cdimsm1h cdimsm1x -2 cdi6pspi cdimsm1h cdimsm1x -3 cdi6salc cdimsm1h cdimsm1x -4 cdi6salf cdimsm1h cdimsm1x diff --git a/iwdification/2da/cdimsum7.2da b/iwdification/2da/cdimsum7.2da deleted file mode 100644 index 78c1beb..0000000 --- a/iwdification/2da/cdimsum7.2da +++ /dev/null @@ -1,5 +0,0 @@ -2DA V1.0 -0 - RESREF HitAnimation AreaHitAnimation -1 cdi7bgrd cdimsm1h cdimsm1x -2 cdi7umbh cdimsm1h cdimsm1x diff --git a/iwdification/2da/cdishade.2da b/iwdification/2da/cdishade.2da deleted file mode 100644 index 5abfcbc..0000000 --- a/iwdification/2da/cdishade.2da +++ /dev/null @@ -1,14 +0,0 @@ -2DA V1.0 -0 - RESREF HitAnimation AreaHitAnimation -1 cdis2gb2 cdimsm1h cdimsm1x -2 cdis2gb2 cdimsm1h cdimsm1x -3 cdis2gb3 cdimsm1h cdimsm1x -4 cdis2gb3 cdimsm1h cdimsm1x -5 cdis2lz5 cdimsm1h cdimsm1x -6 cdis2lz6 cdimsm1h cdimsm1x -7 cdis2lz7 cdimsm1h cdimsm1x -8 cdis3tr7 cdimsm1h cdimsm1x -9 cdis3tr8 cdimsm1h cdimsm1x -10 cdis3um8 cdimsm1h cdimsm1x -11 cdis3um9 cdimsm1h cdimsm1x diff --git a/iwdification/2da/cdishadw.2da b/iwdification/2da/cdishadw.2da deleted file mode 100644 index f95ac82..0000000 --- a/iwdification/2da/cdishadw.2da +++ /dev/null @@ -1,4 +0,0 @@ -2DA V1.0 -0 - RESREF HitAnimation AreaHitAnimation -1 cdisshad cdimsm1h cdimsm1x diff --git a/iwdification/2da/cdismons.2da b/iwdification/2da/cdismons.2da deleted file mode 100644 index cde19b1..0000000 --- a/iwdification/2da/cdismons.2da +++ /dev/null @@ -1,11 +0,0 @@ -2DA V1.0 -0 - RESREF HitAnimation AreaHitAnimation -1 cdis1gb1 cdimsm1h cdimsm1x -2 cdis1gb2 cdimsm1h cdimsm1x -3 cdis1gb3 cdimsm1h cdimsm1x -4 cdis1lz3 cdimsm1h cdimsm1x -5 cdis1lz4 cdimsm1h cdimsm1x -6 cdis1tr6 cdimsm1h cdimsm1x -7 cdis1tr7 cdimsm1h cdimsm1x -8 cdis1tr8 cdimsm1h cdimsm1x diff --git a/iwdification/2da/cdiwelmw.2da b/iwdification/2da/cdiwelmw.2da deleted file mode 100644 index ed516f8..0000000 --- a/iwdification/2da/cdiwelmw.2da +++ /dev/null @@ -1,4 +0,0 @@ -2DA V1.0 -0 - RESREF HitAnimation AreaHitAnimation -1 cdi8watr cdimsm1h cdicwelx diff --git a/iwdification/2da/mxsplpal.2da b/iwdification/2da/mxsplpal.2da new file mode 100644 index 0000000..e416455 --- /dev/null +++ b/iwdification/2da/mxsplpal.2da @@ -0,0 +1,48 @@ +2DA V1.0 +0 + 1 2 3 4 5 6 +6 1 0 0 0 0 0 +7 1 0 0 0 0 0 +8 1 0 0 0 0 0 +9 1 0 0 0 0 0 +10 1 1 0 0 0 0 +11 1 1 0 0 0 0 +12 1 1 1 0 0 0 +13 1 1 1 0 0 0 +14 2 1 1 0 0 0 +15 2 1 1 1 0 0 +16 2 2 1 1 0 0 +17 2 2 2 1 0 0 +18 3 2 2 1 0 0 +19 3 3 3 2 0 0 +20 3 3 3 3 0 0 +21 4 3 3 3 0 0 +22 4 3 3 3 1 0 +23 4 4 3 3 1 0 +24 4 4 4 3 1 0 +25 4 4 4 4 1 0 +26 4 4 4 4 2 0 +27 5 4 4 4 2 0 +28 5 5 4 4 2 0 +29 5 5 5 4 2 1 +30 5 5 5 5 3 1 +31 5 5 5 5 3 1 +32 5 5 5 5 3 1 +33 5 5 5 5 3 1 +34 5 5 5 5 3 1 +35 5 5 5 5 3 1 +36 5 5 5 5 3 1 +37 5 5 5 5 3 1 +38 5 5 5 5 3 1 +39 5 5 5 5 3 1 +40 5 5 5 5 3 1 +41 5 5 5 5 3 1 +42 5 5 5 5 3 1 +43 5 5 5 5 3 1 +44 5 5 5 5 3 1 +45 5 5 5 5 3 1 +46 5 5 5 5 3 1 +47 5 5 5 5 3 1 +48 5 5 5 5 3 1 +49 5 5 5 5 3 1 +50 5 5 5 5 3 1 diff --git a/iwdification/2da/mxsplran.2da b/iwdification/2da/mxsplran.2da new file mode 100644 index 0000000..e416455 --- /dev/null +++ b/iwdification/2da/mxsplran.2da @@ -0,0 +1,48 @@ +2DA V1.0 +0 + 1 2 3 4 5 6 +6 1 0 0 0 0 0 +7 1 0 0 0 0 0 +8 1 0 0 0 0 0 +9 1 0 0 0 0 0 +10 1 1 0 0 0 0 +11 1 1 0 0 0 0 +12 1 1 1 0 0 0 +13 1 1 1 0 0 0 +14 2 1 1 0 0 0 +15 2 1 1 1 0 0 +16 2 2 1 1 0 0 +17 2 2 2 1 0 0 +18 3 2 2 1 0 0 +19 3 3 3 2 0 0 +20 3 3 3 3 0 0 +21 4 3 3 3 0 0 +22 4 3 3 3 1 0 +23 4 4 3 3 1 0 +24 4 4 4 3 1 0 +25 4 4 4 4 1 0 +26 4 4 4 4 2 0 +27 5 4 4 4 2 0 +28 5 5 4 4 2 0 +29 5 5 5 4 2 1 +30 5 5 5 5 3 1 +31 5 5 5 5 3 1 +32 5 5 5 5 3 1 +33 5 5 5 5 3 1 +34 5 5 5 5 3 1 +35 5 5 5 5 3 1 +36 5 5 5 5 3 1 +37 5 5 5 5 3 1 +38 5 5 5 5 3 1 +39 5 5 5 5 3 1 +40 5 5 5 5 3 1 +41 5 5 5 5 3 1 +42 5 5 5 5 3 1 +43 5 5 5 5 3 1 +44 5 5 5 5 3 1 +45 5 5 5 5 3 1 +46 5 5 5 5 3 1 +47 5 5 5 5 3 1 +48 5 5 5 5 3 1 +49 5 5 5 5 3 1 +50 5 5 5 5 3 1 diff --git a/iwdification/animations/6403/msklg1.bam b/iwdification/animations/6403/msklg1.bam deleted file mode 100644 index e0c1f79..0000000 Binary files a/iwdification/animations/6403/msklg1.bam and /dev/null differ diff --git a/iwdification/animations/6403/msklg1e.bam b/iwdification/animations/6403/msklg1e.bam deleted file mode 100644 index 195adac..0000000 Binary files a/iwdification/animations/6403/msklg1e.bam and /dev/null differ diff --git a/iwdification/animations/7302/shamb01.wav b/iwdification/animations/7302/shamb01.wav deleted file mode 100644 index c87cb28..0000000 Binary files a/iwdification/animations/7302/shamb01.wav and /dev/null differ diff --git a/iwdification/animations/7302/shamb02.wav b/iwdification/animations/7302/shamb02.wav deleted file mode 100644 index 78235b4..0000000 Binary files a/iwdification/animations/7302/shamb02.wav and /dev/null differ diff --git a/iwdification/animations/7302/shamb03.wav b/iwdification/animations/7302/shamb03.wav deleted file mode 100644 index 04115c0..0000000 Binary files a/iwdification/animations/7302/shamb03.wav and /dev/null differ diff --git a/iwdification/animations/7302/shamb04.wav b/iwdification/animations/7302/shamb04.wav deleted file mode 100644 index f625ceb..0000000 Binary files a/iwdification/animations/7302/shamb04.wav and /dev/null differ diff --git a/iwdification/animations/7302/shamb05.wav b/iwdification/animations/7302/shamb05.wav deleted file mode 100644 index 8fc13e7..0000000 Binary files a/iwdification/animations/7302/shamb05.wav and /dev/null differ diff --git a/iwdification/animations/7302/shamb06.wav b/iwdification/animations/7302/shamb06.wav deleted file mode 100644 index 9abdd2d..0000000 Binary files a/iwdification/animations/7302/shamb06.wav and /dev/null differ diff --git a/iwdification/animations/7302/shamb07.wav b/iwdification/animations/7302/shamb07.wav deleted file mode 100644 index 90a4b36..0000000 Binary files a/iwdification/animations/7302/shamb07.wav and /dev/null differ diff --git a/iwdification/animations/e070/minot01.wav b/iwdification/animations/e070/minot01.wav deleted file mode 100644 index 34e0040..0000000 Binary files a/iwdification/animations/e070/minot01.wav and /dev/null differ diff --git a/iwdification/animations/e070/minot02.wav b/iwdification/animations/e070/minot02.wav deleted file mode 100644 index 102f524..0000000 Binary files a/iwdification/animations/e070/minot02.wav and /dev/null differ diff --git a/iwdification/animations/e070/minot03.wav b/iwdification/animations/e070/minot03.wav deleted file mode 100644 index b60dece..0000000 Binary files a/iwdification/animations/e070/minot03.wav and /dev/null differ diff --git a/iwdification/animations/e070/minot04.wav b/iwdification/animations/e070/minot04.wav deleted file mode 100644 index c01b9a3..0000000 Binary files a/iwdification/animations/e070/minot04.wav and /dev/null differ diff --git a/iwdification/animations/e070/minot07.wav b/iwdification/animations/e070/minot07.wav deleted file mode 100644 index 9140e39..0000000 Binary files a/iwdification/animations/e070/minot07.wav and /dev/null differ diff --git a/iwdification/animations/e070/minot08.wav b/iwdification/animations/e070/minot08.wav deleted file mode 100644 index 210a0bf..0000000 Binary files a/iwdification/animations/e070/minot08.wav and /dev/null differ diff --git a/iwdification/animations/e070/minot09.wav b/iwdification/animations/e070/minot09.wav deleted file mode 100644 index 16de21d..0000000 Binary files a/iwdification/animations/e070/minot09.wav and /dev/null differ diff --git a/iwdification/animations/e070/minot10.wav b/iwdification/animations/e070/minot10.wav deleted file mode 100644 index 3253d67..0000000 Binary files a/iwdification/animations/e070/minot10.wav and /dev/null differ diff --git a/iwdification/animations/e070/mminca.bam b/iwdification/animations/e070/mminca.bam deleted file mode 100644 index 635a3a7..0000000 Binary files a/iwdification/animations/e070/mminca.bam and /dev/null differ diff --git a/iwdification/animations/e070/mmincae.bam b/iwdification/animations/e070/mmincae.bam deleted file mode 100644 index 9ecef27..0000000 Binary files a/iwdification/animations/e070/mmincae.bam and /dev/null differ diff --git a/iwdification/animations/e070/mminsp.bam b/iwdification/animations/e070/mminsp.bam deleted file mode 100644 index 51d853c..0000000 Binary files a/iwdification/animations/e070/mminsp.bam and /dev/null differ diff --git a/iwdification/animations/e070/mminspe.bam b/iwdification/animations/e070/mminspe.bam deleted file mode 100644 index 54d9db6..0000000 Binary files a/iwdification/animations/e070/mminspe.bam and /dev/null differ diff --git a/iwdification/animations/e0b0/mtroca.bam b/iwdification/animations/e0b0/mtroca.bam deleted file mode 100644 index 93b20d7..0000000 Binary files a/iwdification/animations/e0b0/mtroca.bam and /dev/null differ diff --git a/iwdification/animations/e0b0/mtrocae.bam b/iwdification/animations/e0b0/mtrocae.bam deleted file mode 100644 index 0c4ab25..0000000 Binary files a/iwdification/animations/e0b0/mtrocae.bam and /dev/null differ diff --git a/iwdification/animations/e0b0/mtrosp.bam b/iwdification/animations/e0b0/mtrosp.bam deleted file mode 100644 index afcd74a..0000000 Binary files a/iwdification/animations/e0b0/mtrosp.bam and /dev/null differ diff --git a/iwdification/animations/e0b0/mtrospe.bam b/iwdification/animations/e0b0/mtrospe.bam deleted file mode 100644 index 237e1af..0000000 Binary files a/iwdification/animations/e0b0/mtrospe.bam and /dev/null differ diff --git a/iwdification/animations/e0b0/troll07a.wav b/iwdification/animations/e0b0/troll07a.wav deleted file mode 100644 index 111baf2..0000000 Binary files a/iwdification/animations/e0b0/troll07a.wav and /dev/null differ diff --git a/iwdification/animations/e0b0/troll07b.wav b/iwdification/animations/e0b0/troll07b.wav deleted file mode 100644 index 070f1fc..0000000 Binary files a/iwdification/animations/e0b0/troll07b.wav and /dev/null differ diff --git a/iwdification/animations/e0b0/troll09b.wav b/iwdification/animations/e0b0/troll09b.wav deleted file mode 100644 index 7a2c956..0000000 Binary files a/iwdification/animations/e0b0/troll09b.wav and /dev/null differ diff --git a/iwdification/animations/e0d0/bf_lg01.wav b/iwdification/animations/e0d0/bf_lg01.wav deleted file mode 100644 index 77bf64d..0000000 Binary files a/iwdification/animations/e0d0/bf_lg01.wav and /dev/null differ diff --git a/iwdification/animations/e0d0/bf_lg02.wav b/iwdification/animations/e0d0/bf_lg02.wav deleted file mode 100644 index 75f656c..0000000 Binary files a/iwdification/animations/e0d0/bf_lg02.wav and /dev/null differ diff --git a/iwdification/animations/e0d0/bf_lg03.wav b/iwdification/animations/e0d0/bf_lg03.wav deleted file mode 100644 index a6a95ec..0000000 Binary files a/iwdification/animations/e0d0/bf_lg03.wav and /dev/null differ diff --git a/iwdification/animations/e0d0/mumba1.bam b/iwdification/animations/e0d0/mumba1.bam deleted file mode 100644 index aba058d..0000000 Binary files a/iwdification/animations/e0d0/mumba1.bam and /dev/null differ diff --git a/iwdification/animations/e0d0/mumba1e.bam b/iwdification/animations/e0d0/mumba1e.bam deleted file mode 100644 index cfaa7d4..0000000 Binary files a/iwdification/animations/e0d0/mumba1e.bam and /dev/null differ diff --git a/iwdification/animations/e0d0/mumba2.bam b/iwdification/animations/e0d0/mumba2.bam deleted file mode 100644 index 1626247..0000000 Binary files a/iwdification/animations/e0d0/mumba2.bam and /dev/null differ diff --git a/iwdification/animations/e0d0/mumba2e.bam b/iwdification/animations/e0d0/mumba2e.bam deleted file mode 100644 index c2f3d20..0000000 Binary files a/iwdification/animations/e0d0/mumba2e.bam and /dev/null differ diff --git a/iwdification/animations/e0d0/mumbca.bam b/iwdification/animations/e0d0/mumbca.bam deleted file mode 100644 index 509c3bd..0000000 Binary files a/iwdification/animations/e0d0/mumbca.bam and /dev/null differ diff --git a/iwdification/animations/e0d0/mumbcae.bam b/iwdification/animations/e0d0/mumbcae.bam deleted file mode 100644 index 73a37af..0000000 Binary files a/iwdification/animations/e0d0/mumbcae.bam and /dev/null differ diff --git a/iwdification/animations/e0d0/mumbde.bam b/iwdification/animations/e0d0/mumbde.bam deleted file mode 100644 index 6aed976..0000000 Binary files a/iwdification/animations/e0d0/mumbde.bam and /dev/null differ diff --git a/iwdification/animations/e0d0/mumbdee.bam b/iwdification/animations/e0d0/mumbdee.bam deleted file mode 100644 index f082d2e..0000000 Binary files a/iwdification/animations/e0d0/mumbdee.bam and /dev/null differ diff --git a/iwdification/animations/e0d0/mumbgh.bam b/iwdification/animations/e0d0/mumbgh.bam deleted file mode 100644 index 5b326a5..0000000 Binary files a/iwdification/animations/e0d0/mumbgh.bam and /dev/null differ diff --git a/iwdification/animations/e0d0/mumbghe.bam b/iwdification/animations/e0d0/mumbghe.bam deleted file mode 100644 index ed8ee1b..0000000 Binary files a/iwdification/animations/e0d0/mumbghe.bam and /dev/null differ diff --git a/iwdification/animations/e0d0/mumbgu.bam b/iwdification/animations/e0d0/mumbgu.bam deleted file mode 100644 index f0a9e1a..0000000 Binary files a/iwdification/animations/e0d0/mumbgu.bam and /dev/null differ diff --git a/iwdification/animations/e0d0/mumbgue.bam b/iwdification/animations/e0d0/mumbgue.bam deleted file mode 100644 index 32dbe3c..0000000 Binary files a/iwdification/animations/e0d0/mumbgue.bam and /dev/null differ diff --git a/iwdification/animations/e0d0/mumbsc.bam b/iwdification/animations/e0d0/mumbsc.bam deleted file mode 100644 index 6fb4ebb..0000000 Binary files a/iwdification/animations/e0d0/mumbsc.bam and /dev/null differ diff --git a/iwdification/animations/e0d0/mumbsce.bam b/iwdification/animations/e0d0/mumbsce.bam deleted file mode 100644 index 4ccb084..0000000 Binary files a/iwdification/animations/e0d0/mumbsce.bam and /dev/null differ diff --git a/iwdification/animations/e0d0/mumbsd.bam b/iwdification/animations/e0d0/mumbsd.bam deleted file mode 100644 index bc322f6..0000000 Binary files a/iwdification/animations/e0d0/mumbsd.bam and /dev/null differ diff --git a/iwdification/animations/e0d0/mumbsde.bam b/iwdification/animations/e0d0/mumbsde.bam deleted file mode 100644 index 6bc30a3..0000000 Binary files a/iwdification/animations/e0d0/mumbsde.bam and /dev/null differ diff --git a/iwdification/animations/e0d0/mumbsl.bam b/iwdification/animations/e0d0/mumbsl.bam deleted file mode 100644 index e959908..0000000 Binary files a/iwdification/animations/e0d0/mumbsl.bam and /dev/null differ diff --git a/iwdification/animations/e0d0/mumbsle.bam b/iwdification/animations/e0d0/mumbsle.bam deleted file mode 100644 index 081d35d..0000000 Binary files a/iwdification/animations/e0d0/mumbsle.bam and /dev/null differ diff --git a/iwdification/animations/e0d0/mumbsp.bam b/iwdification/animations/e0d0/mumbsp.bam deleted file mode 100644 index ed8f54d..0000000 Binary files a/iwdification/animations/e0d0/mumbsp.bam and /dev/null differ diff --git a/iwdification/animations/e0d0/mumbspe.bam b/iwdification/animations/e0d0/mumbspe.bam deleted file mode 100644 index 83d5ecc..0000000 Binary files a/iwdification/animations/e0d0/mumbspe.bam and /dev/null differ diff --git a/iwdification/animations/e0d0/mumbtw.bam b/iwdification/animations/e0d0/mumbtw.bam deleted file mode 100644 index f4a5a77..0000000 Binary files a/iwdification/animations/e0d0/mumbtw.bam and /dev/null differ diff --git a/iwdification/animations/e0d0/mumbtwe.bam b/iwdification/animations/e0d0/mumbtwe.bam deleted file mode 100644 index c6dddfb..0000000 Binary files a/iwdification/animations/e0d0/mumbtwe.bam and /dev/null differ diff --git a/iwdification/animations/e0d0/mumbwk.bam b/iwdification/animations/e0d0/mumbwk.bam deleted file mode 100644 index ea57f7e..0000000 Binary files a/iwdification/animations/e0d0/mumbwk.bam and /dev/null differ diff --git a/iwdification/animations/e0d0/mumbwke.bam b/iwdification/animations/e0d0/mumbwke.bam deleted file mode 100644 index cf766ce..0000000 Binary files a/iwdification/animations/e0d0/mumbwke.bam and /dev/null differ diff --git a/iwdification/animations/e0d0/umber03a.wav b/iwdification/animations/e0d0/umber03a.wav deleted file mode 100644 index 1d1d973..0000000 Binary files a/iwdification/animations/e0d0/umber03a.wav and /dev/null differ diff --git a/iwdification/animations/e0d0/umber03b.wav b/iwdification/animations/e0d0/umber03b.wav deleted file mode 100644 index 57a6634..0000000 Binary files a/iwdification/animations/e0d0/umber03b.wav and /dev/null differ diff --git a/iwdification/animations/e0d0/umber04a.wav b/iwdification/animations/e0d0/umber04a.wav deleted file mode 100644 index ee83d56..0000000 Binary files a/iwdification/animations/e0d0/umber04a.wav and /dev/null differ diff --git a/iwdification/animations/e0d0/umber04b.wav b/iwdification/animations/e0d0/umber04b.wav deleted file mode 100644 index b5f3df2..0000000 Binary files a/iwdification/animations/e0d0/umber04b.wav and /dev/null differ diff --git a/iwdification/animations/e0d0/umber08.wav b/iwdification/animations/e0d0/umber08.wav deleted file mode 100644 index cdf65a7..0000000 Binary files a/iwdification/animations/e0d0/umber08.wav and /dev/null differ diff --git a/iwdification/animations/e0d0/umber09a.wav b/iwdification/animations/e0d0/umber09a.wav deleted file mode 100644 index 6d3b186..0000000 Binary files a/iwdification/animations/e0d0/umber09a.wav and /dev/null differ diff --git a/iwdification/animations/e0d0/umber09b.wav b/iwdification/animations/e0d0/umber09b.wav deleted file mode 100644 index 987a49f..0000000 Binary files a/iwdification/animations/e0d0/umber09b.wav and /dev/null differ diff --git a/iwdification/animations/e24b/bf_md01.wav b/iwdification/animations/e24b/bf_md01.wav deleted file mode 100644 index 64f5174..0000000 Binary files a/iwdification/animations/e24b/bf_md01.wav and /dev/null differ diff --git a/iwdification/animations/e24b/bf_md02.wav b/iwdification/animations/e24b/bf_md02.wav deleted file mode 100644 index 441c655..0000000 Binary files a/iwdification/animations/e24b/bf_md02.wav and /dev/null differ diff --git a/iwdification/animations/e24b/bf_md03.wav b/iwdification/animations/e24b/bf_md03.wav deleted file mode 100644 index 714b141..0000000 Binary files a/iwdification/animations/e24b/bf_md03.wav and /dev/null differ diff --git a/iwdification/animations/e24b/earth08.wav b/iwdification/animations/e24b/earth08.wav deleted file mode 100644 index 0642d1f..0000000 Binary files a/iwdification/animations/e24b/earth08.wav and /dev/null differ diff --git a/iwdification/animations/e24b/earth09.wav b/iwdification/animations/e24b/earth09.wav deleted file mode 100644 index 6991425..0000000 Binary files a/iwdification/animations/e24b/earth09.wav and /dev/null differ diff --git a/iwdification/animations/e24b/melea1.bam b/iwdification/animations/e24b/melea1.bam deleted file mode 100644 index a76803d..0000000 Binary files a/iwdification/animations/e24b/melea1.bam and /dev/null differ diff --git a/iwdification/animations/e24b/melea1e.bam b/iwdification/animations/e24b/melea1e.bam deleted file mode 100644 index dc8083d..0000000 Binary files a/iwdification/animations/e24b/melea1e.bam and /dev/null differ diff --git a/iwdification/animations/e24b/melea2.bam b/iwdification/animations/e24b/melea2.bam deleted file mode 100644 index 2246e22..0000000 Binary files a/iwdification/animations/e24b/melea2.bam and /dev/null differ diff --git a/iwdification/animations/e24b/melea2e.bam b/iwdification/animations/e24b/melea2e.bam deleted file mode 100644 index b387cd9..0000000 Binary files a/iwdification/animations/e24b/melea2e.bam and /dev/null differ diff --git a/iwdification/animations/e24b/meleca.bam b/iwdification/animations/e24b/meleca.bam deleted file mode 100644 index 2246e22..0000000 Binary files a/iwdification/animations/e24b/meleca.bam and /dev/null differ diff --git a/iwdification/animations/e24b/melecae.bam b/iwdification/animations/e24b/melecae.bam deleted file mode 100644 index b387cd9..0000000 Binary files a/iwdification/animations/e24b/melecae.bam and /dev/null differ diff --git a/iwdification/animations/e24b/melede.bam b/iwdification/animations/e24b/melede.bam deleted file mode 100644 index 8aef735..0000000 Binary files a/iwdification/animations/e24b/melede.bam and /dev/null differ diff --git a/iwdification/animations/e24b/meledee.bam b/iwdification/animations/e24b/meledee.bam deleted file mode 100644 index 1f0a1a6..0000000 Binary files a/iwdification/animations/e24b/meledee.bam and /dev/null differ diff --git a/iwdification/animations/e24b/melegh.bam b/iwdification/animations/e24b/melegh.bam deleted file mode 100644 index acdfe83..0000000 Binary files a/iwdification/animations/e24b/melegh.bam and /dev/null differ diff --git a/iwdification/animations/e24b/meleghe.bam b/iwdification/animations/e24b/meleghe.bam deleted file mode 100644 index 961c9ea..0000000 Binary files a/iwdification/animations/e24b/meleghe.bam and /dev/null differ diff --git a/iwdification/animations/e24b/melegu.bam b/iwdification/animations/e24b/melegu.bam deleted file mode 100644 index 3265c48..0000000 Binary files a/iwdification/animations/e24b/melegu.bam and /dev/null differ diff --git a/iwdification/animations/e24b/melegue.bam b/iwdification/animations/e24b/melegue.bam deleted file mode 100644 index 2d8e455..0000000 Binary files a/iwdification/animations/e24b/melegue.bam and /dev/null differ diff --git a/iwdification/animations/e24b/melesc.bam b/iwdification/animations/e24b/melesc.bam deleted file mode 100644 index d1b81a4..0000000 Binary files a/iwdification/animations/e24b/melesc.bam and /dev/null differ diff --git a/iwdification/animations/e24b/melesce.bam b/iwdification/animations/e24b/melesce.bam deleted file mode 100644 index 20b89b8..0000000 Binary files a/iwdification/animations/e24b/melesce.bam and /dev/null differ diff --git a/iwdification/animations/e24b/melesd.bam b/iwdification/animations/e24b/melesd.bam deleted file mode 100644 index eb36c40..0000000 Binary files a/iwdification/animations/e24b/melesd.bam and /dev/null differ diff --git a/iwdification/animations/e24b/melesde.bam b/iwdification/animations/e24b/melesde.bam deleted file mode 100644 index b22f563..0000000 Binary files a/iwdification/animations/e24b/melesde.bam and /dev/null differ diff --git a/iwdification/animations/e24b/melesl.bam b/iwdification/animations/e24b/melesl.bam deleted file mode 100644 index 74be90c..0000000 Binary files a/iwdification/animations/e24b/melesl.bam and /dev/null differ diff --git a/iwdification/animations/e24b/melesle.bam b/iwdification/animations/e24b/melesle.bam deleted file mode 100644 index c400e74..0000000 Binary files a/iwdification/animations/e24b/melesle.bam and /dev/null differ diff --git a/iwdification/animations/e24b/melesp.bam b/iwdification/animations/e24b/melesp.bam deleted file mode 100644 index d1b81a4..0000000 Binary files a/iwdification/animations/e24b/melesp.bam and /dev/null differ diff --git a/iwdification/animations/e24b/melespe.bam b/iwdification/animations/e24b/melespe.bam deleted file mode 100644 index 20b89b8..0000000 Binary files a/iwdification/animations/e24b/melespe.bam and /dev/null differ diff --git a/iwdification/animations/e24b/meletw.bam b/iwdification/animations/e24b/meletw.bam deleted file mode 100644 index 5d869a5..0000000 Binary files a/iwdification/animations/e24b/meletw.bam and /dev/null differ diff --git a/iwdification/animations/e24b/meletwe.bam b/iwdification/animations/e24b/meletwe.bam deleted file mode 100644 index d53c9b1..0000000 Binary files a/iwdification/animations/e24b/meletwe.bam and /dev/null differ diff --git a/iwdification/animations/e24b/melewk.bam b/iwdification/animations/e24b/melewk.bam deleted file mode 100644 index d40586f..0000000 Binary files a/iwdification/animations/e24b/melewk.bam and /dev/null differ diff --git a/iwdification/animations/e24b/melewke.bam b/iwdification/animations/e24b/melewke.bam deleted file mode 100644 index 00646c0..0000000 Binary files a/iwdification/animations/e24b/melewke.bam and /dev/null differ diff --git a/iwdification/animations/e24c/bf_md01.wav b/iwdification/animations/e24c/bf_md01.wav deleted file mode 100644 index 64f5174..0000000 Binary files a/iwdification/animations/e24c/bf_md01.wav and /dev/null differ diff --git a/iwdification/animations/e24c/bf_md02.wav b/iwdification/animations/e24c/bf_md02.wav deleted file mode 100644 index 441c655..0000000 Binary files a/iwdification/animations/e24c/bf_md02.wav and /dev/null differ diff --git a/iwdification/animations/e24c/bf_md03.wav b/iwdification/animations/e24c/bf_md03.wav deleted file mode 100644 index 714b141..0000000 Binary files a/iwdification/animations/e24c/bf_md03.wav and /dev/null differ diff --git a/iwdification/animations/e24c/fire01a.wav b/iwdification/animations/e24c/fire01a.wav deleted file mode 100644 index 5a7ec7d..0000000 Binary files a/iwdification/animations/e24c/fire01a.wav and /dev/null differ diff --git a/iwdification/animations/e24c/fire01b.wav b/iwdification/animations/e24c/fire01b.wav deleted file mode 100644 index bd75bd0..0000000 Binary files a/iwdification/animations/e24c/fire01b.wav and /dev/null differ diff --git a/iwdification/animations/e24c/fire02a.wav b/iwdification/animations/e24c/fire02a.wav deleted file mode 100644 index 761d96e..0000000 Binary files a/iwdification/animations/e24c/fire02a.wav and /dev/null differ diff --git a/iwdification/animations/e24c/fire03a.wav b/iwdification/animations/e24c/fire03a.wav deleted file mode 100644 index 990de38..0000000 Binary files a/iwdification/animations/e24c/fire03a.wav and /dev/null differ diff --git a/iwdification/animations/e24c/fire03b.wav b/iwdification/animations/e24c/fire03b.wav deleted file mode 100644 index 4889101..0000000 Binary files a/iwdification/animations/e24c/fire03b.wav and /dev/null differ diff --git a/iwdification/animations/e24c/fire04a.wav b/iwdification/animations/e24c/fire04a.wav deleted file mode 100644 index d516efc..0000000 Binary files a/iwdification/animations/e24c/fire04a.wav and /dev/null differ diff --git a/iwdification/animations/e24c/fire04b.wav b/iwdification/animations/e24c/fire04b.wav deleted file mode 100644 index 4ab1760..0000000 Binary files a/iwdification/animations/e24c/fire04b.wav and /dev/null differ diff --git a/iwdification/animations/e24c/fire07a.wav b/iwdification/animations/e24c/fire07a.wav deleted file mode 100644 index 7dfdc8c..0000000 Binary files a/iwdification/animations/e24c/fire07a.wav and /dev/null differ diff --git a/iwdification/animations/e24c/fire07b.wav b/iwdification/animations/e24c/fire07b.wav deleted file mode 100644 index 52f780b..0000000 Binary files a/iwdification/animations/e24c/fire07b.wav and /dev/null differ diff --git a/iwdification/animations/e24c/fire08a.wav b/iwdification/animations/e24c/fire08a.wav deleted file mode 100644 index 69f8500..0000000 Binary files a/iwdification/animations/e24c/fire08a.wav and /dev/null differ diff --git a/iwdification/animations/e24c/fire09a.wav b/iwdification/animations/e24c/fire09a.wav deleted file mode 100644 index 5aa61cd..0000000 Binary files a/iwdification/animations/e24c/fire09a.wav and /dev/null differ diff --git a/iwdification/animations/e24c/fire09b.wav b/iwdification/animations/e24c/fire09b.wav deleted file mode 100644 index 3535424..0000000 Binary files a/iwdification/animations/e24c/fire09b.wav and /dev/null differ diff --git a/iwdification/animations/e24c/fire10a.wav b/iwdification/animations/e24c/fire10a.wav deleted file mode 100644 index 6964722..0000000 Binary files a/iwdification/animations/e24c/fire10a.wav and /dev/null differ diff --git a/iwdification/animations/e24c/melfa1.bam b/iwdification/animations/e24c/melfa1.bam deleted file mode 100644 index 6a15e2a..0000000 Binary files a/iwdification/animations/e24c/melfa1.bam and /dev/null differ diff --git a/iwdification/animations/e24c/melfa1e.bam b/iwdification/animations/e24c/melfa1e.bam deleted file mode 100644 index 00208bf..0000000 Binary files a/iwdification/animations/e24c/melfa1e.bam and /dev/null differ diff --git a/iwdification/animations/e24c/melfa2.bam b/iwdification/animations/e24c/melfa2.bam deleted file mode 100644 index 92a8354..0000000 Binary files a/iwdification/animations/e24c/melfa2.bam and /dev/null differ diff --git a/iwdification/animations/e24c/melfa2e.bam b/iwdification/animations/e24c/melfa2e.bam deleted file mode 100644 index 0f30ddb..0000000 Binary files a/iwdification/animations/e24c/melfa2e.bam and /dev/null differ diff --git a/iwdification/animations/e24c/melfca.bam b/iwdification/animations/e24c/melfca.bam deleted file mode 100644 index 92a8354..0000000 Binary files a/iwdification/animations/e24c/melfca.bam and /dev/null differ diff --git a/iwdification/animations/e24c/melfcae.bam b/iwdification/animations/e24c/melfcae.bam deleted file mode 100644 index 0f30ddb..0000000 Binary files a/iwdification/animations/e24c/melfcae.bam and /dev/null differ diff --git a/iwdification/animations/e24c/melfde.bam b/iwdification/animations/e24c/melfde.bam deleted file mode 100644 index 0186027..0000000 Binary files a/iwdification/animations/e24c/melfde.bam and /dev/null differ diff --git a/iwdification/animations/e24c/melfdee.bam b/iwdification/animations/e24c/melfdee.bam deleted file mode 100644 index aac1737..0000000 Binary files a/iwdification/animations/e24c/melfdee.bam and /dev/null differ diff --git a/iwdification/animations/e24c/melfgh.bam b/iwdification/animations/e24c/melfgh.bam deleted file mode 100644 index e9ed24b..0000000 Binary files a/iwdification/animations/e24c/melfgh.bam and /dev/null differ diff --git a/iwdification/animations/e24c/melfghe.bam b/iwdification/animations/e24c/melfghe.bam deleted file mode 100644 index 6dad77f..0000000 Binary files a/iwdification/animations/e24c/melfghe.bam and /dev/null differ diff --git a/iwdification/animations/e24c/melfgu.bam b/iwdification/animations/e24c/melfgu.bam deleted file mode 100644 index b210329..0000000 Binary files a/iwdification/animations/e24c/melfgu.bam and /dev/null differ diff --git a/iwdification/animations/e24c/melfgue.bam b/iwdification/animations/e24c/melfgue.bam deleted file mode 100644 index 1264a98..0000000 Binary files a/iwdification/animations/e24c/melfgue.bam and /dev/null differ diff --git a/iwdification/animations/e24c/melfsc.bam b/iwdification/animations/e24c/melfsc.bam deleted file mode 100644 index af6fa09..0000000 Binary files a/iwdification/animations/e24c/melfsc.bam and /dev/null differ diff --git a/iwdification/animations/e24c/melfsce.bam b/iwdification/animations/e24c/melfsce.bam deleted file mode 100644 index 5d61cd8..0000000 Binary files a/iwdification/animations/e24c/melfsce.bam and /dev/null differ diff --git a/iwdification/animations/e24c/melfsd.bam b/iwdification/animations/e24c/melfsd.bam deleted file mode 100644 index 7a961f0..0000000 Binary files a/iwdification/animations/e24c/melfsd.bam and /dev/null differ diff --git a/iwdification/animations/e24c/melfsde.bam b/iwdification/animations/e24c/melfsde.bam deleted file mode 100644 index c6a6d40..0000000 Binary files a/iwdification/animations/e24c/melfsde.bam and /dev/null differ diff --git a/iwdification/animations/e24c/melfsl.bam b/iwdification/animations/e24c/melfsl.bam deleted file mode 100644 index 9944645..0000000 Binary files a/iwdification/animations/e24c/melfsl.bam and /dev/null differ diff --git a/iwdification/animations/e24c/melfsle.bam b/iwdification/animations/e24c/melfsle.bam deleted file mode 100644 index edd1203..0000000 Binary files a/iwdification/animations/e24c/melfsle.bam and /dev/null differ diff --git a/iwdification/animations/e24c/melfsp.bam b/iwdification/animations/e24c/melfsp.bam deleted file mode 100644 index af6fa09..0000000 Binary files a/iwdification/animations/e24c/melfsp.bam and /dev/null differ diff --git a/iwdification/animations/e24c/melfspe.bam b/iwdification/animations/e24c/melfspe.bam deleted file mode 100644 index 5d61cd8..0000000 Binary files a/iwdification/animations/e24c/melfspe.bam and /dev/null differ diff --git a/iwdification/animations/e24c/melftw.bam b/iwdification/animations/e24c/melftw.bam deleted file mode 100644 index f524720..0000000 Binary files a/iwdification/animations/e24c/melftw.bam and /dev/null differ diff --git a/iwdification/animations/e24c/melftwe.bam b/iwdification/animations/e24c/melftwe.bam deleted file mode 100644 index 12d9d62..0000000 Binary files a/iwdification/animations/e24c/melftwe.bam and /dev/null differ diff --git a/iwdification/animations/e24c/melfwk.bam b/iwdification/animations/e24c/melfwk.bam deleted file mode 100644 index 53b91d2..0000000 Binary files a/iwdification/animations/e24c/melfwk.bam and /dev/null differ diff --git a/iwdification/animations/e24c/melfwke.bam b/iwdification/animations/e24c/melfwke.bam deleted file mode 100644 index d070345..0000000 Binary files a/iwdification/animations/e24c/melfwke.bam and /dev/null differ diff --git a/iwdification/animations/e24d/bf_md01.wav b/iwdification/animations/e24d/bf_md01.wav deleted file mode 100644 index 64f5174..0000000 Binary files a/iwdification/animations/e24d/bf_md01.wav and /dev/null differ diff --git a/iwdification/animations/e24d/bf_md02.wav b/iwdification/animations/e24d/bf_md02.wav deleted file mode 100644 index 441c655..0000000 Binary files a/iwdification/animations/e24d/bf_md02.wav and /dev/null differ diff --git a/iwdification/animations/e24d/bf_md03.wav b/iwdification/animations/e24d/bf_md03.wav deleted file mode 100644 index 714b141..0000000 Binary files a/iwdification/animations/e24d/bf_md03.wav and /dev/null differ diff --git a/iwdification/animations/e24d/melwa1.bam b/iwdification/animations/e24d/melwa1.bam deleted file mode 100644 index 98414d1..0000000 Binary files a/iwdification/animations/e24d/melwa1.bam and /dev/null differ diff --git a/iwdification/animations/e24d/melwa1e.bam b/iwdification/animations/e24d/melwa1e.bam deleted file mode 100644 index 815c6e9..0000000 Binary files a/iwdification/animations/e24d/melwa1e.bam and /dev/null differ diff --git a/iwdification/animations/e24d/melwa2.bam b/iwdification/animations/e24d/melwa2.bam deleted file mode 100644 index ca4fb4a..0000000 Binary files a/iwdification/animations/e24d/melwa2.bam and /dev/null differ diff --git a/iwdification/animations/e24d/melwa2e.bam b/iwdification/animations/e24d/melwa2e.bam deleted file mode 100644 index 92742e2..0000000 Binary files a/iwdification/animations/e24d/melwa2e.bam and /dev/null differ diff --git a/iwdification/animations/e24d/melwca.bam b/iwdification/animations/e24d/melwca.bam deleted file mode 100644 index 98414d1..0000000 Binary files a/iwdification/animations/e24d/melwca.bam and /dev/null differ diff --git a/iwdification/animations/e24d/melwcae.bam b/iwdification/animations/e24d/melwcae.bam deleted file mode 100644 index 815c6e9..0000000 Binary files a/iwdification/animations/e24d/melwcae.bam and /dev/null differ diff --git a/iwdification/animations/e24d/melwde.bam b/iwdification/animations/e24d/melwde.bam deleted file mode 100644 index 13b3c2a..0000000 Binary files a/iwdification/animations/e24d/melwde.bam and /dev/null differ diff --git a/iwdification/animations/e24d/melwdee.bam b/iwdification/animations/e24d/melwdee.bam deleted file mode 100644 index 9f5c2e1..0000000 Binary files a/iwdification/animations/e24d/melwdee.bam and /dev/null differ diff --git a/iwdification/animations/e24d/melwgh.bam b/iwdification/animations/e24d/melwgh.bam deleted file mode 100644 index 593a1c1..0000000 Binary files a/iwdification/animations/e24d/melwgh.bam and /dev/null differ diff --git a/iwdification/animations/e24d/melwghe.bam b/iwdification/animations/e24d/melwghe.bam deleted file mode 100644 index 453208a..0000000 Binary files a/iwdification/animations/e24d/melwghe.bam and /dev/null differ diff --git a/iwdification/animations/e24d/melwgu.bam b/iwdification/animations/e24d/melwgu.bam deleted file mode 100644 index ee53216..0000000 Binary files a/iwdification/animations/e24d/melwgu.bam and /dev/null differ diff --git a/iwdification/animations/e24d/melwgue.bam b/iwdification/animations/e24d/melwgue.bam deleted file mode 100644 index 938c579..0000000 Binary files a/iwdification/animations/e24d/melwgue.bam and /dev/null differ diff --git a/iwdification/animations/e24d/melwsc.bam b/iwdification/animations/e24d/melwsc.bam deleted file mode 100644 index bc356e7..0000000 Binary files a/iwdification/animations/e24d/melwsc.bam and /dev/null differ diff --git a/iwdification/animations/e24d/melwsce.bam b/iwdification/animations/e24d/melwsce.bam deleted file mode 100644 index 4916412..0000000 Binary files a/iwdification/animations/e24d/melwsce.bam and /dev/null differ diff --git a/iwdification/animations/e24d/melwsd.bam b/iwdification/animations/e24d/melwsd.bam deleted file mode 100644 index 163d91e..0000000 Binary files a/iwdification/animations/e24d/melwsd.bam and /dev/null differ diff --git a/iwdification/animations/e24d/melwsde.bam b/iwdification/animations/e24d/melwsde.bam deleted file mode 100644 index e10ecc5..0000000 Binary files a/iwdification/animations/e24d/melwsde.bam and /dev/null differ diff --git a/iwdification/animations/e24d/melwsl.bam b/iwdification/animations/e24d/melwsl.bam deleted file mode 100644 index a78a3cd..0000000 Binary files a/iwdification/animations/e24d/melwsl.bam and /dev/null differ diff --git a/iwdification/animations/e24d/melwsle.bam b/iwdification/animations/e24d/melwsle.bam deleted file mode 100644 index 088c387..0000000 Binary files a/iwdification/animations/e24d/melwsle.bam and /dev/null differ diff --git a/iwdification/animations/e24d/melwsp.bam b/iwdification/animations/e24d/melwsp.bam deleted file mode 100644 index bc356e7..0000000 Binary files a/iwdification/animations/e24d/melwsp.bam and /dev/null differ diff --git a/iwdification/animations/e24d/melwspe.bam b/iwdification/animations/e24d/melwspe.bam deleted file mode 100644 index 4916412..0000000 Binary files a/iwdification/animations/e24d/melwspe.bam and /dev/null differ diff --git a/iwdification/animations/e24d/melwtw.bam b/iwdification/animations/e24d/melwtw.bam deleted file mode 100644 index 026a0a4..0000000 Binary files a/iwdification/animations/e24d/melwtw.bam and /dev/null differ diff --git a/iwdification/animations/e24d/melwtwe.bam b/iwdification/animations/e24d/melwtwe.bam deleted file mode 100644 index 080959c..0000000 Binary files a/iwdification/animations/e24d/melwtwe.bam and /dev/null differ diff --git a/iwdification/animations/e24d/melwwk.bam b/iwdification/animations/e24d/melwwk.bam deleted file mode 100644 index 2758a47..0000000 Binary files a/iwdification/animations/e24d/melwwk.bam and /dev/null differ diff --git a/iwdification/animations/e24d/melwwke.bam b/iwdification/animations/e24d/melwwke.bam deleted file mode 100644 index c49b26f..0000000 Binary files a/iwdification/animations/e24d/melwwke.bam and /dev/null differ diff --git a/iwdification/animations/e24d/watere01.wav b/iwdification/animations/e24d/watere01.wav deleted file mode 100644 index f602283..0000000 Binary files a/iwdification/animations/e24d/watere01.wav and /dev/null differ diff --git a/iwdification/animations/e24d/watere02.wav b/iwdification/animations/e24d/watere02.wav deleted file mode 100644 index a8996a5..0000000 Binary files a/iwdification/animations/e24d/watere02.wav and /dev/null differ diff --git a/iwdification/animations/e24d/watere03.wav b/iwdification/animations/e24d/watere03.wav deleted file mode 100644 index 290f36f..0000000 Binary files a/iwdification/animations/e24d/watere03.wav and /dev/null differ diff --git a/iwdification/animations/e24d/watere04.wav b/iwdification/animations/e24d/watere04.wav deleted file mode 100644 index d3d5afc..0000000 Binary files a/iwdification/animations/e24d/watere04.wav and /dev/null differ diff --git a/iwdification/animations/e24d/watere07.wav b/iwdification/animations/e24d/watere07.wav deleted file mode 100644 index 67551d4..0000000 Binary files a/iwdification/animations/e24d/watere07.wav and /dev/null differ diff --git a/iwdification/animations/e24d/watere08.wav b/iwdification/animations/e24d/watere08.wav deleted file mode 100644 index b21fff7..0000000 Binary files a/iwdification/animations/e24d/watere08.wav and /dev/null differ diff --git a/iwdification/animations/e24d/watere09.wav b/iwdification/animations/e24d/watere09.wav deleted file mode 100644 index c03b3fa..0000000 Binary files a/iwdification/animations/e24d/watere09.wav and /dev/null differ diff --git a/iwdification/animations/e25d/bf_lg01.wav b/iwdification/animations/e25d/bf_lg01.wav deleted file mode 100644 index 77bf64d..0000000 Binary files a/iwdification/animations/e25d/bf_lg01.wav and /dev/null differ diff --git a/iwdification/animations/e25d/bf_lg02.wav b/iwdification/animations/e25d/bf_lg02.wav deleted file mode 100644 index 75f656c..0000000 Binary files a/iwdification/animations/e25d/bf_lg02.wav and /dev/null differ diff --git a/iwdification/animations/e25d/bf_lg03.wav b/iwdification/animations/e25d/bf_lg03.wav deleted file mode 100644 index a6a95ec..0000000 Binary files a/iwdification/animations/e25d/bf_lg03.wav and /dev/null differ diff --git a/iwdification/animations/e25d/myeta1.bam b/iwdification/animations/e25d/myeta1.bam deleted file mode 100644 index f1386bc..0000000 Binary files a/iwdification/animations/e25d/myeta1.bam and /dev/null differ diff --git a/iwdification/animations/e25d/myeta1e.bam b/iwdification/animations/e25d/myeta1e.bam deleted file mode 100644 index 9627af3..0000000 Binary files a/iwdification/animations/e25d/myeta1e.bam and /dev/null differ diff --git a/iwdification/animations/e25d/myeta2.bam b/iwdification/animations/e25d/myeta2.bam deleted file mode 100644 index fe72dca..0000000 Binary files a/iwdification/animations/e25d/myeta2.bam and /dev/null differ diff --git a/iwdification/animations/e25d/myeta2e.bam b/iwdification/animations/e25d/myeta2e.bam deleted file mode 100644 index e5fa3a2..0000000 Binary files a/iwdification/animations/e25d/myeta2e.bam and /dev/null differ diff --git a/iwdification/animations/e25d/myeta3.bam b/iwdification/animations/e25d/myeta3.bam deleted file mode 100644 index c3f8119..0000000 Binary files a/iwdification/animations/e25d/myeta3.bam and /dev/null differ diff --git a/iwdification/animations/e25d/myeta3e.bam b/iwdification/animations/e25d/myeta3e.bam deleted file mode 100644 index fdbcc49..0000000 Binary files a/iwdification/animations/e25d/myeta3e.bam and /dev/null differ diff --git a/iwdification/animations/e25d/myetca.bam b/iwdification/animations/e25d/myetca.bam deleted file mode 100644 index c3f8119..0000000 Binary files a/iwdification/animations/e25d/myetca.bam and /dev/null differ diff --git a/iwdification/animations/e25d/myetcae.bam b/iwdification/animations/e25d/myetcae.bam deleted file mode 100644 index fdbcc49..0000000 Binary files a/iwdification/animations/e25d/myetcae.bam and /dev/null differ diff --git a/iwdification/animations/e25d/myetde.bam b/iwdification/animations/e25d/myetde.bam deleted file mode 100644 index cb7028e..0000000 Binary files a/iwdification/animations/e25d/myetde.bam and /dev/null differ diff --git a/iwdification/animations/e25d/myetdee.bam b/iwdification/animations/e25d/myetdee.bam deleted file mode 100644 index 3ce9a12..0000000 Binary files a/iwdification/animations/e25d/myetdee.bam and /dev/null differ diff --git a/iwdification/animations/e25d/myetgh.bam b/iwdification/animations/e25d/myetgh.bam deleted file mode 100644 index 96c8d9b..0000000 Binary files a/iwdification/animations/e25d/myetgh.bam and /dev/null differ diff --git a/iwdification/animations/e25d/myetghe.bam b/iwdification/animations/e25d/myetghe.bam deleted file mode 100644 index 4278e68..0000000 Binary files a/iwdification/animations/e25d/myetghe.bam and /dev/null differ diff --git a/iwdification/animations/e25d/myetgu.bam b/iwdification/animations/e25d/myetgu.bam deleted file mode 100644 index fc29346..0000000 Binary files a/iwdification/animations/e25d/myetgu.bam and /dev/null differ diff --git a/iwdification/animations/e25d/myetgue.bam b/iwdification/animations/e25d/myetgue.bam deleted file mode 100644 index 8ab8625..0000000 Binary files a/iwdification/animations/e25d/myetgue.bam and /dev/null differ diff --git a/iwdification/animations/e25d/myetsc.bam b/iwdification/animations/e25d/myetsc.bam deleted file mode 100644 index a716554..0000000 Binary files a/iwdification/animations/e25d/myetsc.bam and /dev/null differ diff --git a/iwdification/animations/e25d/myetsce.bam b/iwdification/animations/e25d/myetsce.bam deleted file mode 100644 index 4c14eca..0000000 Binary files a/iwdification/animations/e25d/myetsce.bam and /dev/null differ diff --git a/iwdification/animations/e25d/myetsd.bam b/iwdification/animations/e25d/myetsd.bam deleted file mode 100644 index de2d6ed..0000000 Binary files a/iwdification/animations/e25d/myetsd.bam and /dev/null differ diff --git a/iwdification/animations/e25d/myetsde.bam b/iwdification/animations/e25d/myetsde.bam deleted file mode 100644 index 67dc12e..0000000 Binary files a/iwdification/animations/e25d/myetsde.bam and /dev/null differ diff --git a/iwdification/animations/e25d/myetsl.bam b/iwdification/animations/e25d/myetsl.bam deleted file mode 100644 index 3b2f6a8..0000000 Binary files a/iwdification/animations/e25d/myetsl.bam and /dev/null differ diff --git a/iwdification/animations/e25d/myetsle.bam b/iwdification/animations/e25d/myetsle.bam deleted file mode 100644 index 6ee9f9c..0000000 Binary files a/iwdification/animations/e25d/myetsle.bam and /dev/null differ diff --git a/iwdification/animations/e25d/myetsp.bam b/iwdification/animations/e25d/myetsp.bam deleted file mode 100644 index a716554..0000000 Binary files a/iwdification/animations/e25d/myetsp.bam and /dev/null differ diff --git a/iwdification/animations/e25d/myetspe.bam b/iwdification/animations/e25d/myetspe.bam deleted file mode 100644 index 4c14eca..0000000 Binary files a/iwdification/animations/e25d/myetspe.bam and /dev/null differ diff --git a/iwdification/animations/e25d/myettw.bam b/iwdification/animations/e25d/myettw.bam deleted file mode 100644 index 43003b4..0000000 Binary files a/iwdification/animations/e25d/myettw.bam and /dev/null differ diff --git a/iwdification/animations/e25d/myettwe.bam b/iwdification/animations/e25d/myettwe.bam deleted file mode 100644 index b5168fb..0000000 Binary files a/iwdification/animations/e25d/myettwe.bam and /dev/null differ diff --git a/iwdification/animations/e25d/myetwk.bam b/iwdification/animations/e25d/myetwk.bam deleted file mode 100644 index 03b7ca2..0000000 Binary files a/iwdification/animations/e25d/myetwk.bam and /dev/null differ diff --git a/iwdification/animations/e25d/myetwke.bam b/iwdification/animations/e25d/myetwke.bam deleted file mode 100644 index 50eb48b..0000000 Binary files a/iwdification/animations/e25d/myetwke.bam and /dev/null differ diff --git a/iwdification/animations/e25d/yeti01.wav b/iwdification/animations/e25d/yeti01.wav deleted file mode 100644 index cb96f2a..0000000 Binary files a/iwdification/animations/e25d/yeti01.wav and /dev/null differ diff --git a/iwdification/animations/e25d/yeti02.wav b/iwdification/animations/e25d/yeti02.wav deleted file mode 100644 index 0db7351..0000000 Binary files a/iwdification/animations/e25d/yeti02.wav and /dev/null differ diff --git a/iwdification/animations/e25d/yeti03.wav b/iwdification/animations/e25d/yeti03.wav deleted file mode 100644 index a61e67e..0000000 Binary files a/iwdification/animations/e25d/yeti03.wav and /dev/null differ diff --git a/iwdification/animations/e25d/yeti04.wav b/iwdification/animations/e25d/yeti04.wav deleted file mode 100644 index 9b1d977..0000000 Binary files a/iwdification/animations/e25d/yeti04.wav and /dev/null differ diff --git a/iwdification/animations/e25d/yeti07.wav b/iwdification/animations/e25d/yeti07.wav deleted file mode 100644 index 57534dc..0000000 Binary files a/iwdification/animations/e25d/yeti07.wav and /dev/null differ diff --git a/iwdification/animations/e25d/yeti08.wav b/iwdification/animations/e25d/yeti08.wav deleted file mode 100644 index c530f8c..0000000 Binary files a/iwdification/animations/e25d/yeti08.wav and /dev/null differ diff --git a/iwdification/animations/e25d/yeti09.wav b/iwdification/animations/e25d/yeti09.wav deleted file mode 100644 index 106f834..0000000 Binary files a/iwdification/animations/e25d/yeti09.wav and /dev/null differ diff --git a/iwdification/animations/e300/ghost01.wav b/iwdification/animations/e300/ghost01.wav deleted file mode 100644 index c5970d9..0000000 Binary files a/iwdification/animations/e300/ghost01.wav and /dev/null differ diff --git a/iwdification/animations/e300/ghost02.wav b/iwdification/animations/e300/ghost02.wav deleted file mode 100644 index 2102f6a..0000000 Binary files a/iwdification/animations/e300/ghost02.wav and /dev/null differ diff --git a/iwdification/animations/e300/ghost03a.wav b/iwdification/animations/e300/ghost03a.wav deleted file mode 100644 index c2ff852..0000000 Binary files a/iwdification/animations/e300/ghost03a.wav and /dev/null differ diff --git a/iwdification/animations/e300/ghost03b.wav b/iwdification/animations/e300/ghost03b.wav deleted file mode 100644 index ee11fdd..0000000 Binary files a/iwdification/animations/e300/ghost03b.wav and /dev/null differ diff --git a/iwdification/animations/e300/ghost04a.wav b/iwdification/animations/e300/ghost04a.wav deleted file mode 100644 index 1c8519f..0000000 Binary files a/iwdification/animations/e300/ghost04a.wav and /dev/null differ diff --git a/iwdification/animations/e300/ghost04b.wav b/iwdification/animations/e300/ghost04b.wav deleted file mode 100644 index 727506d..0000000 Binary files a/iwdification/animations/e300/ghost04b.wav and /dev/null differ diff --git a/iwdification/animations/e300/ghost07a.wav b/iwdification/animations/e300/ghost07a.wav deleted file mode 100644 index 70f87f3..0000000 Binary files a/iwdification/animations/e300/ghost07a.wav and /dev/null differ diff --git a/iwdification/animations/e300/ghost07b.wav b/iwdification/animations/e300/ghost07b.wav deleted file mode 100644 index 08eb418..0000000 Binary files a/iwdification/animations/e300/ghost07b.wav and /dev/null differ diff --git a/iwdification/animations/e300/ghost08a.wav b/iwdification/animations/e300/ghost08a.wav deleted file mode 100644 index b14e869..0000000 Binary files a/iwdification/animations/e300/ghost08a.wav and /dev/null differ diff --git a/iwdification/animations/e300/ghost09a.wav b/iwdification/animations/e300/ghost09a.wav deleted file mode 100644 index d3f29b0..0000000 Binary files a/iwdification/animations/e300/ghost09a.wav and /dev/null differ diff --git a/iwdification/animations/e300/ghost09b.wav b/iwdification/animations/e300/ghost09b.wav deleted file mode 100644 index d15b688..0000000 Binary files a/iwdification/animations/e300/ghost09b.wav and /dev/null differ diff --git a/iwdification/animations/e300/ghost10a.wav b/iwdification/animations/e300/ghost10a.wav deleted file mode 100644 index 354930d..0000000 Binary files a/iwdification/animations/e300/ghost10a.wav and /dev/null differ diff --git a/iwdification/animations/e300/mghoa1.bam b/iwdification/animations/e300/mghoa1.bam deleted file mode 100644 index 2a170f0..0000000 Binary files a/iwdification/animations/e300/mghoa1.bam and /dev/null differ diff --git a/iwdification/animations/e300/mghoa1e.bam b/iwdification/animations/e300/mghoa1e.bam deleted file mode 100644 index b14411f..0000000 Binary files a/iwdification/animations/e300/mghoa1e.bam and /dev/null differ diff --git a/iwdification/animations/e300/mghoa2.bam b/iwdification/animations/e300/mghoa2.bam deleted file mode 100644 index 8d6ae49..0000000 Binary files a/iwdification/animations/e300/mghoa2.bam and /dev/null differ diff --git a/iwdification/animations/e300/mghoa2e.bam b/iwdification/animations/e300/mghoa2e.bam deleted file mode 100644 index 4bb475e..0000000 Binary files a/iwdification/animations/e300/mghoa2e.bam and /dev/null differ diff --git a/iwdification/animations/e300/mghoca.bam b/iwdification/animations/e300/mghoca.bam deleted file mode 100644 index 2a170f0..0000000 Binary files a/iwdification/animations/e300/mghoca.bam and /dev/null differ diff --git a/iwdification/animations/e300/mghocae.bam b/iwdification/animations/e300/mghocae.bam deleted file mode 100644 index b14411f..0000000 Binary files a/iwdification/animations/e300/mghocae.bam and /dev/null differ diff --git a/iwdification/animations/e300/mghode.bam b/iwdification/animations/e300/mghode.bam deleted file mode 100644 index 75eb74a..0000000 Binary files a/iwdification/animations/e300/mghode.bam and /dev/null differ diff --git a/iwdification/animations/e300/mghodee.bam b/iwdification/animations/e300/mghodee.bam deleted file mode 100644 index fcbf379..0000000 Binary files a/iwdification/animations/e300/mghodee.bam and /dev/null differ diff --git a/iwdification/animations/e300/mghogh.bam b/iwdification/animations/e300/mghogh.bam deleted file mode 100644 index 76aaabd..0000000 Binary files a/iwdification/animations/e300/mghogh.bam and /dev/null differ diff --git a/iwdification/animations/e300/mghoghe.bam b/iwdification/animations/e300/mghoghe.bam deleted file mode 100644 index d59a7ed..0000000 Binary files a/iwdification/animations/e300/mghoghe.bam and /dev/null differ diff --git a/iwdification/animations/e300/mghogu.bam b/iwdification/animations/e300/mghogu.bam deleted file mode 100644 index 7bd3698..0000000 Binary files a/iwdification/animations/e300/mghogu.bam and /dev/null differ diff --git a/iwdification/animations/e300/mghogue.bam b/iwdification/animations/e300/mghogue.bam deleted file mode 100644 index 605c808..0000000 Binary files a/iwdification/animations/e300/mghogue.bam and /dev/null differ diff --git a/iwdification/animations/e300/mghosc.bam b/iwdification/animations/e300/mghosc.bam deleted file mode 100644 index 66dce52..0000000 Binary files a/iwdification/animations/e300/mghosc.bam and /dev/null differ diff --git a/iwdification/animations/e300/mghosce.bam b/iwdification/animations/e300/mghosce.bam deleted file mode 100644 index 4f0341c..0000000 Binary files a/iwdification/animations/e300/mghosce.bam and /dev/null differ diff --git a/iwdification/animations/e300/mghosd.bam b/iwdification/animations/e300/mghosd.bam deleted file mode 100644 index 74fecde..0000000 Binary files a/iwdification/animations/e300/mghosd.bam and /dev/null differ diff --git a/iwdification/animations/e300/mghosde.bam b/iwdification/animations/e300/mghosde.bam deleted file mode 100644 index 8a65010..0000000 Binary files a/iwdification/animations/e300/mghosde.bam and /dev/null differ diff --git a/iwdification/animations/e300/mghosl.bam b/iwdification/animations/e300/mghosl.bam deleted file mode 100644 index 5a775cc..0000000 Binary files a/iwdification/animations/e300/mghosl.bam and /dev/null differ diff --git a/iwdification/animations/e300/mghosle.bam b/iwdification/animations/e300/mghosle.bam deleted file mode 100644 index adfff36..0000000 Binary files a/iwdification/animations/e300/mghosle.bam and /dev/null differ diff --git a/iwdification/animations/e300/mghosp.bam b/iwdification/animations/e300/mghosp.bam deleted file mode 100644 index 66dce52..0000000 Binary files a/iwdification/animations/e300/mghosp.bam and /dev/null differ diff --git a/iwdification/animations/e300/mghospe.bam b/iwdification/animations/e300/mghospe.bam deleted file mode 100644 index 4f0341c..0000000 Binary files a/iwdification/animations/e300/mghospe.bam and /dev/null differ diff --git a/iwdification/animations/e300/mghotw.bam b/iwdification/animations/e300/mghotw.bam deleted file mode 100644 index 026a0a4..0000000 Binary files a/iwdification/animations/e300/mghotw.bam and /dev/null differ diff --git a/iwdification/animations/e300/mghotwe.bam b/iwdification/animations/e300/mghotwe.bam deleted file mode 100644 index 080959c..0000000 Binary files a/iwdification/animations/e300/mghotwe.bam and /dev/null differ diff --git a/iwdification/animations/e300/mghowk.bam b/iwdification/animations/e300/mghowk.bam deleted file mode 100644 index 18aab3b..0000000 Binary files a/iwdification/animations/e300/mghowk.bam and /dev/null differ diff --git a/iwdification/animations/e300/mghowke.bam b/iwdification/animations/e300/mghowke.bam deleted file mode 100644 index c2b0551..0000000 Binary files a/iwdification/animations/e300/mghowke.bam and /dev/null differ diff --git a/iwdification/animations/e320/bf_sm01.wav b/iwdification/animations/e320/bf_sm01.wav deleted file mode 100644 index 2bc0729..0000000 Binary files a/iwdification/animations/e320/bf_sm01.wav and /dev/null differ diff --git a/iwdification/animations/e320/bf_sm02.wav b/iwdification/animations/e320/bf_sm02.wav deleted file mode 100644 index 24092dd..0000000 Binary files a/iwdification/animations/e320/bf_sm02.wav and /dev/null differ diff --git a/iwdification/animations/e320/bf_sm03.wav b/iwdification/animations/e320/bf_sm03.wav deleted file mode 100644 index 6450527..0000000 Binary files a/iwdification/animations/e320/bf_sm03.wav and /dev/null differ diff --git a/iwdification/animations/e320/ghoul03a.wav b/iwdification/animations/e320/ghoul03a.wav deleted file mode 100644 index 6cac5e9..0000000 Binary files a/iwdification/animations/e320/ghoul03a.wav and /dev/null differ diff --git a/iwdification/animations/e320/ghoul03b.wav b/iwdification/animations/e320/ghoul03b.wav deleted file mode 100644 index 97d0019..0000000 Binary files a/iwdification/animations/e320/ghoul03b.wav and /dev/null differ diff --git a/iwdification/animations/e320/ghoul04a.wav b/iwdification/animations/e320/ghoul04a.wav deleted file mode 100644 index 9b27843..0000000 Binary files a/iwdification/animations/e320/ghoul04a.wav and /dev/null differ diff --git a/iwdification/animations/e320/ghoul04b.wav b/iwdification/animations/e320/ghoul04b.wav deleted file mode 100644 index 2fea183..0000000 Binary files a/iwdification/animations/e320/ghoul04b.wav and /dev/null differ diff --git a/iwdification/animations/e320/ghoul07.wav b/iwdification/animations/e320/ghoul07.wav deleted file mode 100644 index c1ba359..0000000 Binary files a/iwdification/animations/e320/ghoul07.wav and /dev/null differ diff --git a/iwdification/animations/e320/ghoul10.wav b/iwdification/animations/e320/ghoul10.wav deleted file mode 100644 index 9826e89..0000000 Binary files a/iwdification/animations/e320/ghoul10.wav and /dev/null differ diff --git a/iwdification/animations/e320/mgh3a1.bam b/iwdification/animations/e320/mgh3a1.bam deleted file mode 100644 index 2f4c6d2..0000000 Binary files a/iwdification/animations/e320/mgh3a1.bam and /dev/null differ diff --git a/iwdification/animations/e320/mgh3a1e.bam b/iwdification/animations/e320/mgh3a1e.bam deleted file mode 100644 index 10fda37..0000000 Binary files a/iwdification/animations/e320/mgh3a1e.bam and /dev/null differ diff --git a/iwdification/animations/e320/mgh3a2.bam b/iwdification/animations/e320/mgh3a2.bam deleted file mode 100644 index 4567d1f..0000000 Binary files a/iwdification/animations/e320/mgh3a2.bam and /dev/null differ diff --git a/iwdification/animations/e320/mgh3a2e.bam b/iwdification/animations/e320/mgh3a2e.bam deleted file mode 100644 index 759a181..0000000 Binary files a/iwdification/animations/e320/mgh3a2e.bam and /dev/null differ diff --git a/iwdification/animations/e320/mgh3ca.bam b/iwdification/animations/e320/mgh3ca.bam deleted file mode 100644 index 2f4c6d2..0000000 Binary files a/iwdification/animations/e320/mgh3ca.bam and /dev/null differ diff --git a/iwdification/animations/e320/mgh3cae.bam b/iwdification/animations/e320/mgh3cae.bam deleted file mode 100644 index 10fda37..0000000 Binary files a/iwdification/animations/e320/mgh3cae.bam and /dev/null differ diff --git a/iwdification/animations/e320/mgh3de.bam b/iwdification/animations/e320/mgh3de.bam deleted file mode 100644 index b00d8e3..0000000 Binary files a/iwdification/animations/e320/mgh3de.bam and /dev/null differ diff --git a/iwdification/animations/e320/mgh3dee.bam b/iwdification/animations/e320/mgh3dee.bam deleted file mode 100644 index cff8032..0000000 Binary files a/iwdification/animations/e320/mgh3dee.bam and /dev/null differ diff --git a/iwdification/animations/e320/mgh3gh.bam b/iwdification/animations/e320/mgh3gh.bam deleted file mode 100644 index 9ab8a2a..0000000 Binary files a/iwdification/animations/e320/mgh3gh.bam and /dev/null differ diff --git a/iwdification/animations/e320/mgh3ghe.bam b/iwdification/animations/e320/mgh3ghe.bam deleted file mode 100644 index 194a5f8..0000000 Binary files a/iwdification/animations/e320/mgh3ghe.bam and /dev/null differ diff --git a/iwdification/animations/e320/mgh3gu.bam b/iwdification/animations/e320/mgh3gu.bam deleted file mode 100644 index 3a392fd..0000000 Binary files a/iwdification/animations/e320/mgh3gu.bam and /dev/null differ diff --git a/iwdification/animations/e320/mgh3gue.bam b/iwdification/animations/e320/mgh3gue.bam deleted file mode 100644 index 9d28fb3..0000000 Binary files a/iwdification/animations/e320/mgh3gue.bam and /dev/null differ diff --git a/iwdification/animations/e320/mgh3sc.bam b/iwdification/animations/e320/mgh3sc.bam deleted file mode 100644 index a4b8c42..0000000 Binary files a/iwdification/animations/e320/mgh3sc.bam and /dev/null differ diff --git a/iwdification/animations/e320/mgh3sce.bam b/iwdification/animations/e320/mgh3sce.bam deleted file mode 100644 index 4dbd9eb..0000000 Binary files a/iwdification/animations/e320/mgh3sce.bam and /dev/null differ diff --git a/iwdification/animations/e320/mgh3sd.bam b/iwdification/animations/e320/mgh3sd.bam deleted file mode 100644 index 6b4bbb7..0000000 Binary files a/iwdification/animations/e320/mgh3sd.bam and /dev/null differ diff --git a/iwdification/animations/e320/mgh3sde.bam b/iwdification/animations/e320/mgh3sde.bam deleted file mode 100644 index b1e3e18..0000000 Binary files a/iwdification/animations/e320/mgh3sde.bam and /dev/null differ diff --git a/iwdification/animations/e320/mgh3sl.bam b/iwdification/animations/e320/mgh3sl.bam deleted file mode 100644 index ffb8ce1..0000000 Binary files a/iwdification/animations/e320/mgh3sl.bam and /dev/null differ diff --git a/iwdification/animations/e320/mgh3sle.bam b/iwdification/animations/e320/mgh3sle.bam deleted file mode 100644 index dd2186f..0000000 Binary files a/iwdification/animations/e320/mgh3sle.bam and /dev/null differ diff --git a/iwdification/animations/e320/mgh3sp.bam b/iwdification/animations/e320/mgh3sp.bam deleted file mode 100644 index a4b8c42..0000000 Binary files a/iwdification/animations/e320/mgh3sp.bam and /dev/null differ diff --git a/iwdification/animations/e320/mgh3spe.bam b/iwdification/animations/e320/mgh3spe.bam deleted file mode 100644 index 4dbd9eb..0000000 Binary files a/iwdification/animations/e320/mgh3spe.bam and /dev/null differ diff --git a/iwdification/animations/e320/mgh3tw.bam b/iwdification/animations/e320/mgh3tw.bam deleted file mode 100644 index 9f1c3eb..0000000 Binary files a/iwdification/animations/e320/mgh3tw.bam and /dev/null differ diff --git a/iwdification/animations/e320/mgh3twe.bam b/iwdification/animations/e320/mgh3twe.bam deleted file mode 100644 index 4a3c729..0000000 Binary files a/iwdification/animations/e320/mgh3twe.bam and /dev/null differ diff --git a/iwdification/animations/e320/mgh3wk.bam b/iwdification/animations/e320/mgh3wk.bam deleted file mode 100644 index c4bbe8c..0000000 Binary files a/iwdification/animations/e320/mgh3wk.bam and /dev/null differ diff --git a/iwdification/animations/e320/mgh3wke.bam b/iwdification/animations/e320/mgh3wke.bam deleted file mode 100644 index 6a74400..0000000 Binary files a/iwdification/animations/e320/mgh3wke.bam and /dev/null differ diff --git a/iwdification/animations/e400/bf_lg01.wav b/iwdification/animations/e400/bf_lg01.wav deleted file mode 100644 index 77bf64d..0000000 Binary files a/iwdification/animations/e400/bf_lg01.wav and /dev/null differ diff --git a/iwdification/animations/e400/bf_lg02.wav b/iwdification/animations/e400/bf_lg02.wav deleted file mode 100644 index 75f656c..0000000 Binary files a/iwdification/animations/e400/bf_lg02.wav and /dev/null differ diff --git a/iwdification/animations/e400/bf_lg03.wav b/iwdification/animations/e400/bf_lg03.wav deleted file mode 100644 index a6a95ec..0000000 Binary files a/iwdification/animations/e400/bf_lg03.wav and /dev/null differ diff --git a/iwdification/animations/e400/gobaxe10.wav b/iwdification/animations/e400/gobaxe10.wav deleted file mode 100644 index 1859623..0000000 Binary files a/iwdification/animations/e400/gobaxe10.wav and /dev/null differ diff --git a/iwdification/animations/e400/gobaxe8.wav b/iwdification/animations/e400/gobaxe8.wav deleted file mode 100644 index 3607d11..0000000 Binary files a/iwdification/animations/e400/gobaxe8.wav and /dev/null differ diff --git a/iwdification/animations/e400/mgo1ca.bam b/iwdification/animations/e400/mgo1ca.bam deleted file mode 100644 index 6e785fc..0000000 Binary files a/iwdification/animations/e400/mgo1ca.bam and /dev/null differ diff --git a/iwdification/animations/e400/mgo1cae.bam b/iwdification/animations/e400/mgo1cae.bam deleted file mode 100644 index bd05086..0000000 Binary files a/iwdification/animations/e400/mgo1cae.bam and /dev/null differ diff --git a/iwdification/animations/e400/mgo1sp.bam b/iwdification/animations/e400/mgo1sp.bam deleted file mode 100644 index 6f3cb9d..0000000 Binary files a/iwdification/animations/e400/mgo1sp.bam and /dev/null differ diff --git a/iwdification/animations/e400/mgo1spe.bam b/iwdification/animations/e400/mgo1spe.bam deleted file mode 100644 index d86ce99..0000000 Binary files a/iwdification/animations/e400/mgo1spe.bam and /dev/null differ diff --git a/iwdification/animations/e420/bf_lg01.wav b/iwdification/animations/e420/bf_lg01.wav deleted file mode 100644 index 77bf64d..0000000 Binary files a/iwdification/animations/e420/bf_lg01.wav and /dev/null differ diff --git a/iwdification/animations/e420/bf_lg02.wav b/iwdification/animations/e420/bf_lg02.wav deleted file mode 100644 index 75f656c..0000000 Binary files a/iwdification/animations/e420/bf_lg02.wav and /dev/null differ diff --git a/iwdification/animations/e420/bf_lg03.wav b/iwdification/animations/e420/bf_lg03.wav deleted file mode 100644 index a6a95ec..0000000 Binary files a/iwdification/animations/e420/bf_lg03.wav and /dev/null differ diff --git a/iwdification/animations/e420/gobaxe10.wav b/iwdification/animations/e420/gobaxe10.wav deleted file mode 100644 index 1859623..0000000 Binary files a/iwdification/animations/e420/gobaxe10.wav and /dev/null differ diff --git a/iwdification/animations/e420/gobaxe8.wav b/iwdification/animations/e420/gobaxe8.wav deleted file mode 100644 index 3607d11..0000000 Binary files a/iwdification/animations/e420/gobaxe8.wav and /dev/null differ diff --git a/iwdification/animations/e420/mgo3ca.bam b/iwdification/animations/e420/mgo3ca.bam deleted file mode 100644 index 579ae02..0000000 Binary files a/iwdification/animations/e420/mgo3ca.bam and /dev/null differ diff --git a/iwdification/animations/e420/mgo3cae.bam b/iwdification/animations/e420/mgo3cae.bam deleted file mode 100644 index c5c1b48..0000000 Binary files a/iwdification/animations/e420/mgo3cae.bam and /dev/null differ diff --git a/iwdification/animations/e420/mgo3sp.bam b/iwdification/animations/e420/mgo3sp.bam deleted file mode 100644 index 7f8848a..0000000 Binary files a/iwdification/animations/e420/mgo3sp.bam and /dev/null differ diff --git a/iwdification/animations/e420/mgo3spe.bam b/iwdification/animations/e420/mgo3spe.bam deleted file mode 100644 index 09e47ff..0000000 Binary files a/iwdification/animations/e420/mgo3spe.bam and /dev/null differ diff --git a/iwdification/animations/e500/bf_md01.wav b/iwdification/animations/e500/bf_md01.wav deleted file mode 100644 index 64f5174..0000000 Binary files a/iwdification/animations/e500/bf_md01.wav and /dev/null differ diff --git a/iwdification/animations/e500/bf_md02.wav b/iwdification/animations/e500/bf_md02.wav deleted file mode 100644 index 441c655..0000000 Binary files a/iwdification/animations/e500/bf_md02.wav and /dev/null differ diff --git a/iwdification/animations/e500/bf_md03.wav b/iwdification/animations/e500/bf_md03.wav deleted file mode 100644 index 714b141..0000000 Binary files a/iwdification/animations/e500/bf_md03.wav and /dev/null differ diff --git a/iwdification/animations/e500/lizon02b.wav b/iwdification/animations/e500/lizon02b.wav deleted file mode 100644 index c05fbde..0000000 Binary files a/iwdification/animations/e500/lizon02b.wav and /dev/null differ diff --git a/iwdification/animations/e500/lizon08.wav b/iwdification/animations/e500/lizon08.wav deleted file mode 100644 index a52f459..0000000 Binary files a/iwdification/animations/e500/lizon08.wav and /dev/null differ diff --git a/iwdification/animations/e500/lizon10.wav b/iwdification/animations/e500/lizon10.wav deleted file mode 100644 index 1286c1c..0000000 Binary files a/iwdification/animations/e500/lizon10.wav and /dev/null differ diff --git a/iwdification/animations/e500/mlizca1.bam b/iwdification/animations/e500/mlizca1.bam deleted file mode 100644 index ba5a361..0000000 Binary files a/iwdification/animations/e500/mlizca1.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizca1e.bam b/iwdification/animations/e500/mlizca1e.bam deleted file mode 100644 index 2d59481..0000000 Binary files a/iwdification/animations/e500/mlizca1e.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizca2.bam b/iwdification/animations/e500/mlizca2.bam deleted file mode 100644 index 883b194..0000000 Binary files a/iwdification/animations/e500/mlizca2.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizca2e.bam b/iwdification/animations/e500/mlizca2e.bam deleted file mode 100644 index 8e7359f..0000000 Binary files a/iwdification/animations/e500/mlizca2e.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizcca.bam b/iwdification/animations/e500/mlizcca.bam deleted file mode 100644 index 9cfb1f7..0000000 Binary files a/iwdification/animations/e500/mlizcca.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizccae.bam b/iwdification/animations/e500/mlizccae.bam deleted file mode 100644 index 75f4258..0000000 Binary files a/iwdification/animations/e500/mlizccae.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizcgh.bam b/iwdification/animations/e500/mlizcgh.bam deleted file mode 100644 index 139ca57..0000000 Binary files a/iwdification/animations/e500/mlizcgh.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizcghe.bam b/iwdification/animations/e500/mlizcghe.bam deleted file mode 100644 index cae3d35..0000000 Binary files a/iwdification/animations/e500/mlizcghe.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizcgu.bam b/iwdification/animations/e500/mlizcgu.bam deleted file mode 100644 index 7d78b45..0000000 Binary files a/iwdification/animations/e500/mlizcgu.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizcgue.bam b/iwdification/animations/e500/mlizcgue.bam deleted file mode 100644 index 3527892..0000000 Binary files a/iwdification/animations/e500/mlizcgue.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizcsc.bam b/iwdification/animations/e500/mlizcsc.bam deleted file mode 100644 index 56db337..0000000 Binary files a/iwdification/animations/e500/mlizcsc.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizcsce.bam b/iwdification/animations/e500/mlizcsce.bam deleted file mode 100644 index dc718d2..0000000 Binary files a/iwdification/animations/e500/mlizcsce.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizcsd.bam b/iwdification/animations/e500/mlizcsd.bam deleted file mode 100644 index c51f334..0000000 Binary files a/iwdification/animations/e500/mlizcsd.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizcsde.bam b/iwdification/animations/e500/mlizcsde.bam deleted file mode 100644 index 8c2c9d3..0000000 Binary files a/iwdification/animations/e500/mlizcsde.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizcsl.bam b/iwdification/animations/e500/mlizcsl.bam deleted file mode 100644 index 1bb3135..0000000 Binary files a/iwdification/animations/e500/mlizcsl.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizcsle.bam b/iwdification/animations/e500/mlizcsle.bam deleted file mode 100644 index 909ea3f..0000000 Binary files a/iwdification/animations/e500/mlizcsle.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizcsp.bam b/iwdification/animations/e500/mlizcsp.bam deleted file mode 100644 index 93e80ca..0000000 Binary files a/iwdification/animations/e500/mlizcsp.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizcspe.bam b/iwdification/animations/e500/mlizcspe.bam deleted file mode 100644 index f0c2ee1..0000000 Binary files a/iwdification/animations/e500/mlizcspe.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizcwk.bam b/iwdification/animations/e500/mlizcwk.bam deleted file mode 100644 index 8a04de6..0000000 Binary files a/iwdification/animations/e500/mlizcwk.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizcwke.bam b/iwdification/animations/e500/mlizcwke.bam deleted file mode 100644 index 19094ce..0000000 Binary files a/iwdification/animations/e500/mlizcwke.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizha1.bam b/iwdification/animations/e500/mlizha1.bam deleted file mode 100644 index 2d1e517..0000000 Binary files a/iwdification/animations/e500/mlizha1.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizha1e.bam b/iwdification/animations/e500/mlizha1e.bam deleted file mode 100644 index 2aa264f..0000000 Binary files a/iwdification/animations/e500/mlizha1e.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizha2.bam b/iwdification/animations/e500/mlizha2.bam deleted file mode 100644 index 0487842..0000000 Binary files a/iwdification/animations/e500/mlizha2.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizha2e.bam b/iwdification/animations/e500/mlizha2e.bam deleted file mode 100644 index 142ff0d..0000000 Binary files a/iwdification/animations/e500/mlizha2e.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizhca.bam b/iwdification/animations/e500/mlizhca.bam deleted file mode 100644 index 8357309..0000000 Binary files a/iwdification/animations/e500/mlizhca.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizhcae.bam b/iwdification/animations/e500/mlizhcae.bam deleted file mode 100644 index c30ad85..0000000 Binary files a/iwdification/animations/e500/mlizhcae.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizhgh.bam b/iwdification/animations/e500/mlizhgh.bam deleted file mode 100644 index 68b8304..0000000 Binary files a/iwdification/animations/e500/mlizhgh.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizhghe.bam b/iwdification/animations/e500/mlizhghe.bam deleted file mode 100644 index f9dd6c5..0000000 Binary files a/iwdification/animations/e500/mlizhghe.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizhgu.bam b/iwdification/animations/e500/mlizhgu.bam deleted file mode 100644 index c783e1b..0000000 Binary files a/iwdification/animations/e500/mlizhgu.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizhgue.bam b/iwdification/animations/e500/mlizhgue.bam deleted file mode 100644 index 3533736..0000000 Binary files a/iwdification/animations/e500/mlizhgue.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizhsc.bam b/iwdification/animations/e500/mlizhsc.bam deleted file mode 100644 index fb48084..0000000 Binary files a/iwdification/animations/e500/mlizhsc.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizhsce.bam b/iwdification/animations/e500/mlizhsce.bam deleted file mode 100644 index 417a8f7..0000000 Binary files a/iwdification/animations/e500/mlizhsce.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizhsd.bam b/iwdification/animations/e500/mlizhsd.bam deleted file mode 100644 index 173101a..0000000 Binary files a/iwdification/animations/e500/mlizhsd.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizhsde.bam b/iwdification/animations/e500/mlizhsde.bam deleted file mode 100644 index 48ca511..0000000 Binary files a/iwdification/animations/e500/mlizhsde.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizhsl.bam b/iwdification/animations/e500/mlizhsl.bam deleted file mode 100644 index fc447af..0000000 Binary files a/iwdification/animations/e500/mlizhsl.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizhsle.bam b/iwdification/animations/e500/mlizhsle.bam deleted file mode 100644 index 88bfe86..0000000 Binary files a/iwdification/animations/e500/mlizhsle.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizhsp.bam b/iwdification/animations/e500/mlizhsp.bam deleted file mode 100644 index cca8204..0000000 Binary files a/iwdification/animations/e500/mlizhsp.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizhspe.bam b/iwdification/animations/e500/mlizhspe.bam deleted file mode 100644 index b2e8647..0000000 Binary files a/iwdification/animations/e500/mlizhspe.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizhwk.bam b/iwdification/animations/e500/mlizhwk.bam deleted file mode 100644 index f033cb5..0000000 Binary files a/iwdification/animations/e500/mlizhwk.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizhwke.bam b/iwdification/animations/e500/mlizhwke.bam deleted file mode 100644 index 7c9279c..0000000 Binary files a/iwdification/animations/e500/mlizhwke.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizqa1.bam b/iwdification/animations/e500/mlizqa1.bam deleted file mode 100644 index 62764cf..0000000 Binary files a/iwdification/animations/e500/mlizqa1.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizqa1e.bam b/iwdification/animations/e500/mlizqa1e.bam deleted file mode 100644 index b68aedd..0000000 Binary files a/iwdification/animations/e500/mlizqa1e.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizqa2.bam b/iwdification/animations/e500/mlizqa2.bam deleted file mode 100644 index 12c9845..0000000 Binary files a/iwdification/animations/e500/mlizqa2.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizqa2e.bam b/iwdification/animations/e500/mlizqa2e.bam deleted file mode 100644 index 95a0fca..0000000 Binary files a/iwdification/animations/e500/mlizqa2e.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizqca.bam b/iwdification/animations/e500/mlizqca.bam deleted file mode 100644 index 5321bb3..0000000 Binary files a/iwdification/animations/e500/mlizqca.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizqcae.bam b/iwdification/animations/e500/mlizqcae.bam deleted file mode 100644 index a67d8f3..0000000 Binary files a/iwdification/animations/e500/mlizqcae.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizqgh.bam b/iwdification/animations/e500/mlizqgh.bam deleted file mode 100644 index 1605341..0000000 Binary files a/iwdification/animations/e500/mlizqgh.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizqghe.bam b/iwdification/animations/e500/mlizqghe.bam deleted file mode 100644 index 91d3dc9..0000000 Binary files a/iwdification/animations/e500/mlizqghe.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizqgu.bam b/iwdification/animations/e500/mlizqgu.bam deleted file mode 100644 index 246c6b6..0000000 Binary files a/iwdification/animations/e500/mlizqgu.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizqgue.bam b/iwdification/animations/e500/mlizqgue.bam deleted file mode 100644 index 522ddc3..0000000 Binary files a/iwdification/animations/e500/mlizqgue.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizqsc.bam b/iwdification/animations/e500/mlizqsc.bam deleted file mode 100644 index 3aeca08..0000000 Binary files a/iwdification/animations/e500/mlizqsc.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizqsce.bam b/iwdification/animations/e500/mlizqsce.bam deleted file mode 100644 index 94b543b..0000000 Binary files a/iwdification/animations/e500/mlizqsce.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizqsd.bam b/iwdification/animations/e500/mlizqsd.bam deleted file mode 100644 index db13a2e..0000000 Binary files a/iwdification/animations/e500/mlizqsd.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizqsde.bam b/iwdification/animations/e500/mlizqsde.bam deleted file mode 100644 index 9f89275..0000000 Binary files a/iwdification/animations/e500/mlizqsde.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizqsl.bam b/iwdification/animations/e500/mlizqsl.bam deleted file mode 100644 index 6d150e4..0000000 Binary files a/iwdification/animations/e500/mlizqsl.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizqsle.bam b/iwdification/animations/e500/mlizqsle.bam deleted file mode 100644 index db04748..0000000 Binary files a/iwdification/animations/e500/mlizqsle.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizqsp.bam b/iwdification/animations/e500/mlizqsp.bam deleted file mode 100644 index c152e07..0000000 Binary files a/iwdification/animations/e500/mlizqsp.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizqspe.bam b/iwdification/animations/e500/mlizqspe.bam deleted file mode 100644 index b4fe63a..0000000 Binary files a/iwdification/animations/e500/mlizqspe.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizqwk.bam b/iwdification/animations/e500/mlizqwk.bam deleted file mode 100644 index 1311fa7..0000000 Binary files a/iwdification/animations/e500/mlizqwk.bam and /dev/null differ diff --git a/iwdification/animations/e500/mlizqwke.bam b/iwdification/animations/e500/mlizqwke.bam deleted file mode 100644 index 4fb1be9..0000000 Binary files a/iwdification/animations/e500/mlizqwke.bam and /dev/null differ diff --git a/iwdification/animations/e510/bf_md01.wav b/iwdification/animations/e510/bf_md01.wav deleted file mode 100644 index 64f5174..0000000 Binary files a/iwdification/animations/e510/bf_md01.wav and /dev/null differ diff --git a/iwdification/animations/e510/bf_md02.wav b/iwdification/animations/e510/bf_md02.wav deleted file mode 100644 index 441c655..0000000 Binary files a/iwdification/animations/e510/bf_md02.wav and /dev/null differ diff --git a/iwdification/animations/e510/bf_md03.wav b/iwdification/animations/e510/bf_md03.wav deleted file mode 100644 index 714b141..0000000 Binary files a/iwdification/animations/e510/bf_md03.wav and /dev/null differ diff --git a/iwdification/animations/e510/lizon02b.wav b/iwdification/animations/e510/lizon02b.wav deleted file mode 100644 index c05fbde..0000000 Binary files a/iwdification/animations/e510/lizon02b.wav and /dev/null differ diff --git a/iwdification/animations/e510/lizon08.wav b/iwdification/animations/e510/lizon08.wav deleted file mode 100644 index a52f459..0000000 Binary files a/iwdification/animations/e510/lizon08.wav and /dev/null differ diff --git a/iwdification/animations/e510/lizon10.wav b/iwdification/animations/e510/lizon10.wav deleted file mode 100644 index 1286c1c..0000000 Binary files a/iwdification/animations/e510/lizon10.wav and /dev/null differ diff --git a/iwdification/animations/e510/mli2a1.bam b/iwdification/animations/e510/mli2a1.bam deleted file mode 100644 index b85ba75..0000000 Binary files a/iwdification/animations/e510/mli2a1.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2a1e.bam b/iwdification/animations/e510/mli2a1e.bam deleted file mode 100644 index 8708776..0000000 Binary files a/iwdification/animations/e510/mli2a1e.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2a2.bam b/iwdification/animations/e510/mli2a2.bam deleted file mode 100644 index fac2acd..0000000 Binary files a/iwdification/animations/e510/mli2a2.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2a2e.bam b/iwdification/animations/e510/mli2a2e.bam deleted file mode 100644 index 102bef6..0000000 Binary files a/iwdification/animations/e510/mli2a2e.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2aa1.bam b/iwdification/animations/e510/mli2aa1.bam deleted file mode 100644 index b4b3504..0000000 Binary files a/iwdification/animations/e510/mli2aa1.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2aa1e.bam b/iwdification/animations/e510/mli2aa1e.bam deleted file mode 100644 index 4eab940..0000000 Binary files a/iwdification/animations/e510/mli2aa1e.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2aa2.bam b/iwdification/animations/e510/mli2aa2.bam deleted file mode 100644 index 8384cb3..0000000 Binary files a/iwdification/animations/e510/mli2aa2.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2aa2e.bam b/iwdification/animations/e510/mli2aa2e.bam deleted file mode 100644 index 1439472..0000000 Binary files a/iwdification/animations/e510/mli2aa2e.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2aca.bam b/iwdification/animations/e510/mli2aca.bam deleted file mode 100644 index b4b3504..0000000 Binary files a/iwdification/animations/e510/mli2aca.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2acae.bam b/iwdification/animations/e510/mli2acae.bam deleted file mode 100644 index 4eab940..0000000 Binary files a/iwdification/animations/e510/mli2acae.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2agh.bam b/iwdification/animations/e510/mli2agh.bam deleted file mode 100644 index f51c7dc..0000000 Binary files a/iwdification/animations/e510/mli2agh.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2aghe.bam b/iwdification/animations/e510/mli2aghe.bam deleted file mode 100644 index 3b554f5..0000000 Binary files a/iwdification/animations/e510/mli2aghe.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2agu.bam b/iwdification/animations/e510/mli2agu.bam deleted file mode 100644 index 60bd2cd..0000000 Binary files a/iwdification/animations/e510/mli2agu.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2ague.bam b/iwdification/animations/e510/mli2ague.bam deleted file mode 100644 index 47526f1..0000000 Binary files a/iwdification/animations/e510/mli2ague.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2asc.bam b/iwdification/animations/e510/mli2asc.bam deleted file mode 100644 index 8d5e999..0000000 Binary files a/iwdification/animations/e510/mli2asc.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2asce.bam b/iwdification/animations/e510/mli2asce.bam deleted file mode 100644 index 48fc890..0000000 Binary files a/iwdification/animations/e510/mli2asce.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2asd.bam b/iwdification/animations/e510/mli2asd.bam deleted file mode 100644 index 64869f0..0000000 Binary files a/iwdification/animations/e510/mli2asd.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2asde.bam b/iwdification/animations/e510/mli2asde.bam deleted file mode 100644 index 34cfd21..0000000 Binary files a/iwdification/animations/e510/mli2asde.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2asl.bam b/iwdification/animations/e510/mli2asl.bam deleted file mode 100644 index 87da9ce..0000000 Binary files a/iwdification/animations/e510/mli2asl.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2asle.bam b/iwdification/animations/e510/mli2asle.bam deleted file mode 100644 index 776bbb5..0000000 Binary files a/iwdification/animations/e510/mli2asle.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2asp.bam b/iwdification/animations/e510/mli2asp.bam deleted file mode 100644 index 8d5e999..0000000 Binary files a/iwdification/animations/e510/mli2asp.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2aspe.bam b/iwdification/animations/e510/mli2aspe.bam deleted file mode 100644 index 48fc890..0000000 Binary files a/iwdification/animations/e510/mli2aspe.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2awk.bam b/iwdification/animations/e510/mli2awk.bam deleted file mode 100644 index a302057..0000000 Binary files a/iwdification/animations/e510/mli2awk.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2awke.bam b/iwdification/animations/e510/mli2awke.bam deleted file mode 100644 index 9357db7..0000000 Binary files a/iwdification/animations/e510/mli2awke.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2ca.bam b/iwdification/animations/e510/mli2ca.bam deleted file mode 100644 index b85ba75..0000000 Binary files a/iwdification/animations/e510/mli2ca.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2cae.bam b/iwdification/animations/e510/mli2cae.bam deleted file mode 100644 index 8708776..0000000 Binary files a/iwdification/animations/e510/mli2cae.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2de.bam b/iwdification/animations/e510/mli2de.bam deleted file mode 100644 index e658d88..0000000 Binary files a/iwdification/animations/e510/mli2de.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2dee.bam b/iwdification/animations/e510/mli2dee.bam deleted file mode 100644 index 3369c7c..0000000 Binary files a/iwdification/animations/e510/mli2dee.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2gh.bam b/iwdification/animations/e510/mli2gh.bam deleted file mode 100644 index 05c1ad1..0000000 Binary files a/iwdification/animations/e510/mli2gh.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2ghe.bam b/iwdification/animations/e510/mli2ghe.bam deleted file mode 100644 index 9073121..0000000 Binary files a/iwdification/animations/e510/mli2ghe.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2gu.bam b/iwdification/animations/e510/mli2gu.bam deleted file mode 100644 index 3eef29d..0000000 Binary files a/iwdification/animations/e510/mli2gu.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2gue.bam b/iwdification/animations/e510/mli2gue.bam deleted file mode 100644 index c503e0f..0000000 Binary files a/iwdification/animations/e510/mli2gue.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2ha1.bam b/iwdification/animations/e510/mli2ha1.bam deleted file mode 100644 index 50e8f08..0000000 Binary files a/iwdification/animations/e510/mli2ha1.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2ha1e.bam b/iwdification/animations/e510/mli2ha1e.bam deleted file mode 100644 index a5e4e3a..0000000 Binary files a/iwdification/animations/e510/mli2ha1e.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2ha2.bam b/iwdification/animations/e510/mli2ha2.bam deleted file mode 100644 index 9b4752d..0000000 Binary files a/iwdification/animations/e510/mli2ha2.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2ha2e.bam b/iwdification/animations/e510/mli2ha2e.bam deleted file mode 100644 index c1bcf21..0000000 Binary files a/iwdification/animations/e510/mli2ha2e.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2hca.bam b/iwdification/animations/e510/mli2hca.bam deleted file mode 100644 index 50e8f08..0000000 Binary files a/iwdification/animations/e510/mli2hca.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2hcae.bam b/iwdification/animations/e510/mli2hcae.bam deleted file mode 100644 index a5e4e3a..0000000 Binary files a/iwdification/animations/e510/mli2hcae.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2hgh.bam b/iwdification/animations/e510/mli2hgh.bam deleted file mode 100644 index 0a3162a..0000000 Binary files a/iwdification/animations/e510/mli2hgh.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2hghe.bam b/iwdification/animations/e510/mli2hghe.bam deleted file mode 100644 index 1735ad9..0000000 Binary files a/iwdification/animations/e510/mli2hghe.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2hgu.bam b/iwdification/animations/e510/mli2hgu.bam deleted file mode 100644 index 1f2ddef..0000000 Binary files a/iwdification/animations/e510/mli2hgu.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2hgue.bam b/iwdification/animations/e510/mli2hgue.bam deleted file mode 100644 index 5fd7639..0000000 Binary files a/iwdification/animations/e510/mli2hgue.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2hsc.bam b/iwdification/animations/e510/mli2hsc.bam deleted file mode 100644 index bea6329..0000000 Binary files a/iwdification/animations/e510/mli2hsc.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2hsce.bam b/iwdification/animations/e510/mli2hsce.bam deleted file mode 100644 index b2f6cd7..0000000 Binary files a/iwdification/animations/e510/mli2hsce.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2hsd.bam b/iwdification/animations/e510/mli2hsd.bam deleted file mode 100644 index 1f81492..0000000 Binary files a/iwdification/animations/e510/mli2hsd.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2hsde.bam b/iwdification/animations/e510/mli2hsde.bam deleted file mode 100644 index 31a1750..0000000 Binary files a/iwdification/animations/e510/mli2hsde.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2hsl.bam b/iwdification/animations/e510/mli2hsl.bam deleted file mode 100644 index eb20f8f..0000000 Binary files a/iwdification/animations/e510/mli2hsl.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2hsle.bam b/iwdification/animations/e510/mli2hsle.bam deleted file mode 100644 index 97590bf..0000000 Binary files a/iwdification/animations/e510/mli2hsle.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2hsp.bam b/iwdification/animations/e510/mli2hsp.bam deleted file mode 100644 index bea6329..0000000 Binary files a/iwdification/animations/e510/mli2hsp.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2hspe.bam b/iwdification/animations/e510/mli2hspe.bam deleted file mode 100644 index b2f6cd7..0000000 Binary files a/iwdification/animations/e510/mli2hspe.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2hwk.bam b/iwdification/animations/e510/mli2hwk.bam deleted file mode 100644 index 9158615..0000000 Binary files a/iwdification/animations/e510/mli2hwk.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2hwke.bam b/iwdification/animations/e510/mli2hwke.bam deleted file mode 100644 index 6fb9fd6..0000000 Binary files a/iwdification/animations/e510/mli2hwke.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2ma1.bam b/iwdification/animations/e510/mli2ma1.bam deleted file mode 100644 index fcf4c1b..0000000 Binary files a/iwdification/animations/e510/mli2ma1.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2ma1e.bam b/iwdification/animations/e510/mli2ma1e.bam deleted file mode 100644 index ff92868..0000000 Binary files a/iwdification/animations/e510/mli2ma1e.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2ma2.bam b/iwdification/animations/e510/mli2ma2.bam deleted file mode 100644 index c0e0642..0000000 Binary files a/iwdification/animations/e510/mli2ma2.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2ma2e.bam b/iwdification/animations/e510/mli2ma2e.bam deleted file mode 100644 index a8db191..0000000 Binary files a/iwdification/animations/e510/mli2ma2e.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2mca.bam b/iwdification/animations/e510/mli2mca.bam deleted file mode 100644 index fcf4c1b..0000000 Binary files a/iwdification/animations/e510/mli2mca.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2mcae.bam b/iwdification/animations/e510/mli2mcae.bam deleted file mode 100644 index ff92868..0000000 Binary files a/iwdification/animations/e510/mli2mcae.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2mgh.bam b/iwdification/animations/e510/mli2mgh.bam deleted file mode 100644 index 12ca5c6..0000000 Binary files a/iwdification/animations/e510/mli2mgh.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2mghe.bam b/iwdification/animations/e510/mli2mghe.bam deleted file mode 100644 index b767671..0000000 Binary files a/iwdification/animations/e510/mli2mghe.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2mgu.bam b/iwdification/animations/e510/mli2mgu.bam deleted file mode 100644 index ae3aaa1..0000000 Binary files a/iwdification/animations/e510/mli2mgu.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2mgue.bam b/iwdification/animations/e510/mli2mgue.bam deleted file mode 100644 index 8c4f387..0000000 Binary files a/iwdification/animations/e510/mli2mgue.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2msc.bam b/iwdification/animations/e510/mli2msc.bam deleted file mode 100644 index e216e78..0000000 Binary files a/iwdification/animations/e510/mli2msc.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2msce.bam b/iwdification/animations/e510/mli2msce.bam deleted file mode 100644 index 4f375dd..0000000 Binary files a/iwdification/animations/e510/mli2msce.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2msd.bam b/iwdification/animations/e510/mli2msd.bam deleted file mode 100644 index eceb70c..0000000 Binary files a/iwdification/animations/e510/mli2msd.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2msde.bam b/iwdification/animations/e510/mli2msde.bam deleted file mode 100644 index 4232273..0000000 Binary files a/iwdification/animations/e510/mli2msde.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2msl.bam b/iwdification/animations/e510/mli2msl.bam deleted file mode 100644 index 94d7715..0000000 Binary files a/iwdification/animations/e510/mli2msl.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2msle.bam b/iwdification/animations/e510/mli2msle.bam deleted file mode 100644 index 1ace27c..0000000 Binary files a/iwdification/animations/e510/mli2msle.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2msp.bam b/iwdification/animations/e510/mli2msp.bam deleted file mode 100644 index e216e78..0000000 Binary files a/iwdification/animations/e510/mli2msp.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2mspe.bam b/iwdification/animations/e510/mli2mspe.bam deleted file mode 100644 index 4f375dd..0000000 Binary files a/iwdification/animations/e510/mli2mspe.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2mwk.bam b/iwdification/animations/e510/mli2mwk.bam deleted file mode 100644 index 1b9fa62..0000000 Binary files a/iwdification/animations/e510/mli2mwk.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2mwke.bam b/iwdification/animations/e510/mli2mwke.bam deleted file mode 100644 index 2ef9a28..0000000 Binary files a/iwdification/animations/e510/mli2mwke.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2sc.bam b/iwdification/animations/e510/mli2sc.bam deleted file mode 100644 index be0d944..0000000 Binary files a/iwdification/animations/e510/mli2sc.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2sce.bam b/iwdification/animations/e510/mli2sce.bam deleted file mode 100644 index 67610a5..0000000 Binary files a/iwdification/animations/e510/mli2sce.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2sd.bam b/iwdification/animations/e510/mli2sd.bam deleted file mode 100644 index ff997b6..0000000 Binary files a/iwdification/animations/e510/mli2sd.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2sde.bam b/iwdification/animations/e510/mli2sde.bam deleted file mode 100644 index 08f45a3..0000000 Binary files a/iwdification/animations/e510/mli2sde.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2sl.bam b/iwdification/animations/e510/mli2sl.bam deleted file mode 100644 index 3f8af14..0000000 Binary files a/iwdification/animations/e510/mli2sl.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2sle.bam b/iwdification/animations/e510/mli2sle.bam deleted file mode 100644 index d2c2ba0..0000000 Binary files a/iwdification/animations/e510/mli2sle.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2sp.bam b/iwdification/animations/e510/mli2sp.bam deleted file mode 100644 index be0d944..0000000 Binary files a/iwdification/animations/e510/mli2sp.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2spe.bam b/iwdification/animations/e510/mli2spe.bam deleted file mode 100644 index 67610a5..0000000 Binary files a/iwdification/animations/e510/mli2spe.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2tw.bam b/iwdification/animations/e510/mli2tw.bam deleted file mode 100644 index 6009863..0000000 Binary files a/iwdification/animations/e510/mli2tw.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2twe.bam b/iwdification/animations/e510/mli2twe.bam deleted file mode 100644 index 0b380d6..0000000 Binary files a/iwdification/animations/e510/mli2twe.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2wk.bam b/iwdification/animations/e510/mli2wk.bam deleted file mode 100644 index fa3c648..0000000 Binary files a/iwdification/animations/e510/mli2wk.bam and /dev/null differ diff --git a/iwdification/animations/e510/mli2wke.bam b/iwdification/animations/e510/mli2wke.bam deleted file mode 100644 index 65c8943..0000000 Binary files a/iwdification/animations/e510/mli2wke.bam and /dev/null differ diff --git a/iwdification/animations/e900/bf_md01.wav b/iwdification/animations/e900/bf_md01.wav deleted file mode 100644 index 64f5174..0000000 Binary files a/iwdification/animations/e900/bf_md01.wav and /dev/null differ diff --git a/iwdification/animations/e900/bf_md02.wav b/iwdification/animations/e900/bf_md02.wav deleted file mode 100644 index 441c655..0000000 Binary files a/iwdification/animations/e900/bf_md02.wav and /dev/null differ diff --git a/iwdification/animations/e900/bf_md03.wav b/iwdification/animations/e900/bf_md03.wav deleted file mode 100644 index 714b141..0000000 Binary files a/iwdification/animations/e900/bf_md03.wav and /dev/null differ diff --git a/iwdification/animations/e900/salam02.wav b/iwdification/animations/e900/salam02.wav deleted file mode 100644 index 1fd38e9..0000000 Binary files a/iwdification/animations/e900/salam02.wav and /dev/null differ diff --git a/iwdification/animations/e900/salam03c.wav b/iwdification/animations/e900/salam03c.wav deleted file mode 100644 index 13d9478..0000000 Binary files a/iwdification/animations/e900/salam03c.wav and /dev/null differ diff --git a/iwdification/animations/e900/salam03d.wav b/iwdification/animations/e900/salam03d.wav deleted file mode 100644 index 79471a0..0000000 Binary files a/iwdification/animations/e900/salam03d.wav and /dev/null differ diff --git a/iwdification/animations/e900/salam09b.wav b/iwdification/animations/e900/salam09b.wav deleted file mode 100644 index 0f0e24d..0000000 Binary files a/iwdification/animations/e900/salam09b.wav and /dev/null differ diff --git a/iwdification/animations/e900/salam10a.wav b/iwdification/animations/e900/salam10a.wav deleted file mode 100644 index b439a89..0000000 Binary files a/iwdification/animations/e900/salam10a.wav and /dev/null differ diff --git a/iwdification/animations/e910/bf_md01.wav b/iwdification/animations/e910/bf_md01.wav deleted file mode 100644 index 64f5174..0000000 Binary files a/iwdification/animations/e910/bf_md01.wav and /dev/null differ diff --git a/iwdification/animations/e910/bf_md02.wav b/iwdification/animations/e910/bf_md02.wav deleted file mode 100644 index 441c655..0000000 Binary files a/iwdification/animations/e910/bf_md02.wav and /dev/null differ diff --git a/iwdification/animations/e910/bf_md03.wav b/iwdification/animations/e910/bf_md03.wav deleted file mode 100644 index 714b141..0000000 Binary files a/iwdification/animations/e910/bf_md03.wav and /dev/null differ diff --git a/iwdification/animations/e910/msa2ca.bam b/iwdification/animations/e910/msa2ca.bam deleted file mode 100644 index 5d6f92d..0000000 Binary files a/iwdification/animations/e910/msa2ca.bam and /dev/null differ diff --git a/iwdification/animations/e910/msa2cae.bam b/iwdification/animations/e910/msa2cae.bam deleted file mode 100644 index 28d8a4d..0000000 Binary files a/iwdification/animations/e910/msa2cae.bam and /dev/null differ diff --git a/iwdification/animations/e910/msa2sp.bam b/iwdification/animations/e910/msa2sp.bam deleted file mode 100644 index 0f1e9ed..0000000 Binary files a/iwdification/animations/e910/msa2sp.bam and /dev/null differ diff --git a/iwdification/animations/e910/msa2spe.bam b/iwdification/animations/e910/msa2spe.bam deleted file mode 100644 index 33ffb80..0000000 Binary files a/iwdification/animations/e910/msa2spe.bam and /dev/null differ diff --git a/iwdification/animations/e910/salam02.wav b/iwdification/animations/e910/salam02.wav deleted file mode 100644 index 1fd38e9..0000000 Binary files a/iwdification/animations/e910/salam02.wav and /dev/null differ diff --git a/iwdification/animations/e910/salam03c.wav b/iwdification/animations/e910/salam03c.wav deleted file mode 100644 index 13d9478..0000000 Binary files a/iwdification/animations/e910/salam03c.wav and /dev/null differ diff --git a/iwdification/animations/e910/salam03d.wav b/iwdification/animations/e910/salam03d.wav deleted file mode 100644 index 79471a0..0000000 Binary files a/iwdification/animations/e910/salam03d.wav and /dev/null differ diff --git a/iwdification/animations/e910/salam09b.wav b/iwdification/animations/e910/salam09b.wav deleted file mode 100644 index 0f0e24d..0000000 Binary files a/iwdification/animations/e910/salam09b.wav and /dev/null differ diff --git a/iwdification/animations/e910/salam10a.wav b/iwdification/animations/e910/salam10a.wav deleted file mode 100644 index b439a89..0000000 Binary files a/iwdification/animations/e910/salam10a.wav and /dev/null differ diff --git a/iwdification/animations/ea20/msh2a1.bam b/iwdification/animations/ea20/msh2a1.bam deleted file mode 100644 index 0314d44..0000000 Binary files a/iwdification/animations/ea20/msh2a1.bam and /dev/null differ diff --git a/iwdification/animations/ea20/msh2a1e.bam b/iwdification/animations/ea20/msh2a1e.bam deleted file mode 100644 index 3b2399b..0000000 Binary files a/iwdification/animations/ea20/msh2a1e.bam and /dev/null differ diff --git a/iwdification/animations/ea20/msh2a2.bam b/iwdification/animations/ea20/msh2a2.bam deleted file mode 100644 index 73ca386..0000000 Binary files a/iwdification/animations/ea20/msh2a2.bam and /dev/null differ diff --git a/iwdification/animations/ea20/msh2a2e.bam b/iwdification/animations/ea20/msh2a2e.bam deleted file mode 100644 index c684f36..0000000 Binary files a/iwdification/animations/ea20/msh2a2e.bam and /dev/null differ diff --git a/iwdification/animations/ea20/msh2ca.bam b/iwdification/animations/ea20/msh2ca.bam deleted file mode 100644 index 0314d44..0000000 Binary files a/iwdification/animations/ea20/msh2ca.bam and /dev/null differ diff --git a/iwdification/animations/ea20/msh2cae.bam b/iwdification/animations/ea20/msh2cae.bam deleted file mode 100644 index 3b2399b..0000000 Binary files a/iwdification/animations/ea20/msh2cae.bam and /dev/null differ diff --git a/iwdification/animations/ea20/msh2de.bam b/iwdification/animations/ea20/msh2de.bam deleted file mode 100644 index b4e7d4e..0000000 Binary files a/iwdification/animations/ea20/msh2de.bam and /dev/null differ diff --git a/iwdification/animations/ea20/msh2dee.bam b/iwdification/animations/ea20/msh2dee.bam deleted file mode 100644 index 4c5a57f..0000000 Binary files a/iwdification/animations/ea20/msh2dee.bam and /dev/null differ diff --git a/iwdification/animations/ea20/msh2gh.bam b/iwdification/animations/ea20/msh2gh.bam deleted file mode 100644 index 8a7295f..0000000 Binary files a/iwdification/animations/ea20/msh2gh.bam and /dev/null differ diff --git a/iwdification/animations/ea20/msh2ghe.bam b/iwdification/animations/ea20/msh2ghe.bam deleted file mode 100644 index da3c103..0000000 Binary files a/iwdification/animations/ea20/msh2ghe.bam and /dev/null differ diff --git a/iwdification/animations/ea20/msh2gu.bam b/iwdification/animations/ea20/msh2gu.bam deleted file mode 100644 index 2def340..0000000 Binary files a/iwdification/animations/ea20/msh2gu.bam and /dev/null differ diff --git a/iwdification/animations/ea20/msh2gue.bam b/iwdification/animations/ea20/msh2gue.bam deleted file mode 100644 index b9bc917..0000000 Binary files a/iwdification/animations/ea20/msh2gue.bam and /dev/null differ diff --git a/iwdification/animations/ea20/msh2sc.bam b/iwdification/animations/ea20/msh2sc.bam deleted file mode 100644 index 1c64bcd..0000000 Binary files a/iwdification/animations/ea20/msh2sc.bam and /dev/null differ diff --git a/iwdification/animations/ea20/msh2sce.bam b/iwdification/animations/ea20/msh2sce.bam deleted file mode 100644 index 57b2e3e..0000000 Binary files a/iwdification/animations/ea20/msh2sce.bam and /dev/null differ diff --git a/iwdification/animations/ea20/msh2sd.bam b/iwdification/animations/ea20/msh2sd.bam deleted file mode 100644 index 731d049..0000000 Binary files a/iwdification/animations/ea20/msh2sd.bam and /dev/null differ diff --git a/iwdification/animations/ea20/msh2sde.bam b/iwdification/animations/ea20/msh2sde.bam deleted file mode 100644 index 515cbf3..0000000 Binary files a/iwdification/animations/ea20/msh2sde.bam and /dev/null differ diff --git a/iwdification/animations/ea20/msh2sl.bam b/iwdification/animations/ea20/msh2sl.bam deleted file mode 100644 index 7fbb79a..0000000 Binary files a/iwdification/animations/ea20/msh2sl.bam and /dev/null differ diff --git a/iwdification/animations/ea20/msh2sle.bam b/iwdification/animations/ea20/msh2sle.bam deleted file mode 100644 index 3bd84f3..0000000 Binary files a/iwdification/animations/ea20/msh2sle.bam and /dev/null differ diff --git a/iwdification/animations/ea20/msh2sp.bam b/iwdification/animations/ea20/msh2sp.bam deleted file mode 100644 index 1c64bcd..0000000 Binary files a/iwdification/animations/ea20/msh2sp.bam and /dev/null differ diff --git a/iwdification/animations/ea20/msh2spe.bam b/iwdification/animations/ea20/msh2spe.bam deleted file mode 100644 index 57b2e3e..0000000 Binary files a/iwdification/animations/ea20/msh2spe.bam and /dev/null differ diff --git a/iwdification/animations/ea20/msh2tw.bam b/iwdification/animations/ea20/msh2tw.bam deleted file mode 100644 index 026a0a4..0000000 Binary files a/iwdification/animations/ea20/msh2tw.bam and /dev/null differ diff --git a/iwdification/animations/ea20/msh2twe.bam b/iwdification/animations/ea20/msh2twe.bam deleted file mode 100644 index 080959c..0000000 Binary files a/iwdification/animations/ea20/msh2twe.bam and /dev/null differ diff --git a/iwdification/animations/ea20/msh2wk.bam b/iwdification/animations/ea20/msh2wk.bam deleted file mode 100644 index 7e5f5a2..0000000 Binary files a/iwdification/animations/ea20/msh2wk.bam and /dev/null differ diff --git a/iwdification/animations/ea20/msh2wke.bam b/iwdification/animations/ea20/msh2wke.bam deleted file mode 100644 index cb22c3d..0000000 Binary files a/iwdification/animations/ea20/msh2wke.bam and /dev/null differ diff --git a/iwdification/animations/ea20/shadbg01.wav b/iwdification/animations/ea20/shadbg01.wav deleted file mode 100644 index 998bd8f..0000000 Binary files a/iwdification/animations/ea20/shadbg01.wav and /dev/null differ diff --git a/iwdification/animations/ea20/shadbg02.wav b/iwdification/animations/ea20/shadbg02.wav deleted file mode 100644 index a8e15af..0000000 Binary files a/iwdification/animations/ea20/shadbg02.wav and /dev/null differ diff --git a/iwdification/animations/ea20/shadbg03.wav b/iwdification/animations/ea20/shadbg03.wav deleted file mode 100644 index 3bbbf23..0000000 Binary files a/iwdification/animations/ea20/shadbg03.wav and /dev/null differ diff --git a/iwdification/animations/ea20/shadbg04.wav b/iwdification/animations/ea20/shadbg04.wav deleted file mode 100644 index 77e3d2d..0000000 Binary files a/iwdification/animations/ea20/shadbg04.wav and /dev/null differ diff --git a/iwdification/animations/ea20/shadbg07.wav b/iwdification/animations/ea20/shadbg07.wav deleted file mode 100644 index 4bfaa5e..0000000 Binary files a/iwdification/animations/ea20/shadbg07.wav and /dev/null differ diff --git a/iwdification/animations/ea20/shadbg08.wav b/iwdification/animations/ea20/shadbg08.wav deleted file mode 100644 index 7ca97e3..0000000 Binary files a/iwdification/animations/ea20/shadbg08.wav and /dev/null differ diff --git a/iwdification/animations/ea20/shadbg09.wav b/iwdification/animations/ea20/shadbg09.wav deleted file mode 100644 index fa75eec..0000000 Binary files a/iwdification/animations/ea20/shadbg09.wav and /dev/null differ diff --git a/iwdification/animations/ea20/shadbg10.wav b/iwdification/animations/ea20/shadbg10.wav deleted file mode 100644 index 7ad229e..0000000 Binary files a/iwdification/animations/ea20/shadbg10.wav and /dev/null differ diff --git a/iwdification/animations/eb20/bf_md01.wav b/iwdification/animations/eb20/bf_md01.wav deleted file mode 100644 index 64f5174..0000000 Binary files a/iwdification/animations/eb20/bf_md01.wav and /dev/null differ diff --git a/iwdification/animations/eb20/bf_md02.wav b/iwdification/animations/eb20/bf_md02.wav deleted file mode 100644 index 441c655..0000000 Binary files a/iwdification/animations/eb20/bf_md02.wav and /dev/null differ diff --git a/iwdification/animations/eb20/bf_md03.wav b/iwdification/animations/eb20/bf_md03.wav deleted file mode 100644 index 714b141..0000000 Binary files a/iwdification/animations/eb20/bf_md03.wav and /dev/null differ diff --git a/iwdification/animations/eb20/boneg05b.wav b/iwdification/animations/eb20/boneg05b.wav deleted file mode 100644 index af921c3..0000000 Binary files a/iwdification/animations/eb20/boneg05b.wav and /dev/null differ diff --git a/iwdification/animations/eb20/boneg08.wav b/iwdification/animations/eb20/boneg08.wav deleted file mode 100644 index cc1cd30..0000000 Binary files a/iwdification/animations/eb20/boneg08.wav and /dev/null differ diff --git a/iwdification/animations/eb20/mskbca.bam b/iwdification/animations/eb20/mskbca.bam deleted file mode 100644 index de95ca9..0000000 Binary files a/iwdification/animations/eb20/mskbca.bam and /dev/null differ diff --git a/iwdification/animations/eb20/mskbcae.bam b/iwdification/animations/eb20/mskbcae.bam deleted file mode 100644 index d184435..0000000 Binary files a/iwdification/animations/eb20/mskbcae.bam and /dev/null differ diff --git a/iwdification/animations/eb20/mskbsp.bam b/iwdification/animations/eb20/mskbsp.bam deleted file mode 100644 index 8d283e3..0000000 Binary files a/iwdification/animations/eb20/mskbsp.bam and /dev/null differ diff --git a/iwdification/animations/eb20/mskbspe.bam b/iwdification/animations/eb20/mskbspe.bam deleted file mode 100644 index eb34da0..0000000 Binary files a/iwdification/animations/eb20/mskbspe.bam and /dev/null differ diff --git a/iwdification/animations/ee00/bf_sm01.wav b/iwdification/animations/ee00/bf_sm01.wav deleted file mode 100644 index 2bc0729..0000000 Binary files a/iwdification/animations/ee00/bf_sm01.wav and /dev/null differ diff --git a/iwdification/animations/ee00/bf_sm02.wav b/iwdification/animations/ee00/bf_sm02.wav deleted file mode 100644 index 24092dd..0000000 Binary files a/iwdification/animations/ee00/bf_sm02.wav and /dev/null differ diff --git a/iwdification/animations/ee00/bf_sm03.wav b/iwdification/animations/ee00/bf_sm03.wav deleted file mode 100644 index 6450527..0000000 Binary files a/iwdification/animations/ee00/bf_sm03.wav and /dev/null differ diff --git a/iwdification/animations/ee00/mzo2a1.bam b/iwdification/animations/ee00/mzo2a1.bam deleted file mode 100644 index d638552..0000000 Binary files a/iwdification/animations/ee00/mzo2a1.bam and /dev/null differ diff --git a/iwdification/animations/ee00/mzo2a1e.bam b/iwdification/animations/ee00/mzo2a1e.bam deleted file mode 100644 index d4ea8ca..0000000 Binary files a/iwdification/animations/ee00/mzo2a1e.bam and /dev/null differ diff --git a/iwdification/animations/ee00/mzo2a2.bam b/iwdification/animations/ee00/mzo2a2.bam deleted file mode 100644 index d97665f..0000000 Binary files a/iwdification/animations/ee00/mzo2a2.bam and /dev/null differ diff --git a/iwdification/animations/ee00/mzo2a2e.bam b/iwdification/animations/ee00/mzo2a2e.bam deleted file mode 100644 index c94f98a..0000000 Binary files a/iwdification/animations/ee00/mzo2a2e.bam and /dev/null differ diff --git a/iwdification/animations/ee00/mzo2ca.bam b/iwdification/animations/ee00/mzo2ca.bam deleted file mode 100644 index d97665f..0000000 Binary files a/iwdification/animations/ee00/mzo2ca.bam and /dev/null differ diff --git a/iwdification/animations/ee00/mzo2cae.bam b/iwdification/animations/ee00/mzo2cae.bam deleted file mode 100644 index c94f98a..0000000 Binary files a/iwdification/animations/ee00/mzo2cae.bam and /dev/null differ diff --git a/iwdification/animations/ee00/mzo2de.bam b/iwdification/animations/ee00/mzo2de.bam deleted file mode 100644 index 9f3e33c..0000000 Binary files a/iwdification/animations/ee00/mzo2de.bam and /dev/null differ diff --git a/iwdification/animations/ee00/mzo2dee.bam b/iwdification/animations/ee00/mzo2dee.bam deleted file mode 100644 index c98f205..0000000 Binary files a/iwdification/animations/ee00/mzo2dee.bam and /dev/null differ diff --git a/iwdification/animations/ee00/mzo2gh.bam b/iwdification/animations/ee00/mzo2gh.bam deleted file mode 100644 index 67f63f8..0000000 Binary files a/iwdification/animations/ee00/mzo2gh.bam and /dev/null differ diff --git a/iwdification/animations/ee00/mzo2ghe.bam b/iwdification/animations/ee00/mzo2ghe.bam deleted file mode 100644 index e05ab9a..0000000 Binary files a/iwdification/animations/ee00/mzo2ghe.bam and /dev/null differ diff --git a/iwdification/animations/ee00/mzo2gu.bam b/iwdification/animations/ee00/mzo2gu.bam deleted file mode 100644 index 8dc203c..0000000 Binary files a/iwdification/animations/ee00/mzo2gu.bam and /dev/null differ diff --git a/iwdification/animations/ee00/mzo2gue.bam b/iwdification/animations/ee00/mzo2gue.bam deleted file mode 100644 index 21d3180..0000000 Binary files a/iwdification/animations/ee00/mzo2gue.bam and /dev/null differ diff --git a/iwdification/animations/ee00/mzo2sc.bam b/iwdification/animations/ee00/mzo2sc.bam deleted file mode 100644 index 9a57a7c..0000000 Binary files a/iwdification/animations/ee00/mzo2sc.bam and /dev/null differ diff --git a/iwdification/animations/ee00/mzo2sce.bam b/iwdification/animations/ee00/mzo2sce.bam deleted file mode 100644 index 37d1749..0000000 Binary files a/iwdification/animations/ee00/mzo2sce.bam and /dev/null differ diff --git a/iwdification/animations/ee00/mzo2sd.bam b/iwdification/animations/ee00/mzo2sd.bam deleted file mode 100644 index ca343db..0000000 Binary files a/iwdification/animations/ee00/mzo2sd.bam and /dev/null differ diff --git a/iwdification/animations/ee00/mzo2sde.bam b/iwdification/animations/ee00/mzo2sde.bam deleted file mode 100644 index e881c49..0000000 Binary files a/iwdification/animations/ee00/mzo2sde.bam and /dev/null differ diff --git a/iwdification/animations/ee00/mzo2sl.bam b/iwdification/animations/ee00/mzo2sl.bam deleted file mode 100644 index f4a2d4d..0000000 Binary files a/iwdification/animations/ee00/mzo2sl.bam and /dev/null differ diff --git a/iwdification/animations/ee00/mzo2sle.bam b/iwdification/animations/ee00/mzo2sle.bam deleted file mode 100644 index 6103867..0000000 Binary files a/iwdification/animations/ee00/mzo2sle.bam and /dev/null differ diff --git a/iwdification/animations/ee00/mzo2sp.bam b/iwdification/animations/ee00/mzo2sp.bam deleted file mode 100644 index 9a57a7c..0000000 Binary files a/iwdification/animations/ee00/mzo2sp.bam and /dev/null differ diff --git a/iwdification/animations/ee00/mzo2spe.bam b/iwdification/animations/ee00/mzo2spe.bam deleted file mode 100644 index 37d1749..0000000 Binary files a/iwdification/animations/ee00/mzo2spe.bam and /dev/null differ diff --git a/iwdification/animations/ee00/mzo2tw.bam b/iwdification/animations/ee00/mzo2tw.bam deleted file mode 100644 index d5df02c..0000000 Binary files a/iwdification/animations/ee00/mzo2tw.bam and /dev/null differ diff --git a/iwdification/animations/ee00/mzo2twe.bam b/iwdification/animations/ee00/mzo2twe.bam deleted file mode 100644 index d894105..0000000 Binary files a/iwdification/animations/ee00/mzo2twe.bam and /dev/null differ diff --git a/iwdification/animations/ee00/mzo2wk.bam b/iwdification/animations/ee00/mzo2wk.bam deleted file mode 100644 index a321619..0000000 Binary files a/iwdification/animations/ee00/mzo2wk.bam and /dev/null differ diff --git a/iwdification/animations/ee00/mzo2wke.bam b/iwdification/animations/ee00/mzo2wke.bam deleted file mode 100644 index c25f3b2..0000000 Binary files a/iwdification/animations/ee00/mzo2wke.bam and /dev/null differ diff --git a/iwdification/animations/ee00/zomwor01.wav b/iwdification/animations/ee00/zomwor01.wav deleted file mode 100644 index 43823e7..0000000 Binary files a/iwdification/animations/ee00/zomwor01.wav and /dev/null differ diff --git a/iwdification/animations/ee00/zomwor02.wav b/iwdification/animations/ee00/zomwor02.wav deleted file mode 100644 index 09f7ec8..0000000 Binary files a/iwdification/animations/ee00/zomwor02.wav and /dev/null differ diff --git a/iwdification/animations/ee00/zomwor03.wav b/iwdification/animations/ee00/zomwor03.wav deleted file mode 100644 index 55e6344..0000000 Binary files a/iwdification/animations/ee00/zomwor03.wav and /dev/null differ diff --git a/iwdification/animations/ee00/zomwor04.wav b/iwdification/animations/ee00/zomwor04.wav deleted file mode 100644 index 0fb9fa3..0000000 Binary files a/iwdification/animations/ee00/zomwor04.wav and /dev/null differ diff --git a/iwdification/animations/ee00/zomwor07.wav b/iwdification/animations/ee00/zomwor07.wav deleted file mode 100644 index 5344ceb..0000000 Binary files a/iwdification/animations/ee00/zomwor07.wav and /dev/null differ diff --git a/iwdification/animations/ee00/zomwor08.wav b/iwdification/animations/ee00/zomwor08.wav deleted file mode 100644 index 0a0fb9c..0000000 Binary files a/iwdification/animations/ee00/zomwor08.wav and /dev/null differ diff --git a/iwdification/animations/ee00/zomwor09.wav b/iwdification/animations/ee00/zomwor09.wav deleted file mode 100644 index 50a6d41..0000000 Binary files a/iwdification/animations/ee00/zomwor09.wav and /dev/null differ diff --git a/iwdification/animations/ee00/zomwor10.wav b/iwdification/animations/ee00/zomwor10.wav deleted file mode 100644 index 499e65f..0000000 Binary files a/iwdification/animations/ee00/zomwor10.wav and /dev/null differ diff --git a/iwdification/baf/cdia528.baf b/iwdification/baf/cdia528.baf deleted file mode 100644 index 1c88574..0000000 --- a/iwdification/baf/cdia528.baf +++ /dev/null @@ -1,11 +0,0 @@ -IF - NumTimesTalkedTo(0) - Detect([PC]) - !Allegiance(Myself,ENEMY) - !StateCheck(Myself,STATE_REALLY_DEAD) -THEN - RESPONSE #100 - FaceObject(LastSummonerOf(Myself)) - StartDialogNoSet(LastSummonerOf(Myself)) -END - diff --git a/iwdification/baf/cdibbcld.baf b/iwdification/baf/cdibbcld.baf deleted file mode 100644 index 70bc026..0000000 --- a/iwdification/baf/cdibbcld.baf +++ /dev/null @@ -1,21 +0,0 @@ -IF - !Global("BBCLOUD_inactive","LOCALS",1) - Global("Internal4","LOCALS",2) -THEN - RESPONSE #100 - SetGlobal("BBCLOUD_inactive","LOCALS",1) -END - -IF - !Global("BBCLOUD_inactive","LOCALS",1) - !GlobalTimerNotExpired("#localtimer","LOCALS") - See(NearestEnemyOf(Myself)) - Range(NearestEnemyOf(Myself),5) -THEN - RESPONSE #100 - IncrementGlobal("Internal4","LOCALS",1) - SetGlobalTimer("#localtimer","LOCALS",21) - ReallyForceSpellRES("cdibombb",Myself) - Wait(2) -END - diff --git a/iwdification/baf/cdid617.baf b/iwdification/baf/cdid617.baf deleted file mode 100644 index fd1a3b2..0000000 --- a/iwdification/baf/cdid617.baf +++ /dev/null @@ -1,31 +0,0 @@ -IF - Global("init","LOCALS",0) -THEN - RESPONSE #100 - SetGlobal("init","LOCALS",1) - SetGlobalTimer("GoAway","LOCALS",30) -END - -IF - GlobalTimerExpired("GoAway","LOCALS") -THEN - RESPONSE #100 - DestroySelf() -END - - -IF - !Allegiance(Myself,NEUTRAL) -THEN - RESPONSE #100 - ChangeEnemyAlly(Myself,NEUTRAL) -END - -IF - True() -THEN - RESPONSE #100 - RandomWalk() -END - - diff --git a/iwdification/baf/cdipspid.baf b/iwdification/baf/cdipspid.baf deleted file mode 100644 index 8553d90..0000000 --- a/iwdification/baf/cdipspid.baf +++ /dev/null @@ -1,8 +0,0 @@ -IF - See(NearestEnemyOf(Myself)) - !Range(NearestEnemyOf(Myself),12) -THEN - RESPONSE #100 - ReallyForceSpellRES("cdiphase",NearestEnemyOf(Myself)) // spin186 -END - diff --git a/iwdification/baf/cdisalfi.baf b/iwdification/baf/cdisalfi.baf deleted file mode 100644 index 2ab5781..0000000 --- a/iwdification/baf/cdisalfi.baf +++ /dev/null @@ -1,10 +0,0 @@ -IF - !Global("SAFIRE_inactive","LOCALS",1) - !Global("CREATURE_STATE_VARBit19","LOCALS",1) -THEN - RESPONSE #100 - ReallyForceSpellRES("cdisalfi",Myself) // spin194 - SetGlobal("CREATURE_STATE_VARBit19","LOCALS",1) - SetGlobal("SAFIRE_inactive","LOCALS",1) -END - diff --git a/iwdification/baf/cdisalfr.baf b/iwdification/baf/cdisalfr.baf deleted file mode 100644 index 5d79b76..0000000 --- a/iwdification/baf/cdisalfr.baf +++ /dev/null @@ -1,10 +0,0 @@ -IF - !Global("SAFROST_inactive","LOCALS",1) - !Global("CREATURE_STATE_VARBit19","LOCALS",1) -THEN - RESPONSE #100 - ReallyForceSpellRES("cdisalfr",Myself) // spin193 - SetGlobal("CREATURE_STATE_VARBit19","LOCALS",1) - SetGlobal("SAFROST_inactive","LOCALS",1) -END - diff --git a/iwdification/baf/cdishamb.baf b/iwdification/baf/cdishamb.baf deleted file mode 100644 index d9d8612..0000000 --- a/iwdification/baf/cdishamb.baf +++ /dev/null @@ -1,7 +0,0 @@ -IF - See(NearestEnemyOf(Myself)) -THEN - RESPONSE #100 - AttackReevaluate(LastSeenBy(Myself),75) -END - diff --git a/iwdification/baf/cdiuhgaz.baf b/iwdification/baf/cdiuhgaz.baf deleted file mode 100644 index 3fbf3d5..0000000 --- a/iwdification/baf/cdiuhgaz.baf +++ /dev/null @@ -1,10 +0,0 @@ -IF - !Global("UHGAZE_inactive","LOCALS",1) - LOS([PC],25) -THEN - RESPONSE #100 - ReallyForceSpellRES("cdiumbr1",Myself) - Wait(2) - SetGlobal("UHGAZE_inactive","LOCALS",1) -END - diff --git a/iwdification/bam/blank.bam b/iwdification/bam/blank.bam new file mode 100644 index 0000000..f5db7ec Binary files /dev/null and b/iwdification/bam/blank.bam differ diff --git a/iwdification/bam/cdia225d.bam b/iwdification/bam/cdia225d.bam deleted file mode 100644 index 731c557..0000000 Binary files a/iwdification/bam/cdia225d.bam and /dev/null differ diff --git a/iwdification/bam/cdia422d.bam b/iwdification/bam/cdia422d.bam deleted file mode 100644 index 28bcf1b..0000000 Binary files a/iwdification/bam/cdia422d.bam and /dev/null differ diff --git a/iwdification/bam/cdia427d.bam b/iwdification/bam/cdia427d.bam deleted file mode 100644 index b5af5ea..0000000 Binary files a/iwdification/bam/cdia427d.bam and /dev/null differ diff --git a/iwdification/bam/cdia429d.bam b/iwdification/bam/cdia429d.bam deleted file mode 100644 index bcdcda3..0000000 Binary files a/iwdification/bam/cdia429d.bam and /dev/null differ diff --git a/iwdification/bam/cdia480.bam b/iwdification/bam/cdia480.bam new file mode 100644 index 0000000..b0ef55c Binary files /dev/null and b/iwdification/bam/cdia480.bam differ diff --git a/iwdification/bam/cdia481.bam b/iwdification/bam/cdia481.bam new file mode 100644 index 0000000..e93c491 Binary files /dev/null and b/iwdification/bam/cdia481.bam differ diff --git a/iwdification/bam/cdia482.bam b/iwdification/bam/cdia482.bam new file mode 100644 index 0000000..939e994 Binary files /dev/null and b/iwdification/bam/cdia482.bam differ diff --git a/iwdification/bam/cdia524d.bam b/iwdification/bam/cdia524d.bam deleted file mode 100644 index 3984e6c..0000000 Binary files a/iwdification/bam/cdia524d.bam and /dev/null differ diff --git a/iwdification/bam/cdia528a.bam b/iwdification/bam/cdia528a.bam deleted file mode 100644 index b20dcbb..0000000 Binary files a/iwdification/bam/cdia528a.bam and /dev/null differ diff --git a/iwdification/bam/cdia528b.bam b/iwdification/bam/cdia528b.bam deleted file mode 100644 index 30c5a4c..0000000 Binary files a/iwdification/bam/cdia528b.bam and /dev/null differ diff --git a/iwdification/bam/cdia528c.bam b/iwdification/bam/cdia528c.bam deleted file mode 100644 index 263ed09..0000000 Binary files a/iwdification/bam/cdia528c.bam and /dev/null differ diff --git a/iwdification/bam/cdia610d.bam b/iwdification/bam/cdia610d.bam deleted file mode 100644 index 1a6a1fc..0000000 Binary files a/iwdification/bam/cdia610d.bam and /dev/null differ diff --git a/iwdification/bam/cdia802d.bam b/iwdification/bam/cdia802d.bam deleted file mode 100644 index 6073702..0000000 Binary files a/iwdification/bam/cdia802d.bam and /dev/null differ diff --git a/iwdification/bam/cdia814d.bam b/iwdification/bam/cdia814d.bam deleted file mode 100644 index 6cb0115..0000000 Binary files a/iwdification/bam/cdia814d.bam and /dev/null differ diff --git a/iwdification/bam/cdiabjur.bam b/iwdification/bam/cdiabjur.bam deleted file mode 100644 index 87db4fa..0000000 Binary files a/iwdification/bam/cdiabjur.bam and /dev/null differ diff --git a/iwdification/bam/cdiabjux.bam b/iwdification/bam/cdiabjux.bam deleted file mode 100644 index 22371c1..0000000 Binary files a/iwdification/bam/cdiabjux.bam and /dev/null differ diff --git a/iwdification/bam/cdiacid.bam b/iwdification/bam/cdiacid.bam deleted file mode 100644 index b362035..0000000 Binary files a/iwdification/bam/cdiacid.bam and /dev/null differ diff --git a/iwdification/bam/cdialter.bam b/iwdification/bam/cdialter.bam deleted file mode 100644 index 28920a9..0000000 Binary files a/iwdification/bam/cdialter.bam and /dev/null differ diff --git a/iwdification/bam/cdiare1x.bam b/iwdification/bam/cdiare1x.bam deleted file mode 100644 index ad16009..0000000 Binary files a/iwdification/bam/cdiare1x.bam and /dev/null differ diff --git a/iwdification/bam/cdiasm1x.bam b/iwdification/bam/cdiasm1x.bam deleted file mode 100644 index c7729ce..0000000 Binary files a/iwdification/bam/cdiasm1x.bam and /dev/null differ diff --git a/iwdification/bam/cdiastra.bam b/iwdification/bam/cdiastra.bam deleted file mode 100644 index 5f83629..0000000 Binary files a/iwdification/bam/cdiastra.bam and /dev/null differ diff --git a/iwdification/bam/cdiastrx.bam b/iwdification/bam/cdiastrx.bam deleted file mode 100644 index 184d1f8..0000000 Binary files a/iwdification/bam/cdiastrx.bam and /dev/null differ diff --git a/iwdification/bam/cdibacld.bam b/iwdification/bam/cdibacld.bam deleted file mode 100644 index 336f0ff..0000000 Binary files a/iwdification/bam/cdibacld.bam and /dev/null differ diff --git a/iwdification/bam/cdibar0.bam b/iwdification/bam/cdibar0.bam deleted file mode 100644 index cff45ad..0000000 Binary files a/iwdification/bam/cdibar0.bam and /dev/null differ diff --git a/iwdification/bam/cdibara.bam b/iwdification/bam/cdibara.bam deleted file mode 100644 index b321714..0000000 Binary files a/iwdification/bam/cdibara.bam and /dev/null differ diff --git a/iwdification/bam/cdibarb.bam b/iwdification/bam/cdibarb.bam deleted file mode 100644 index 442d9d5..0000000 Binary files a/iwdification/bam/cdibarb.bam and /dev/null differ diff --git a/iwdification/bam/cdibarc.bam b/iwdification/bam/cdibarc.bam deleted file mode 100644 index a9643fd..0000000 Binary files a/iwdification/bam/cdibarc.bam and /dev/null differ diff --git a/iwdification/bam/cdibard.bam b/iwdification/bam/cdibard.bam deleted file mode 100644 index 50e71f1..0000000 Binary files a/iwdification/bam/cdibard.bam and /dev/null differ diff --git a/iwdification/bam/cdibare.bam b/iwdification/bam/cdibare.bam deleted file mode 100644 index 33575d2..0000000 Binary files a/iwdification/bam/cdibare.bam and /dev/null differ diff --git a/iwdification/bam/cdibarf.bam b/iwdification/bam/cdibarf.bam deleted file mode 100644 index 5f40ca4..0000000 Binary files a/iwdification/bam/cdibarf.bam and /dev/null differ diff --git a/iwdification/bam/cdibhcld.bam b/iwdification/bam/cdibhcld.bam deleted file mode 100644 index 0dd205a..0000000 Binary files a/iwdification/bam/cdibhcld.bam and /dev/null differ diff --git a/iwdification/bam/cdibone1.bam b/iwdification/bam/cdibone1.bam deleted file mode 100644 index 349c33b..0000000 Binary files a/iwdification/bam/cdibone1.bam and /dev/null differ diff --git a/iwdification/bam/cdibone2.bam b/iwdification/bam/cdibone2.bam deleted file mode 100644 index d28bc8b..0000000 Binary files a/iwdification/bam/cdibone2.bam and /dev/null differ diff --git a/iwdification/bam/cdiceelx.bam b/iwdification/bam/cdiceelx.bam deleted file mode 100644 index d9581c9..0000000 Binary files a/iwdification/bam/cdiceelx.bam and /dev/null differ diff --git a/iwdification/bam/cdicfelx.bam b/iwdification/bam/cdicfelx.bam deleted file mode 100644 index a291049..0000000 Binary files a/iwdification/bam/cdicfelx.bam and /dev/null differ diff --git a/iwdification/bam/cdicldam.bam b/iwdification/bam/cdicldam.bam deleted file mode 100644 index 0261cd9..0000000 Binary files a/iwdification/bam/cdicldam.bam and /dev/null differ diff --git a/iwdification/bam/cdicmdam.bam b/iwdification/bam/cdicmdam.bam deleted file mode 100644 index e7089b3..0000000 Binary files a/iwdification/bam/cdicmdam.bam and /dev/null differ diff --git a/iwdification/bam/cdicmwou.bam b/iwdification/bam/cdicmwou.bam deleted file mode 100644 index d8e43d4..0000000 Binary files a/iwdification/bam/cdicmwou.bam and /dev/null differ diff --git a/iwdification/bam/cdiconju.bam b/iwdification/bam/cdiconju.bam deleted file mode 100644 index 36407c1..0000000 Binary files a/iwdification/bam/cdiconju.bam and /dev/null differ diff --git a/iwdification/bam/cdicopes.bam b/iwdification/bam/cdicopes.bam deleted file mode 100644 index ea42fec..0000000 Binary files a/iwdification/bam/cdicopes.bam and /dev/null differ diff --git a/iwdification/bam/cdicurse.bam b/iwdification/bam/cdicurse.bam deleted file mode 100644 index 899844b..0000000 Binary files a/iwdification/bam/cdicurse.bam and /dev/null differ diff --git a/iwdification/bam/cdicwelx.bam b/iwdification/bam/cdicwelx.bam deleted file mode 100644 index 98f7a55..0000000 Binary files a/iwdification/bam/cdicwelx.bam and /dev/null differ diff --git a/iwdification/bam/cdid316d.bam b/iwdification/bam/cdid316d.bam deleted file mode 100644 index 8750c35..0000000 Binary files a/iwdification/bam/cdid316d.bam and /dev/null differ diff --git a/iwdification/bam/cdid321d.bam b/iwdification/bam/cdid321d.bam deleted file mode 100644 index 1cb1aba..0000000 Binary files a/iwdification/bam/cdid321d.bam and /dev/null differ diff --git a/iwdification/bam/cdid325v.bam b/iwdification/bam/cdid325v.bam deleted file mode 100644 index b88bce8..0000000 Binary files a/iwdification/bam/cdid325v.bam and /dev/null differ diff --git a/iwdification/bam/cdid327d.bam b/iwdification/bam/cdid327d.bam deleted file mode 100644 index 219bbfe..0000000 Binary files a/iwdification/bam/cdid327d.bam and /dev/null differ diff --git a/iwdification/bam/cdid420d.bam b/iwdification/bam/cdid420d.bam deleted file mode 100644 index 9fd4cd0..0000000 Binary files a/iwdification/bam/cdid420d.bam and /dev/null differ diff --git a/iwdification/bam/cdid422d.bam b/iwdification/bam/cdid422d.bam deleted file mode 100644 index 0be179a..0000000 Binary files a/iwdification/bam/cdid422d.bam and /dev/null differ diff --git a/iwdification/bam/cdid520d.bam b/iwdification/bam/cdid520d.bam deleted file mode 100644 index d594e89..0000000 Binary files a/iwdification/bam/cdid520d.bam and /dev/null differ diff --git a/iwdification/bam/cdid522d.bam b/iwdification/bam/cdid522d.bam deleted file mode 100644 index e529f9d..0000000 Binary files a/iwdification/bam/cdid522d.bam and /dev/null differ diff --git a/iwdification/bam/cdid615d.bam b/iwdification/bam/cdid615d.bam deleted file mode 100644 index 1cae10f..0000000 Binary files a/iwdification/bam/cdid615d.bam and /dev/null differ diff --git a/iwdification/bam/cdid617v.bam b/iwdification/bam/cdid617v.bam deleted file mode 100644 index dd26f6e..0000000 Binary files a/iwdification/bam/cdid617v.bam and /dev/null differ diff --git a/iwdification/bam/cdid714d.bam b/iwdification/bam/cdid714d.bam deleted file mode 100644 index e7aba15..0000000 Binary files a/iwdification/bam/cdid714d.bam and /dev/null differ diff --git a/iwdification/bam/cdid733d.bam b/iwdification/bam/cdid733d.bam deleted file mode 100644 index 29ec7cd..0000000 Binary files a/iwdification/bam/cdid733d.bam and /dev/null differ diff --git a/iwdification/bam/cdid735d.bam b/iwdification/bam/cdid735d.bam deleted file mode 100644 index 208866c..0000000 Binary files a/iwdification/bam/cdid735d.bam and /dev/null differ diff --git a/iwdification/bam/cdid739a.bam b/iwdification/bam/cdid739a.bam deleted file mode 100644 index e8f729d..0000000 Binary files a/iwdification/bam/cdid739a.bam and /dev/null differ diff --git a/iwdification/bam/cdid739b.bam b/iwdification/bam/cdid739b.bam deleted file mode 100644 index eebff5d..0000000 Binary files a/iwdification/bam/cdid739b.bam and /dev/null differ diff --git a/iwdification/bam/cdid739c.bam b/iwdification/bam/cdid739c.bam deleted file mode 100644 index 6354254..0000000 Binary files a/iwdification/bam/cdid739c.bam and /dev/null differ diff --git a/iwdification/bam/cdidestr.bam b/iwdification/bam/cdidestr.bam deleted file mode 100644 index 437a44f..0000000 Binary files a/iwdification/bam/cdidestr.bam and /dev/null differ diff --git a/iwdification/bam/cdidise.bam b/iwdification/bam/cdidise.bam deleted file mode 100644 index 8288e96..0000000 Binary files a/iwdification/bam/cdidise.bam and /dev/null differ diff --git a/iwdification/bam/cdidivin.bam b/iwdification/bam/cdidivin.bam deleted file mode 100644 index a94dd30..0000000 Binary files a/iwdification/bam/cdidivin.bam and /dev/null differ diff --git a/iwdification/bam/cdidoorh.bam b/iwdification/bam/cdidoorh.bam deleted file mode 100644 index c1ff97e..0000000 Binary files a/iwdification/bam/cdidoorh.bam and /dev/null differ diff --git a/iwdification/bam/cdidrbr.bam b/iwdification/bam/cdidrbr.bam new file mode 100644 index 0000000..1278721 Binary files /dev/null and b/iwdification/bam/cdidrbr.bam differ diff --git a/iwdification/bam/cdidrbrb.bam b/iwdification/bam/cdidrbrb.bam new file mode 100644 index 0000000..6469aff Binary files /dev/null and b/iwdification/bam/cdidrbrb.bam differ diff --git a/iwdification/bam/cdidree.bam b/iwdification/bam/cdidree.bam new file mode 100644 index 0000000..501befd Binary files /dev/null and b/iwdification/bam/cdidree.bam differ diff --git a/iwdification/bam/cdidreeb.bam b/iwdification/bam/cdidreeb.bam new file mode 100644 index 0000000..b8e2133 Binary files /dev/null and b/iwdification/bam/cdidreeb.bam differ diff --git a/iwdification/bam/cdidrfe.bam b/iwdification/bam/cdidrfe.bam new file mode 100644 index 0000000..05ac4be Binary files /dev/null and b/iwdification/bam/cdidrfe.bam differ diff --git a/iwdification/bam/cdidrfeb.bam b/iwdification/bam/cdidrfeb.bam new file mode 100644 index 0000000..513c12b Binary files /dev/null and b/iwdification/bam/cdidrfeb.bam differ diff --git a/iwdification/bam/cdidrwe.bam b/iwdification/bam/cdidrwe.bam new file mode 100644 index 0000000..8665b54 Binary files /dev/null and b/iwdification/bam/cdidrwe.bam differ diff --git a/iwdification/bam/cdidrweb.bam b/iwdification/bam/cdidrweb.bam new file mode 100644 index 0000000..c08b8c3 Binary files /dev/null and b/iwdification/bam/cdidrweb.bam differ diff --git a/iwdification/bam/cdiencha.bam b/iwdification/bam/cdiencha.bam deleted file mode 100644 index 86f4c4b..0000000 Binary files a/iwdification/bam/cdiencha.bam and /dev/null differ diff --git a/iwdification/bam/cdienchx.bam b/iwdification/bam/cdienchx.bam deleted file mode 100644 index 64298c4..0000000 Binary files a/iwdification/bam/cdienchx.bam and /dev/null differ diff --git a/iwdification/bam/cdieshld.bam b/iwdification/bam/cdieshld.bam deleted file mode 100644 index 0d0b13b..0000000 Binary files a/iwdification/bam/cdieshld.bam and /dev/null differ diff --git a/iwdification/bam/cdiexalt.bam b/iwdification/bam/cdiexalt.bam deleted file mode 100644 index 9704513..0000000 Binary files a/iwdification/bam/cdiexalt.bam and /dev/null differ diff --git a/iwdification/bam/cdiiceln.bam b/iwdification/bam/cdiiceln.bam deleted file mode 100644 index 88c6225..0000000 Binary files a/iwdification/bam/cdiiceln.bam and /dev/null differ diff --git a/iwdification/bam/cdiinvoc.bam b/iwdification/bam/cdiinvoc.bam deleted file mode 100644 index 38790d4..0000000 Binary files a/iwdification/bam/cdiinvoc.bam and /dev/null differ diff --git a/iwdification/bam/cdilanct.bam b/iwdification/bam/cdilanct.bam deleted file mode 100644 index 5cd7c6c..0000000 Binary files a/iwdification/bam/cdilanct.bam and /dev/null differ diff --git a/iwdification/bam/cdiliten.bam b/iwdification/bam/cdiliten.bam deleted file mode 100644 index ba11f78..0000000 Binary files a/iwdification/bam/cdiliten.bam and /dev/null differ diff --git a/iwdification/bam/cdilodis.bam b/iwdification/bam/cdilodis.bam deleted file mode 100644 index 5cd7c6c..0000000 Binary files a/iwdification/bam/cdilodis.bam and /dev/null differ diff --git a/iwdification/bam/cdimagrx.bam b/iwdification/bam/cdimagrx.bam deleted file mode 100644 index 3949f91..0000000 Binary files a/iwdification/bam/cdimagrx.bam and /dev/null differ diff --git a/iwdification/bam/cdimfmsx.bam b/iwdification/bam/cdimfmsx.bam deleted file mode 100644 index 46ff85e..0000000 Binary files a/iwdification/bam/cdimfmsx.bam and /dev/null differ diff --git a/iwdification/bam/cdimfmt.bam b/iwdification/bam/cdimfmt.bam deleted file mode 100644 index be253e0..0000000 Binary files a/iwdification/bam/cdimfmt.bam and /dev/null differ diff --git a/iwdification/bam/cdimoldt.bam b/iwdification/bam/cdimoldt.bam deleted file mode 100644 index 38ffaf9..0000000 Binary files a/iwdification/bam/cdimoldt.bam and /dev/null differ diff --git a/iwdification/bam/cdimoonx.bam b/iwdification/bam/cdimoonx.bam deleted file mode 100644 index 62db72d..0000000 Binary files a/iwdification/bam/cdimoonx.bam and /dev/null differ diff --git a/iwdification/bam/cdimrage.bam b/iwdification/bam/cdimrage.bam deleted file mode 100644 index 650438a..0000000 Binary files a/iwdification/bam/cdimrage.bam and /dev/null differ diff --git a/iwdification/bam/cdimsm1x.bam b/iwdification/bam/cdimsm1x.bam deleted file mode 100644 index 9eed1c6..0000000 Binary files a/iwdification/bam/cdimsm1x.bam and /dev/null differ diff --git a/iwdification/bam/cdinecro.bam b/iwdification/bam/cdinecro.bam deleted file mode 100644 index 8501507..0000000 Binary files a/iwdification/bam/cdinecro.bam and /dev/null differ diff --git a/iwdification/bam/cdiofspt.bam b/iwdification/bam/cdiofspt.bam deleted file mode 100644 index 0f8ec7d..0000000 Binary files a/iwdification/bam/cdiofspt.bam and /dev/null differ diff --git a/iwdification/bam/cdiparal.bam b/iwdification/bam/cdiparal.bam deleted file mode 100644 index cede3be..0000000 Binary files a/iwdification/bam/cdiparal.bam and /dev/null differ diff --git a/iwdification/bam/cdipfira.bam b/iwdification/bam/cdipfira.bam deleted file mode 100644 index 523460b..0000000 Binary files a/iwdification/bam/cdipfira.bam and /dev/null differ diff --git a/iwdification/bam/cdipfirx.bam b/iwdification/bam/cdipfirx.bam deleted file mode 100644 index 161f7a5..0000000 Binary files a/iwdification/bam/cdipfirx.bam and /dev/null differ diff --git a/iwdification/bam/cdiplseb.bam b/iwdification/bam/cdiplseb.bam new file mode 100644 index 0000000..7f88a13 Binary files /dev/null and b/iwdification/bam/cdiplseb.bam differ diff --git a/iwdification/bam/cdiplsec.bam b/iwdification/bam/cdiplsec.bam new file mode 100644 index 0000000..8837681 Binary files /dev/null and b/iwdification/bam/cdiplsec.bam differ diff --git a/iwdification/bam/cdiplyww.bam b/iwdification/bam/cdiplyww.bam deleted file mode 100644 index b962a14..0000000 Binary files a/iwdification/bam/cdiplyww.bam and /dev/null differ diff --git a/iwdification/bam/cdiprayh.bam b/iwdification/bam/cdiprayh.bam deleted file mode 100644 index 06f82a1..0000000 Binary files a/iwdification/bam/cdiprayh.bam and /dev/null differ diff --git a/iwdification/bam/cdirecih.bam b/iwdification/bam/cdirecih.bam deleted file mode 100644 index bfd72a6..0000000 Binary files a/iwdification/bam/cdirecih.bam and /dev/null differ diff --git a/iwdification/bam/cdirwtfh.bam b/iwdification/bam/cdirwtfh.bam deleted file mode 100644 index 18436b0..0000000 Binary files a/iwdification/bam/cdirwtfh.bam and /dev/null differ diff --git a/iwdification/bam/cdisalfi.bam b/iwdification/bam/cdisalfi.bam deleted file mode 100644 index 7dd1597..0000000 Binary files a/iwdification/bam/cdisalfi.bam and /dev/null differ diff --git a/iwdification/bam/cdisalfr.bam b/iwdification/bam/cdisalfr.bam deleted file mode 100644 index e172dd3..0000000 Binary files a/iwdification/bam/cdisalfr.bam and /dev/null differ diff --git a/iwdification/bam/cdisclda.bam b/iwdification/bam/cdisclda.bam deleted file mode 100644 index 4908e33..0000000 Binary files a/iwdification/bam/cdisclda.bam and /dev/null differ diff --git a/iwdification/bam/cdiscldr.bam b/iwdification/bam/cdiscldr.bam deleted file mode 100644 index fe6b7aa..0000000 Binary files a/iwdification/bam/cdiscldr.bam and /dev/null differ diff --git a/iwdification/bam/cdiseata.bam b/iwdification/bam/cdiseata.bam deleted file mode 100644 index 6d1fcf0..0000000 Binary files a/iwdification/bam/cdiseata.bam and /dev/null differ diff --git a/iwdification/bam/cdiseath.bam b/iwdification/bam/cdiseath.bam deleted file mode 100644 index fdaa438..0000000 Binary files a/iwdification/bam/cdiseath.bam and /dev/null differ diff --git a/iwdification/bam/cdisgrwa.bam b/iwdification/bam/cdisgrwa.bam deleted file mode 100644 index 2146369..0000000 Binary files a/iwdification/bam/cdisgrwa.bam and /dev/null differ diff --git a/iwdification/bam/cdisgrwx.bam b/iwdification/bam/cdisgrwx.bam deleted file mode 100644 index 598609b..0000000 Binary files a/iwdification/bam/cdisgrwx.bam and /dev/null differ diff --git a/iwdification/bam/cdishelc.bam b/iwdification/bam/cdishelc.bam deleted file mode 100644 index 96530de..0000000 Binary files a/iwdification/bam/cdishelc.bam and /dev/null differ diff --git a/iwdification/bam/cdishglp.bam b/iwdification/bam/cdishglp.bam deleted file mode 100644 index 893f3a8..0000000 Binary files a/iwdification/bam/cdishglp.bam and /dev/null differ diff --git a/iwdification/bam/cdishmbl.bam b/iwdification/bam/cdishmbl.bam deleted file mode 100644 index 2737faa..0000000 Binary files a/iwdification/bam/cdishmbl.bam and /dev/null differ diff --git a/iwdification/bam/cdisofl.bam b/iwdification/bam/cdisofl.bam deleted file mode 100644 index ccaf15f..0000000 Binary files a/iwdification/bam/cdisofl.bam and /dev/null differ diff --git a/iwdification/bam/cdisohx.bam b/iwdification/bam/cdisohx.bam deleted file mode 100644 index c2b6b89..0000000 Binary files a/iwdification/bam/cdisohx.bam and /dev/null differ diff --git a/iwdification/bam/cdisshel.bam b/iwdification/bam/cdisshel.bam deleted file mode 100644 index 96530de..0000000 Binary files a/iwdification/bam/cdisshel.bam and /dev/null differ diff --git a/iwdification/bam/cdissswx.bam b/iwdification/bam/cdissswx.bam deleted file mode 100644 index c6d5214..0000000 Binary files a/iwdification/bam/cdissswx.bam and /dev/null differ diff --git a/iwdification/bam/cdistath.bam b/iwdification/bam/cdistath.bam deleted file mode 100644 index 752c629..0000000 Binary files a/iwdification/bam/cdistath.bam and /dev/null differ diff --git a/iwdification/bam/cdisuffo.bam b/iwdification/bam/cdisuffo.bam deleted file mode 100644 index 7a37cf0..0000000 Binary files a/iwdification/bam/cdisuffo.bam and /dev/null differ diff --git a/iwdification/bam/cdiswarr.bam b/iwdification/bam/cdiswarr.bam deleted file mode 100644 index 61d025e..0000000 Binary files a/iwdification/bam/cdiswarr.bam and /dev/null differ diff --git a/iwdification/bam/cdiswart.bam b/iwdification/bam/cdiswart.bam deleted file mode 100644 index 119f4d7..0000000 Binary files a/iwdification/bam/cdiswart.bam and /dev/null differ diff --git a/iwdification/bam/cdiswavh.bam b/iwdification/bam/cdiswavh.bam deleted file mode 100644 index f3dee0d..0000000 Binary files a/iwdification/bam/cdiswavh.bam and /dev/null differ diff --git a/iwdification/bam/cdiswavx.bam b/iwdification/bam/cdiswavx.bam deleted file mode 100644 index d5c3b92..0000000 Binary files a/iwdification/bam/cdiswavx.bam and /dev/null differ diff --git a/iwdification/bam/cditspra.bam b/iwdification/bam/cditspra.bam deleted file mode 100644 index b049051..0000000 Binary files a/iwdification/bam/cditspra.bam and /dev/null differ diff --git a/iwdification/bam/cdivitst.bam b/iwdification/bam/cdivitst.bam deleted file mode 100644 index 33f77c4..0000000 Binary files a/iwdification/bam/cdivitst.bam and /dev/null differ diff --git a/iwdification/bam/cdivitsx.bam b/iwdification/bam/cdivitsx.bam deleted file mode 100644 index 471031f..0000000 Binary files a/iwdification/bam/cdivitsx.bam and /dev/null differ diff --git a/iwdification/bam/cdiwhirx.bam b/iwdification/bam/cdiwhirx.bam deleted file mode 100644 index 7d1f64f..0000000 Binary files a/iwdification/bam/cdiwhirx.bam and /dev/null differ diff --git a/iwdification/bam/coldh.bam b/iwdification/bam/coldh.bam new file mode 100644 index 0000000..1fb5291 Binary files /dev/null and b/iwdification/bam/coldh.bam differ diff --git a/iwdification/bam/coldl.bam b/iwdification/bam/coldl.bam new file mode 100644 index 0000000..d3ca56b Binary files /dev/null and b/iwdification/bam/coldl.bam differ diff --git a/iwdification/bam/electrh.bam b/iwdification/bam/electrh.bam new file mode 100644 index 0000000..15c8d66 Binary files /dev/null and b/iwdification/bam/electrh.bam differ diff --git a/iwdification/bam/electrl.bam b/iwdification/bam/electrl.bam new file mode 100644 index 0000000..c3a9534 Binary files /dev/null and b/iwdification/bam/electrl.bam differ diff --git a/iwdification/bam/fireh.bam b/iwdification/bam/fireh.bam new file mode 100644 index 0000000..c0d37a8 Binary files /dev/null and b/iwdification/bam/fireh.bam differ diff --git a/iwdification/bam/firel.bam b/iwdification/bam/firel.bam new file mode 100644 index 0000000..7f09b3d Binary files /dev/null and b/iwdification/bam/firel.bam differ diff --git a/iwdification/cre/cdi3sklm.cre b/iwdification/cre/cdi3sklm.cre deleted file mode 100644 index f92d32d..0000000 Binary files a/iwdification/cre/cdi3sklm.cre and /dev/null differ diff --git a/iwdification/cre/cdi4ghst.cre b/iwdification/cre/cdi4ghst.cre deleted file mode 100644 index ed1f011..0000000 Binary files a/iwdification/cre/cdi4ghst.cre and /dev/null differ diff --git a/iwdification/cre/cdi4ogre.cre b/iwdification/cre/cdi4ogre.cre deleted file mode 100644 index b2330bb..0000000 Binary files a/iwdification/cre/cdi4ogre.cre and /dev/null differ diff --git a/iwdification/cre/cdi4yeti.cre b/iwdification/cre/cdi4yeti.cre deleted file mode 100644 index ae0d6e1..0000000 Binary files a/iwdification/cre/cdi4yeti.cre and /dev/null differ diff --git a/iwdification/cre/cdi5gspi.cre b/iwdification/cre/cdi5gspi.cre deleted file mode 100644 index 9714344..0000000 Binary files a/iwdification/cre/cdi5gspi.cre and /dev/null differ diff --git a/iwdification/cre/cdi5jzom.cre b/iwdification/cre/cdi5jzom.cre deleted file mode 100644 index 9c227ed..0000000 Binary files a/iwdification/cre/cdi5jzom.cre and /dev/null differ diff --git a/iwdification/cre/cdi5mino.cre b/iwdification/cre/cdi5mino.cre deleted file mode 100644 index edb5a37..0000000 Binary files a/iwdification/cre/cdi5mino.cre and /dev/null differ diff --git a/iwdification/cre/cdi6crwl.cre b/iwdification/cre/cdi6crwl.cre deleted file mode 100644 index 66a4917..0000000 Binary files a/iwdification/cre/cdi6crwl.cre and /dev/null differ diff --git a/iwdification/cre/cdi6pspi.cre b/iwdification/cre/cdi6pspi.cre deleted file mode 100644 index 0d2af88..0000000 Binary files a/iwdification/cre/cdi6pspi.cre and /dev/null differ diff --git a/iwdification/cre/cdi6salc.cre b/iwdification/cre/cdi6salc.cre deleted file mode 100644 index 39f4148..0000000 Binary files a/iwdification/cre/cdi6salc.cre and /dev/null differ diff --git a/iwdification/cre/cdi6salf.cre b/iwdification/cre/cdi6salf.cre deleted file mode 100644 index 2e565f0..0000000 Binary files a/iwdification/cre/cdi6salf.cre and /dev/null differ diff --git a/iwdification/cre/cdi7bgrd.cre b/iwdification/cre/cdi7bgrd.cre deleted file mode 100644 index d11e0e5..0000000 Binary files a/iwdification/cre/cdi7bgrd.cre and /dev/null differ diff --git a/iwdification/cre/cdi7umbh.cre b/iwdification/cre/cdi7umbh.cre deleted file mode 100644 index 3706f8a..0000000 Binary files a/iwdification/cre/cdi7umbh.cre and /dev/null differ diff --git a/iwdification/cre/cdi8air.cre b/iwdification/cre/cdi8air.cre deleted file mode 100644 index 91cb272..0000000 Binary files a/iwdification/cre/cdi8air.cre and /dev/null differ diff --git a/iwdification/cre/cdi8erth.cre b/iwdification/cre/cdi8erth.cre deleted file mode 100644 index 8e5d328..0000000 Binary files a/iwdification/cre/cdi8erth.cre and /dev/null differ diff --git a/iwdification/cre/cdi8fire.cre b/iwdification/cre/cdi8fire.cre deleted file mode 100644 index 9abbe75..0000000 Binary files a/iwdification/cre/cdi8fire.cre and /dev/null differ diff --git a/iwdification/cre/cdi8watr.cre b/iwdification/cre/cdi8watr.cre deleted file mode 100644 index 66ac0ba..0000000 Binary files a/iwdification/cre/cdi8watr.cre and /dev/null differ diff --git a/iwdification/cre/cdia480.cre b/iwdification/cre/cdia480.cre new file mode 100644 index 0000000..3a910ce Binary files /dev/null and b/iwdification/cre/cdia480.cre differ diff --git a/iwdification/cre/cdia481.cre b/iwdification/cre/cdia481.cre new file mode 100644 index 0000000..d101bb1 Binary files /dev/null and b/iwdification/cre/cdia481.cre differ diff --git a/iwdification/cre/cdia482.cre b/iwdification/cre/cdia482.cre new file mode 100644 index 0000000..c01e413 Binary files /dev/null and b/iwdification/cre/cdia482.cre differ diff --git a/iwdification/cre/cdia528.cre b/iwdification/cre/cdia528.cre deleted file mode 100644 index 9f5bf16..0000000 Binary files a/iwdification/cre/cdia528.cre and /dev/null differ diff --git a/iwdification/cre/cdidrbr.cre b/iwdification/cre/cdidrbr.cre new file mode 100644 index 0000000..16754f1 Binary files /dev/null and b/iwdification/cre/cdidrbr.cre differ diff --git a/iwdification/cre/cdidree.cre b/iwdification/cre/cdidree.cre new file mode 100644 index 0000000..72b9a6b Binary files /dev/null and b/iwdification/cre/cdidree.cre differ diff --git a/iwdification/cre/cdidrfe.cre b/iwdification/cre/cdidrfe.cre new file mode 100644 index 0000000..e552e90 Binary files /dev/null and b/iwdification/cre/cdidrfe.cre differ diff --git a/iwdification/cre/cdidrubb.cre b/iwdification/cre/cdidrubb.cre deleted file mode 100644 index ad22041..0000000 Binary files a/iwdification/cre/cdidrubb.cre and /dev/null differ diff --git a/iwdification/cre/cdidrupb.cre b/iwdification/cre/cdidrupb.cre deleted file mode 100644 index c5354b0..0000000 Binary files a/iwdification/cre/cdidrupb.cre and /dev/null differ diff --git a/iwdification/cre/cdidruww.cre b/iwdification/cre/cdidruww.cre deleted file mode 100644 index c5b454e..0000000 Binary files a/iwdification/cre/cdidruww.cre and /dev/null differ diff --git a/iwdification/cre/cdidrwe.cre b/iwdification/cre/cdidrwe.cre new file mode 100644 index 0000000..6cfb92f Binary files /dev/null and b/iwdification/cre/cdidrwe.cre differ diff --git a/iwdification/cre/cdiibomb.cre b/iwdification/cre/cdiibomb.cre deleted file mode 100644 index eab085c..0000000 Binary files a/iwdification/cre/cdiibomb.cre and /dev/null differ diff --git a/iwdification/cre/cdiiborb.cre b/iwdification/cre/cdiiborb.cre deleted file mode 100644 index eee1dd7..0000000 Binary files a/iwdification/cre/cdiiborb.cre and /dev/null differ diff --git a/iwdification/cre/cdis1gb1.cre b/iwdification/cre/cdis1gb1.cre deleted file mode 100644 index 8b463ae..0000000 Binary files a/iwdification/cre/cdis1gb1.cre and /dev/null differ diff --git a/iwdification/cre/cdis1gb2.cre b/iwdification/cre/cdis1gb2.cre deleted file mode 100644 index e59b42e..0000000 Binary files a/iwdification/cre/cdis1gb2.cre and /dev/null differ diff --git a/iwdification/cre/cdis1gb3.cre b/iwdification/cre/cdis1gb3.cre deleted file mode 100644 index 443842d..0000000 Binary files a/iwdification/cre/cdis1gb3.cre and /dev/null differ diff --git a/iwdification/cre/cdis1lz3.cre b/iwdification/cre/cdis1lz3.cre deleted file mode 100644 index f575740..0000000 Binary files a/iwdification/cre/cdis1lz3.cre and /dev/null differ diff --git a/iwdification/cre/cdis1lz4.cre b/iwdification/cre/cdis1lz4.cre deleted file mode 100644 index 7b3f732..0000000 Binary files a/iwdification/cre/cdis1lz4.cre and /dev/null differ diff --git a/iwdification/cre/cdis1tr6.cre b/iwdification/cre/cdis1tr6.cre deleted file mode 100644 index 2518db4..0000000 Binary files a/iwdification/cre/cdis1tr6.cre and /dev/null differ diff --git a/iwdification/cre/cdis1tr7.cre b/iwdification/cre/cdis1tr7.cre deleted file mode 100644 index 3d6e14a..0000000 Binary files a/iwdification/cre/cdis1tr7.cre and /dev/null differ diff --git a/iwdification/cre/cdis1tr8.cre b/iwdification/cre/cdis1tr8.cre deleted file mode 100644 index 98d118e..0000000 Binary files a/iwdification/cre/cdis1tr8.cre and /dev/null differ diff --git a/iwdification/cre/cdis2gb1.cre b/iwdification/cre/cdis2gb1.cre deleted file mode 100644 index 690a3fa..0000000 Binary files a/iwdification/cre/cdis2gb1.cre and /dev/null differ diff --git a/iwdification/cre/cdis2gb2.cre b/iwdification/cre/cdis2gb2.cre deleted file mode 100644 index aca20b3..0000000 Binary files a/iwdification/cre/cdis2gb2.cre and /dev/null differ diff --git a/iwdification/cre/cdis2gb3.cre b/iwdification/cre/cdis2gb3.cre deleted file mode 100644 index 3e0e29a..0000000 Binary files a/iwdification/cre/cdis2gb3.cre and /dev/null differ diff --git a/iwdification/cre/cdis2lz5.cre b/iwdification/cre/cdis2lz5.cre deleted file mode 100644 index 92c499b..0000000 Binary files a/iwdification/cre/cdis2lz5.cre and /dev/null differ diff --git a/iwdification/cre/cdis2lz6.cre b/iwdification/cre/cdis2lz6.cre deleted file mode 100644 index b8d8370..0000000 Binary files a/iwdification/cre/cdis2lz6.cre and /dev/null differ diff --git a/iwdification/cre/cdis2lz7.cre b/iwdification/cre/cdis2lz7.cre deleted file mode 100644 index 799343a..0000000 Binary files a/iwdification/cre/cdis2lz7.cre and /dev/null differ diff --git a/iwdification/cre/cdis3tr7.cre b/iwdification/cre/cdis3tr7.cre deleted file mode 100644 index 040405b..0000000 Binary files a/iwdification/cre/cdis3tr7.cre and /dev/null differ diff --git a/iwdification/cre/cdis3tr8.cre b/iwdification/cre/cdis3tr8.cre deleted file mode 100644 index 3d7da26..0000000 Binary files a/iwdification/cre/cdis3tr8.cre and /dev/null differ diff --git a/iwdification/cre/cdis3um8.cre b/iwdification/cre/cdis3um8.cre deleted file mode 100644 index 918beb4..0000000 Binary files a/iwdification/cre/cdis3um8.cre and /dev/null differ diff --git a/iwdification/cre/cdis3um9.cre b/iwdification/cre/cdis3um9.cre deleted file mode 100644 index 2b70e83..0000000 Binary files a/iwdification/cre/cdis3um9.cre and /dev/null differ diff --git a/iwdification/cre/cdishamb.cre b/iwdification/cre/cdishamb.cre deleted file mode 100644 index 679ac81..0000000 Binary files a/iwdification/cre/cdishamb.cre and /dev/null differ diff --git a/iwdification/cre/cdisshad.cre b/iwdification/cre/cdisshad.cre deleted file mode 100644 index c9ce44b..0000000 Binary files a/iwdification/cre/cdisshad.cre and /dev/null differ diff --git a/iwdification/data/anim/e220.ini b/iwdification/data/anim/e220.ini new file mode 100644 index 0000000..4e5fffb --- /dev/null +++ b/iwdification/data/anim/e220.ini @@ -0,0 +1,57 @@ +// MBBM beetle_black + +[general] +animation_type=e000 +move_scale=6 +ellipse=20 +color_blood=47 +color_chunks=0 +sound_freq=8 +personal_space=3 +cast_frame=4 + +[monster_icewind] +detected_by_infravision=0 +resref=MBBM + +[sounds] +attack=bomba03a,bomba03b +attack_frame=0,0,0 +awake= +awake_frame=0 +cast= +cast_frame=0 +conjure= +conjure_frame=0 +damage=bomba07,bomba08 +damage_frame=2,2 +die=bomba09a,bomba09b +die_frame=0,0 +head_turn=bomba11,blank,blank,blank,blank,blank +head_turn_frame=0,0,0,0,0,0 +ready= +ready_frame=0 +shoot= +shoot_frame=0 +twitch= +twitch_frame=0 +walk= +walk_frame=0 +attack_slash=bomba03a,bomba03b +attack_slash_frame=0,0,0 +attack_backslash= +attack_backslash_frame=0 +attack_jab= +attack_jab_frame=0 +emerge= +emerge_frame=0 +hide= +hide_frame=0 +sleep= +sleep_frame=0 +battle_cry=bomba01,bomba02,blank,blank +battle_cry_frame=0,0,0,0 +selection=bomba01,bomba02 +selection_frame=0,0 +fall=bf_md01,bf_md02,bf_md03,bf_md04,bf_md05,bf_md06 +fall_frame=2,2,2,2,2,2 diff --git a/iwdification/data/anim_maps.2da b/iwdification/data/anim_maps.2da new file mode 100644 index 0000000..7a9cb2a --- /dev/null +++ b/iwdification/data/anim_maps.2da @@ -0,0 +1,7 @@ +old_anim new_anim +SHADOW_LARGE SHADOW +UMBER_HULK_ELDER UMBER_HULK +LIZARD_MAN LIZARD_MAN_ELITE +ELEMENTAL_WATER WATER_WEIRD +ELEMENTAL_FIRE_IWD ELEMENTAL_FIRE +ELEMENTAL_EARTH_IWD ELEMENTAL_EARTH \ No newline at end of file diff --git a/iwdification/data/bam_copy_arcane.2da b/iwdification/data/bam_copy_arcane.2da new file mode 100644 index 0000000..baf022c --- /dev/null +++ b/iwdification/data/bam_copy_arcane.2da @@ -0,0 +1,14 @@ +WIZARD_WYVERN_CALL +WIZARD_CARRION +WIZARD_ANIMATE_DEAD +WIZARD_SUMMON_EFREET +WIZARD_SUMMON_DJINNI +WIZARD_SUMMON_FIEND +WIZARD_CACOFIEND +WIZARD_GATE +WIZARD_SPIDER_SPAWN +WIZARD_CONJURE_EARTH_ELEMENTAL +WIZARD_CONJURE_AIR_ELEMENTAL +WIZARD_CONJURE_FIRE_ELEMENTAL +WIZARD_SUMMON_NISHRUU +WIZARD_SUMMON_HAKEASHAR \ No newline at end of file diff --git a/iwdification/data/bam_copy_divine.2da b/iwdification/data/bam_copy_divine.2da new file mode 100644 index 0000000..231b909 --- /dev/null +++ b/iwdification/data/bam_copy_divine.2da @@ -0,0 +1,17 @@ +CLERIC_ANIMATE_DEAD +CLERIC_SUMMON_INSECTS +CLERIC_ANIMAL_SUMMONING_1 +CLERIC_CALL_WOODLAND_BEINGS +CLERIC_ANIMAL_SUMMONING_2 +CLERIC_INSECT_PLAGUE +CLERIC_AERIAL_SERVANT +CLERIC_ANIMAL_SUMMONING_3 +CLERIC_CONJURE_ANIMALS +CLERIC_CONJURE_FIRE_ELEMENTAL +CLERIC_CONJURE_EARTH_ELEMENTAL +CLERIC_GATE +CLERIC_CREEPING_DOOM +CLERIC_ELEMENTAL_SWARM +CLERIC_GREATER_ELEMENTAL_SWARM +CLERIC_SUMMON_DEVA +CLERIC_SUMMON_FALLEN_DEVA \ No newline at end of file diff --git a/iwdification/data/bg2_insects.2da b/iwdification/data/bg2_insects.2da new file mode 100644 index 0000000..4a209ef --- /dev/null +++ b/iwdification/data/bg2_insects.2da @@ -0,0 +1,3 @@ +new_spell +INSECT_PLAGUE +CREEPING_DOOM \ No newline at end of file diff --git a/iwdification/data/bg2_morsword.2da b/iwdification/data/bg2_morsword.2da new file mode 100644 index 0000000..c10ed8f --- /dev/null +++ b/iwdification/data/bg2_morsword.2da @@ -0,0 +1,2 @@ +new_spell scroll_shadow +MORDENKAINENS_SWORD MORDENKAINENS_SWORD \ No newline at end of file diff --git a/iwdification/data/bg2ee_spell.ids b/iwdification/data/bg2ee_spell.ids new file mode 100644 index 0000000..06da1a1 --- /dev/null +++ b/iwdification/data/bg2ee_spell.ids @@ -0,0 +1,1076 @@ +IDS V1.0 // the unmodified BG2EE spell.ids +1101 CLERIC_BLESS +1102 CLERIC_COMMAND +1103 CLERIC_CURE_LIGHT_WOUNDS +1104 CLERIC_DETECT_EVIL +1105 CLERIC_ENTANGLE +1106 CLERIC_MAGIC_STONE +1107 CLERIC_PROTECT_FROM_EVIL +1108 CLERIC_REMOVE_FEAR +1109 CLERIC_SANCTUARY +1110 CLERIC_SHILLELAGH +1111 CLERIC_ARMOR_OF_FAITH +1112 CLERIC_CIRCLE_OF_PROTECTION +1113 CLERIC_DOOM +1114 CLERIC_ANIMAL_FRIENDSHIP +1115 CLERIC_ENDURE_HEAT_COLD +1150 CLERIC_SPIRIT_WARD +1201 CLERIC_AID +1202 CLERIC_BARKSKIN +1203 CLERIC_CHANT +1204 CLERIC_CHARM_PERSON +1205 CLERIC_FIND_TRAPS +1206 CLERIC_FLAME_BLADE +1207 CLERIC_GOOD_BERRIES +1208 CLERIC_HOLD_PERSON +1209 CLERIC_KNOW_ALIGNMENT +1210 CLERIC_RESIST_FIRE +1211 CLERIC_SILENCE_15_FOOT +1212 CLERIC_SLOW_POISON +1213 CLERIC_SPIRITUAL_HAMMER +1214 CLERIC_DRAW_UPON_HOLY_MIGHT +1215 CLERIC_RESIST_COLD +1250 CLERIC_WRITHING_FOG +1301 CLERIC_ANIMATE_DEAD +1302 CLERIC_CALL_LIGHTNING +1303 CLERIC_DISPEL_MAGIC +1304 CLERIC_GLYPH_OF_WARDING +1305 CLERIC_HOLD_ANIMAL +1306 CLERIC_PROTECTION_FROM_FIRE +1307 CLERIC_REMOVE_CURSE +1308 CLERIC_REMOVE_PARALYSIS +1309 CLERIC_INVISIBILITY_PURGE +1310 CLERIC_MISCAST_MAGIC +1311 CLERIC_RIGID_THINKING +1312 CLERIC_STRENGTH_OF_ONE +1313 CLERIC_HOLY_SMITE +1314 CLERIC_UNHOLY_BLIGHT +1315 CLERIC_CURE_MEDIUM_WOUNDS +1316 CLERIC_CURE_BLIND_DEAF +1317 CLERIC_CURE_DISEASE +1318 CLERIC_ZONE_OF_SWEET_AIR +1319 CLERIC_SUMMON_INSECTS +1350 CLERIC_SPIRITUAL_CLARITY +1401 CLERIC_CURE_SERIOUS_WOUNDS +1402 CLERIC_ANIMAL_SUMMONING_1 +1403 CLERIC_FREE_ACTION +1404 CLERIC_NEUTRALIZE_POISON +1405 CLERIC_MENTAL_DOMINATION +1406 CLERIC_DEFENSIVE_HARMONY +1407 CLERIC_PROTECTION_FROM_LIGHTNING +1408 CLERIC_PROTECTION_FROM_EVIL_10_FOOT +1409 CLERIC_DEATH_WARD +1410 CLERIC_CALL_WOODLAND_BEINGS +1411 CLERIC_POISON +1412 CLERIC_HOLY_POWER +1413 CLERIC_NEGATIVE_PLANE_PROTECTION +1414 CLERIC_CAUSE_SERIOUS_WOUNDS +1415 CLERIC_FAR_SIGHT +1416 CLERIC_CLOAK_OF_FEAR +1417 CLERIC_LESSER_RESTORATION +1450 CLERIC_SPIRIT_FIRE +1501 CLERIC_ANIMAL_SUMMONING_2 +1502 CLERIC_CURE_CRITICAL_WOUNDS +1503 CLERIC_FLAME_STRIKE +1504 CLERIC_RAISE_DEAD +1505 CLERIC_TRUE_SIGHT +1506 CLERIC_IRONSKIN +1507 CLERIC_CHAMPIONS_STRENGTH +1508 CLERIC_CHAOTIC_COMMANDS +1509 CLERIC_MAGIC_RESISTANCE +1510 CLERIC_CAUSE_CRITICAL_WOUNDS +1511 CLERIC_SLAY_LIVING +1512 CLERIC_GREATER_COMMAND +1513 CLERIC_RIGHTEOUS_MAGIC +1514 CLERIC_MASS_CURE +1515 CLERIC_REPULSE_UNDEAD +1516 CLERIC_PIXIE_DUST +1517 CLERIC_INSECT_PLAGUE +1550 CLERIC_RECALL_SPIRIT +1599 ENEMY_CLERIC_SLAY_LIVING +1601 CLERIC_AERIAL_SERVANT +1602 CLERIC_ANIMAL_SUMMONING_3 +1603 CLERIC_BLADE_BARRIER +1604 CLERIC_CONJURE_ANIMALS +1605 CLERIC_CONJURE_FIRE_ELEMENTAL +1606 CLERIC_FIRE_SEEDS +1607 CLERIC_HEAL +1608 CLERIC_HARM +1609 CLERIC_FALSE_DAWN +1610 CLERIC_DOLOROUS_DECAY +1611 CLERIC_WONDROUS_RECALL +1612 CLERIC_BOLT_OF_GLORY +1613 CLERIC_PHYSICAL_MIRROR +1614 CLERIC_SOL_SEARING_ORB +1650 CLERIC_SPIRITUAL_LOCK +1698 NPC_BLADE_BARRIER +1699 ENEMY_CLERIC_HARM +1701 CLERIC_SHIELD_OF_THE_ARCHONS +1702 CLERIC_CONJURE_EARTH_ELEMENTAL +1703 CLERIC_GATE +1704 CLERIC_NATURE_BEAUTY +1705 CLERIC_FIRE_STORM +1706 CLERIC_SYMBOL_FEAR +1707 CLERIC_SUNRAY +1708 CLERIC_FINGER_OF_DEATH +1709 CLERIC_CONFUSION +1710 CLERIC_HOLY_WORD +1711 CLERIC_REGENERATE +1712 CLERIC_RESURRECTION +1713 CLERIC_RESTORATION +1714 CLERIC_ENERGY_DRAIN +1715 CLERIC_UNHOLY_WORD +1716 CLERIC_SPACE_WARP +1717 CLERIC_CREEPING_DOOM +1718 CLERIC_SYMBOL_STUN +1719 CLERIC_SYMBOL_DEATH +1720 CLERIC_EARTHQUAKE +1721 CLERIC_ENERGY_BLADES +1722 CLERIC_STORM_OF_VENGEANCE +1723 CLERIC_ELEMENTAL_SWARM +1724 CLERIC_GREATER_ELEMENTAL_SWARM +1725 CLERIC_GLOBE_OF_BLADES +1726 CLERIC_SUMMON_DEVA +1727 CLERIC_SUMMON_FALLEN_DEVA +1728 CLERIC_IMPLOSION +1729 CLERIC_MASS_RAISE_DEAD +1730 CLERIC_AURA_OF_FLAMING_DEATH +1731 CLERIC_ELEMENTAL_TRANSFORMATION_FIRE +1732 CLERIC_ELEMENTAL_TRANSFORMATION_EARTH +1750 CLERIC_ETHER_GATE +1751 CLERIC_ETHEREAL_RETRIBUTION +1982 TRAP_DIRE_CHARM +1983 TRAP_CONFUSION +1984 TRAP_CHROMATIC_ORB +1985 TRAP_FLAMESTRIKE +1986 TRAP_MISCAST_MAGIC +1987 TRAP_CALL_LIGHTNING +1988 TRAP_SILENCE +1989 TRAP_HOLD_PERSON +1999 SHOAL_REVIVE +2001 TRAP_FIREBALL +2002 TRAP_LIGHTNING_BOLT +2003 TRAP_MAGIC_MISSILE +2004 TRAP_STINKING_CLOUD +2005 TRAP_ARROW +2006 TRAP_ARROW_SLAYING +2007 TRAP_ARROW_ACID +2008 TRAP_ARROW_BITING +2009 TRAP_ARROW_DETONATION +2010 TRAP_ARROW_DISPELLING +2011 TRAP_ARROW_FIRE +2012 TRAP_ARROW_ICE +2013 TRAP_ARROW_PIERCING +2014 TRAP_MONSTER_SUMMONING +2015 TRAP_FROST +2016 TRAP_CLOUDKILL +2017 TRAP_MINOR_LIGHTNING_BOLT +2020 TRAP_UNDERWATER_BITE +2021 TRAP_HALLWAY_SPIKES +2022 TRAP_MUCK +2023 TRAP_SHADOW_DEATH +2024 TRAP_GUILLOTINE +2025 TRAP_LIGHTNING_ORB1 +2026 TRAP_LIGHTNING_ORB2 +2027 TRAP_LIGHTNING_ORB3 +2050 WIZARD_CHAOS_VISUALS_ONLY +2051 WIZARD_DISPEL_MAGIC_VISUALS_ONLY +2052 WIZARD_POWER_WORD_SILENCE_VISUALS_ONLY +2053 WIZARD_FLESH_TO_STONE_IGNORE_RESISTANCE +2054 WIZARD_FINGER_OF_DEATH_IGNORE_RESISTANCE +2055 WIZARD_DISINTEGRATE_IGNORE_RESISTANCE +2056 WIZARD_DISINTEGRATE2_IGNORE_RESISTANCE +2101 WIZARD_GREASE +2102 WIZARD_ARMOR +2103 WIZARD_BURNING_HANDS +2104 WIZARD_CHARM_PERSON +2105 WIZARD_COLOR_SPRAY +2106 WIZARD_BLINDNESS +2107 WIZARD_FRIENDS +2108 WIZARD_PROTECTION_FROM_PETRIFICATION +2109 WIZARD_HOLD_PORTAL +2110 WIZARD_IDENTIFY +2111 WIZARD_INFRAVISION +2112 WIZARD_MAGIC_MISSILE +2113 WIZARD_PROTECTION_FROM_EVIL +2114 WIZARD_SHIELD +2115 WIZARD_SHOCKING_GRASP +2116 WIZARD_SLEEP +2117 WIZARD_CHILL_TOUCH +2118 WIZARD_CHROMATIC_ORB +2119 WIZARD_LARLOCH_MINOR_DRAIN +2120 WIZARD_REFLECTED_IMAGE +2121 WIZARD_REVEAL_MAGIC +2122 WIZARD_PROTECTION_CIRCLE +2123 WIZARD_FIND_FAMILAR +2124 WIZARD_ALARM +2124 WIZARD_NAHALS_RECKLESS_DWEOMER +2125 WIZARD_SPOOK +2126 WIZARD_EXPEDITIOUS_RETREAT +2201 WIZARD_BLUR +2202 WIZARD_DETECT_EVIL +2203 WIZARD_DETECT_INVISIBILITY +2204 WIZARD_FOG_CLOUD +2205 WIZARD_HORROR +2206 WIZARD_INVISIBILITY +2207 WIZARD_KNOCK +2208 WIZARD_KNOW_ALIGNMENT +2209 WIZARD_LUCK +2210 WIZARD_RESIST_FEAR +2211 WIZARD_MELF_ACID_ARROW +2212 WIZARD_MIRROR_IMAGE +2213 WIZARD_STINKING_CLOUD +2214 WIZARD_STRENGTH +2215 WIZARD_WEB +2216 WIZARD_WIZARD_LOCK +2217 WIZARD_AGANNAZAR_SCORCHER +2218 WIZARD_GHOUL_TOUCH +2219 WIZARD_VOCALIZE +2220 WIZARD_POWER_WORD_SLEEP +2221 WIZARD_RAY_OF_ENFEEBLEMENT +2222 WIZARD_CHAOS_SHIELD +2223 WIZARD_DEAFNESS +2224 WIZARD_GLITTERDUST +2225 WIZARD_SNILLOCS_SNOWBALL_SWARM +2226 WIZARD_DECASTAVE +2227 WIZARD_CATS_GRACE +2298 CONTINGENCY_MIRROR_IMAGE +2301 WIZARD_CLAIRVOYANCE +2302 WIZARD_DISPEL_MAGIC +2302 WIZARD_REMOVE_MAGIC +2303 WIZARD_FLAME_ARROW +2304 WIZARD_FIREBALL +2305 WIZARD_HASTE +2306 WIZARD_HOLD_PERSON +2307 WIZARD_INVISIBILITY_10_FOOT +2308 WIZARD_LIGHTNING_BOLT +2309 WIZARD_MONSTER_SUMMONING_1 +2310 WIZARD_NON_DETECTION +2311 WIZARD_PROTECTION_FROM_NORMAL_MISSILES +2312 WIZARD_SLOW +2313 WIZARD_SKULL_TRAP +2314 WIZARD_VAMPIRIC_TOUCH +2315 WIZARD_WRAITH_FORM +2316 WIZARD_DIRE_CHARM +2317 WIZARD_GHOST_ARMOR +2318 WIZARD_MINOR_SPELL_DEFLECTION +2319 WIZARD_PROTECTION_FROM_FIRE +2320 WIZARD_PROTECTION_FROM_COLD +2321 WIZARD_SPELL_THRUST +2322 WIZARD_DETECT_ILLUSION +2323 WIZARD_ICELANCE +2324 WIZARD_HOLD_UNDEAD +2325 WIZARD_MELF_METEOR +2326 WIZARD_TRUE_DISPEL_MAGIC +2327 WIZARD_LANCE_OF_DISRUPTION +2401 WIZARD_CONFUSION +2402 WIZARD_DIMENSION_DOOR +2403 WIZARD_FIRE_SHIELD_BLUE +2404 WIZARD_ICE_STORM +2405 WIZARD_IMPROVED_INVISIBILITY +2406 WIZARD_MINOR_GLOBE_OF_INVULNERABILITY +2407 WIZARD_MONSTER_SUMMONING_2 +2408 WIZARD_STONE_SKIN +2409 WIZARD_CONTAGION +2410 WIZARD_REMOVE_CURSE +2411 WIZARD_EMOTION_HOPELESSNESS +2412 WIZARD_GREATER_MALISON +2413 WIZARD_OTILUKES_RESILIENT_SPHERE +2414 WIZARD_SPIRIT_ARMOR +2415 WIZARD_POLYMORPH_OTHER +2416 WIZARD_POLYMORPH_SELF +2417 WIZARD_ENCHANTED_WEAPON +2418 WIZARD_FIRE_SHIELD_RED +2419 WIZARD_SECRET_WORD +2420 WIZARD_MINOR_SEQUENCER +2421 WIZARD_TELEPORT_FIELD +2422 WIZARD_BELTYNS_BURNING_BLOOD +2423 WIZARD_SPIDER_SPAWN +2424 WIZARD_FAR_SIGHT +2425 WIZARD_EYE +2426 WIZARD_EMOTION_COURAGE +2427 WIZARD_EMOTION_HOPE +2428 WIZARD_MORDENKAINENS_FORCE_MISSILES +2429 WIZARD_SHOUT +2430 WIZARD_VITRIOLIC_SPHERE +2431 WIZARD_EMOTION_FEAR +2432 WIZARD_SHADOW_MONSTERS +2490 WIZARD_POLYMORPH_NATURAL_FORM +2491 DRUID_SHAPESHIFT_NATURAL_FORM +2493 WIZARD_POLYMORPH_FLIND +2494 WIZARD_POLYMORPH_OGRE +2495 WIZARD_POLYMORPH_SPIDER +2496 WIZARD_POLYMORPH_MUSTARD_JELLY +2497 WIZARD_POLYMORPH_BROWN_BEAR +2498 WIZARD_POLYMORPH_BLACK_BEAR +2499 WIZARD_POLYMORPH_WOLF +2501 WIZARD_ANIMATE_DEAD +2502 WIZARD_CLOUDKILL +2503 WIZARD_CONE_OF_COLD +2504 WIZARD_MONSTER_SUMMONING_3 +2505 WIZARD_SHADOW_DOOR +2506 WIZARD_DOMINATION +2507 WIZARD_HOLD_MONSTER +2508 WIZARD_CHAOS +2509 WIZARD_FEEBLEMIND +2510 WIZARD_SPELL_IMMUNITY +2511 WIZARD_PROTECTION_FROM_NORMAL_WEAPONS +2512 WIZARD_PROTECTION_FROM_ELECTRICITY +2513 WIZARD_BREACH +2514 WIZARD_LOWER_RESISTANCE +2515 WIZARD_ORACLE +2516 WIZARD_CONJURE_LESSER_FIRE_ELEMENTAL +2517 WIZARD_PROTECTION_FROM_ACID +2518 WIZARD_PHANTOM_BLADE +2519 WIZARD_SPELL_SHIELD +2520 WIZARD_CONJURE_LESSER_AIR_ELEMENTAL +2521 WIZARD_CONJURE_LESSER_EARTH_ELEMENTAL +2522 WIZARD_MINOR_SPELL_TURNING +2523 WIZARD_SUN_FIRE +2524 WIZARD_SHROUD_OF_FLAME +2525 WIZARD_SUMMON_SHADOW +2526 WIZARD_CONJURE_LESSER_WATER_ELEMENTAL +2527 WIZARD_DEMI_SHADOW_MONSTERS +2590 WIZARD_SPELL_IMMUNITY_ABJURATION +2591 WIZARD_SPELL_IMMUNITY_CONJURATION +2592 WIZARD_SPELL_IMMUNITY_DIVINATION +2593 WIZARD_SPELL_IMMUNITY_ENCHANTMENT +2594 WIZARD_SPELL_IMMUNITY_ILLUSIONIST +2595 WIZARD_SPELL_IMMUNITY_INVOCATION +2596 WIZARD_SPELL_IMMUNITY_NECROMANCY +2597 WIZARD_SPELL_IMMUNITY_ALTERATION +2601 WIZARD_INVISIBLE_STALKER +2602 WIZARD_GLOBE_OF_INVULNERABILITY +2603 WIZARD_TENSERS_TRANSFORMATION +2604 WIZARD_FLESH_TO_STONE +2605 WIZARD_DEATH_SPELL +2606 WIZARD_PROTECTION_FROM_MAGIC_ENERGY +2607 WIZARD_MISLEAD +2608 WIZARD_PIERCE_MAGIC +2609 WIZARD_TRUE_SIGHT +2610 WIZARD_MONSTER_SUMMONING_4 +2611 WIZARD_PROTECTION_FROM_MAGIC_WEAPONS +2612 WIZARD_POWER_WORD_SILENCE +2613 WIZARD_IMPROVED_HASTE +2614 WIZARD_DEATH_FOG +2615 WIZARD_CHAIN_LIGHTNING +2616 WIZARD_DISINTEGRATE +2617 WIZARD_CONTINGENCY +2618 WIZARD_SPELL_DEFLECTION +2619 WIZARD_WYVERN_CALL +2620 WIZARD_CONJURE_FIRE_ELEMENTAL +2621 WIZARD_CONJURE_AIR_ELEMENTAL +2622 WIZARD_CONJURE_EARTH_ELEMENTAL +2623 WIZARD_CARRION +2624 WIZARD_SUMMON_NISHRUU +2625 WIZARD_STONE_TO_FLESH +2626 WIZARD_OTILUKES_FREEZING_SPHERE +2627 WIZARD_DARTS_OF_BONE +2628 WIZARD_SOUL_EATER +2629 WIZARD_TROLLISH_FORTITUDE +2630 WIZARD_ANTIMAGIC_SHELL +2631 WIZARD_LICH_TOUCH +2632 WIZARD_SHADES +2701 WIZARD_SPELL_TURNING +2702 WIZARD_PROTECTION_FROM_THE_ELEMENTS +2703 WIZARD_PROJECT_IMAGE +2704 WIZARD_RUBY_RAY_OF_REVERSAL +2705 WIZARD_KHELBENS_WARDING_WHIP +2705 WIZARD_WARDING_WHIP +2706 WIZARD_ACID_STORM +2707 WIZARD_CACOFIEND +2708 WIZARD_MANTLE +2709 WIZARD_TATTOOS_OF_POWER +2710 WIZARD_SPELL_SEQUENCER +2711 WIZARD_SPHERE_OF_CHAOS +2712 WIZARD_DELAYED_BLAST_FIREBALL +2713 WIZARD_FINGER_OF_DEATH +2714 WIZARD_PRISMATIC_SPRAY +2715 WIZARD_POWER_WORD_STUN +2716 WIZARD_MORDENKAINENS_SWORD +2717 WIZARD_SUMMON_EFREET +2718 WIZARD_SUMMON_DJINNI +2719 WIZARD_SUMMON_HAKEASHAR +2720 WIZARD_CONTROL_UNDEAD +2721 WIZARD_MASS_INVISIBILITY +2722 WIZARD_LIMITED_WISH +2723 WIZARD_IMPROVED_CHAOS_SHIELD +2724 WIZARD_SUFFOCATE +2725 WIZARD_MONSTER_SUMMONING_5 +2726 WIZARD_MORDENKAINENS_SWORD_IWD +2727 WIZARD_MALAVONS_RAGE +2728 WIZARD_SEVEN_EYES +2801 WIZARD_DELETED +2802 WIZARD_MIND_BLANK +2803 WIZARD_PROTECTION_FROM_ENERGY +2804 WIZARD_SIMULACRUM +2805 WIZARD_PIERCE_SHIELD +2806 WIZARD_GREAT_SHOUT +2807 WIZARD_SUMMON_FIEND +2808 WIZARD_IMPROVED_MANTLE +2809 WIZARD_SPELL_TRIGGER +2810 WIZARD_INCENDIARY_CLOUD +2811 WIZARD_SYMBOL_FEAR +2812 WIZARD_ABI_DALZIMS_HORRID_WILTING +2813 WIZARD_MAZE +2814 WIZARD_OTTOS_IRRESISTIBLE_DANCE +2815 WIZARD_POWER_WORD_BLIND +2816 WIZARD_SYMBOL_STUN +2817 WIZARD_SYMBOL_DEATH +2818 WIZARD_BIGBYS_CLENCHED_FIST +2819 WIZARD_IRON_BODY +2820 WIZARD_MONSTER_SUMMONING_6 +2888 FORCE_DAMAGE_1 +2897 WIZARD_NPC_SYMBOL_DEATH +2898 WIZARD_NPC_SYMBOL_STUN +2899 WIZARD_NPC_SYMBOL_FEAR +2901 WIZARD_MONSTER_SUMMONING_7 +2902 WIZARD_SPELL_TRAP +2903 WIZARD_SPELL_STRIKE +2905 WIZARD_GATE +2907 WIZARD_ABSOLUTE_IMMUNITY +2908 WIZARD_CHAIN_CONTINGENCY +2909 WIZARD_TIME_STOP +2910 WIZARD_IMPRISONMENT +2911 WIZARD_METEOR_SWARM +2912 WIZARD_POWER_WORD_KILL +2913 WIZARD_WAIL_OF_THE_BANSHEE +2914 WIZARD_ENERGY_DRAIN +2915 WIZARD_BLACK_BLADE_OF_DISASTER +2916 WIZARD_SHAPECHANGE +2917 WIZARD_FREEDOM +2918 WIZARD_BIGBYS_CRUSHING_HAND +2919 WIZARD_WISH +2920 WIZARD_ENERGY_BLADES +2921 WIZARD_IMPROVED_ALACRITY +2921 WIZARD_IMPROVED_ALUCRITY +2922 WIZARD_DRAGONS_BREATH +2923 WIZARD_SUMMON_PLANATAR_GOOD +2924 BERESH_CHANGE +2924 WIZARD_SUMMON_PLANATAR_EVIL +2925 KAISHAS_CHANGE +2925 WIZARD_COMET +2926 QUICK_TELEPORT +2927 SUCCUBUS_ETHEREAL +2928 SUCCUBUS_ENERGY_DRAIN +2929 SUCCUBUS_CHARM_FEMALE +2930 SUCCUBUS_CHARM_MALE +2931 SUCCUBUS_TELEPORT +2932 TANARI_CHANGE +2933 DURLAG_SWORD +2934 CRUSHING_TRAP +2935 SUMMON_SKELETON_WARRIOR3 +2936 SUMMON_SKELETON_WARRIOR2 +2937 SUMMON_SKELETON_WARRIOR +2939 CHARM_HERO +2940 FIREDRAKE_DAMAGE +2941 LOVEM_CHANGE +2942 QUEEN_CHANGE +2943 SIRINE_DIRE_CHARM +2944 DAESEWOLF_CHANGE +2945 LOUPGAR_CHANGE +2946 PLAYER_WEREWOLF_CHANGE +2947 GREATER_WOLFWERE_CHANGE +2948 WEREWOLF_CHANGE +2949 WOLFWERE_CHANGE +2950 FAST_SKULLTRAP +2951 JELLY_SPLIT +2952 DRADEEL_FLAMEBLADE +2953 DRADEEL_BLUE_FIREBALL +2954 DRADEEL_MINOR_GLOBE +2955 PAIN +2956 FEAR +2957 RED_FIREBALL +2958 POWERWORD_BLIND +2959 POWERWORD_STUN +2960 POWERWORD_KILL +2961 DOPPLEGANGER_CHANGE4 +2962 DOPPLEGANGER_CHANGE5 +2963 DOPPLEGANGER_CHANGE6 +2964 DOPPLEGANGER_CHANGE7 +2965 DOPPLEGANGER_CHANGE8 +2979 SAREVOK_STRIKE +2980 FIREBALL_DEATH +2981 MUSHROOM_FIRE +2982 DAERRAGH +2983 RISE_FROM_ASH +2984 RED_SWIRL +2985 RED_HOLY_MIGHT +2986 SPIDER_SUMMON +2987 DOPPLEGANGER_CHANGE_DEFAULT_LESSER +2988 DOPPLEGANGER_CHANGE_DEFAULT +2989 EFFECT_ONLY +2990 DOPPLEGANGER_CHANGE3 +2991 DOPPLEGANGER_RASHAD +2992 DOPPLEGANGER_CHANGE2 +2993 DOPPLEGANGER_CHANGE +2994 PHASE_SPIDER_TELEPORT +2995 DRYAD_TELEPORT +2996 CHARM_KORAX +2997 GORION_LIGHTNING +2998 GORION_MAGIC_MISSILE +2999 DIETY_KILL +3101 INNATE_CURE_LIGHT_WOUNDS +3102 INNATE_SLOW_POISON +3103 INNATE_DRAW_UPON_HOLY_MIGHT +3104 INNATE_LARLOCHS_MINOR_DRAIN +3105 INNATE_HORROR +3106 INNATE_VAMPIRIC_TOUCH +3117 MINSC_BERSERK +3122 AVENGER_SHAPESHIFT_NATURAL_FORM +3123 DRUID_HUMAN_FORM +3123 DRUID_SHAPESHIFT_FROM_BLACKBEAR +3124 SHAPESHIFTER_SHAPESHIFT_NATURAL_FORM +3128 DMWW_TRAP_SET +3150 SHAPESHIFT_NATURAL_FORM_1 +3151 SHAPESHIFT_NATURAL_FORM_2 +3152 SHAPECHANGE_MIND_FLAYER +3153 SHAPECHANGE_IRON_GOLEM +3154 SHAPECHANGE_GIANT_TROLL +3155 SHAPECHANGE_GREATER_WOLFWERE +3156 SHAPECHANGE_FIRE_ELEMENTAL +3157 SHAPECHANGE_EARTH_ELEMENTAL +3160 SALAMANDER_BREATHE_FIREBALL +3531 ABAZIGAL_SHOCKWAVE +3532 DRAGON_LOWER_ELECTRICAL +3533 SENDAI_CHANGE +3534 SUMMON_DEVIL_SHADE +3535 GREEN_DRAGON_BREATH +3536 LICH_FEAR +3537 TROLL_FIRE_CHANGE +3538 MAJOR_POLYMORPH +3539 FLAMING_SKULL_BOLT +3540 RABBIT_POWER +3541 SAR_DIVINATION +3542 PSIONIC_DISINTEGRATE +3543 PSIONIC_INFLICT_PAIN +3544 PSIONIC_SUPERIOR_INVISIBILITY +3545 PSIONIC_LIFE_DRAIN +3546 PSIONIC_INERTIAL_BARRIER +3547 PSIONIC_PROJECT_FORCE +3548 DEMOGORGON_GATE +3549 SUMMON_INFERNAL_HOST +3550 HIVE_MOTHER_ANTIMAGIC_RAY +3551 HIVE_MOTHER_CAUSE_SERIOUS_WOUNDS +3552 HIVE_MOTHER_DISINTEGRATE +3553 NALMISSRA_CHARM +3554 GAIN_ONE_CHA_PERMANENT +3555 GAIN_ONE_WIS_PERMANENT +3556 GAIN_ONE_INT_PERMANENT +3557 GAIN_ONE_DEX_PERMANENT +3558 ERINYES_CHARM +3559 BURNING_MAN_KEENING +3560 BURNING_MAN_CINDER_SHOWER +3561 FIRE_GIANT_LAVA +3562 ICE_GOLEM_STEAM +3563 HOLY_PILLAR_VISUAL +3564 SKULL_EXPLODE +3565 GAROCK_TELEPORT +3566 MIMIC_WEB +3567 MIMIC_FIRE +3568 MIMIC_POISON +3569 SUMMON_ICE_SALAMANDER +3570 SUMMON_FIRE_ELEMENTAL +3571 SUCCUBUS_KISS +3572 CUTSCENE_HASTE +3573 IMOEN_BHAAL2 +3574 IMOEN_BHAAL1 +3575 VORTEX_WEB +3576 DENSE_PUDDING_SPLIT +3577 GAIN_ONE_THACO +3578 GAIN_ONE_AC +3579 POWER_AMP +3580 IMPRISONMENT_NO_SAVE +3581 RESTORATION_IGNORE_RESIST +3582 CONFUSION_NO_SAVE +3583 POISON_NO_SAVE +3584 GAIN_HASTE_TEMPORARY +3585 GAIN_MAGIC_RESIST_PERMANENT +3586 LOSE_FIFTEEN_LEVELS +3587 LOSE_FIVE_LEVELS +3588 LOSE_ONE_DEX_PERMANENT +3589 LOSE_ONE_INT_PERMANENT +3590 GAIN_ONE_CON_PERMANENT +3591 GAIN_ONE_STR_PERMANENT +3592 HELM_RITUAL_SCROLL +3593 ODREN_RITUAL_SCROLL +3594 DEMOGORGON_CHANGE +3595 YELLOW_DRAGON_BREATH +3596 BROWN_DRAGON_BREATH +3597 BLUE_DRAGON_BREATH +3598 SAREVOK_FLASHY1 +3599 FIRE_HEALING +3600 SAREVOK_SOULSTEAL +3601 SPECIAL_SWEET_AIR +3602 CHROMATIC_DEMON_RED +3603 CHROMATIC_DEMON_WHITE +3604 CHROMATIC_DEMON_GREEN +3605 CHROMATIC_DEMON_YELLOW +3606 DECK_SUN +3607 DECK_JESTER +3608 DECK_VIZIER +3609 DECK_GEM +3610 DECK_FATES +3611 DECK_COMET +3612 DECK_FOOL +3613 DECK_TALONS +3614 DECK_ROGUE +3615 DECK_KNIGHT +3616 DECK_FLAMES +3617 DECK_EURYALE +3618 DECK_MOON +3619 DECK_THRONE +3620 DECK_STAR +3621 DECK_KEY +3622 DECK_SKULL +3623 DECK_MAGICIAN +3624 DECK_VOID +3625 DECK_RUIN +3626 DECK_DONJON +3627 FROZEN_DEATH +3628 SLOW_FREEZE +3629 DECK_WHEEL +3630 DECK_STRENGTH +3631 DECK_CONSTRUCT +3632 DECK_EMPEROR +3633 DECK_EMPRESS +3634 DECK_HIGH_PRIESTESS +3635 DECK_STRIFE +3636 DECK_DEFIANCE +3637 DECK_GUILE +3638 DECK_TRIUMPH +3639 DECK_PLAGUE +3640 DECK_XP_DRAIN +3641 DECK_VITALITY_DRAIN +3642 POISONOUS_CLOUD +3643 FAN_BLOW +3644 BALOR_FIRE_SHIELD +3645 WILD_MAGIC_AREA +3646 DEAD_MAGIC_AREA +3647 DISPEL_NO_SAVE +3648 HOLD_PERSON_NO_SAVE +3649 ENTER_POCKET_PLANE +3650 DM_SHIELD +3651 DM_SEE_INVISIBLE +3652 DM_MAGIC_PROTECTION +3653 DM_COLD_PROTECTION +3654 DM_FIRE_PROTECTION +3655 DM_IMPROVED_HASTE +3656 VIEKANG_LIGHTNING +3657 DO_SOME_EFFECTS +3658 HELL_BUFFET +3659 TROLL_CHANGE_NITHIRI +3660 POOF_GONE +3661 EDWINA_IN_HELL +3662 EDWIN_CHANGE_BACK +3663 CREATE_YOSHIMO_BLADE +3664 NETHER_SCROLL +3665 BEHOLDER_BLAST_VISUAL2 +3666 ZOMBIE_LEVEL_DRAIN +3667 SLAYER_BACK_TO_HUMAN_NOVIS +3668 REMOVE_NON_PERMANENT_DEATH +3669 APPLY_NON_PERMANENT_DEATH +3670 SEA_TROLL_CHANGE +3671 SWOOSH_GONE +3672 QUICK_INVISIBLE +3673 SPORE_DEATH +3674 MIST_CHAOS +3675 MIST_HORROR +3676 INVOKE_COURAGE +3677 SUMMON_POISON +3678 ANOMEN_TITLE +3679 HEAL_NO_VISUAL +3680 HARPER_DEATH_SONG +3681 BANSHEE_WAIL +3682 DRAGON_LOWER_FIRE +3683 FIGURINE_SPIDER_WEB +3684 KOA_TRUE_SIGHT_NO_VIS +3685 MAGIC_MISSILE_SURE_HIT +3686 PROTECTION_MAGIC_WEAPON_NOEFF +3687 SHADOW_DRAGON_SHADOWS +3688 BLACK_DRAGON_PLANT +3689 BLACK_DRAGON_INSECT +3690 HOLY_LIGHT_FROM_ABOVE +3691 BLACK_DRAGON_BREATH +3692 DRAGON_SILENCE +3693 RED_DRAGON_HIT +3694 DRAGON_STONE_SKIN +3695 DRAGON_WING_BUFFET +3696 MOON_DOG_HOWL +3697 HASTE_SELF +3698 NON_DETECTION_SELF +3699 INVISIBILITY_SELF +3700 TROLL_SETHP1 +3701 DEATHKNIGHT_FIREBALL +3702 FAKE_FLAME_STRIKE +3703 AERIE_DISPEL_MAGIC +3704 NYMPH_CONFUSION +3705 TRAP_PENDULUM +3706 TRAP_VENT +3707 TRAP_DARTS +3708 TRAP_SLIME +3709 TRAP_SPEAR +3710 SPELL_DEFLECTION_NO_VISUAL +3711 FINAL_HEAL +3712 MULTIPLAYER_ANTIMAGIC +3713 ICE_DUST +3714 CELESTIAL_BOLT +3715 TROLL_RAT_SPAWN +3716 SLAYER_IMMUNE_TO_DAMAGE +3717 SLAYER_CHANGE_CUT_SCENE +3718 SLAYER_BACK_TO_HUMAN +3719 CUTSCENE_METEOR_SWARM +3720 CUTSCENE_DAMAGE_1C +3721 CUTSCENE_DAMAGE_1B +3722 GREAT_DRUID_TITLE +3723 DRAGON_RAIN +3724 RAISSA_RESTORE +3725 SKIN_DANCER_RESTORE_2 +3726 CUTSCENE_DAMAGE_1 +3727 NOSAVE_PSIONIC_BLAST +3728 SKIN_DANCER_RESTORE +3729 SKIN_DANCER_SWITCH +3730 SUMMON_FUNGUS +3731 WISH_SPELL_FAILURE +3732 WISH_LOSE_SPELL +3733 WISH_POISON +3734 WISH_HEAL_PARTY +3735 WISH_RABBIT +3736 WISH_GLOBE +3737 WISH_MEMORIZE +3738 WISH_PLANE +3739 TROLL_SPECTRAL_CHANGE +3740 TROLL_SNOW_CHANGE +3741 TROLL_SPIRIT_CHANGE +3742 TROLL_GIANT_CHANGE +3743 TROLL_FRESHWATER_CHANGE +3744 TROLL_DESERT_CHANGE +3745 AERIE_PORTRAIT +3746 RESTORE_FULL_HEALTH +3747 HELL_SELFISH_EVIL +3748 HELL_SELFISH_GOOD +3749 HELL_WRATH_EVIL +3750 HELL_WRATH_GOOD +3751 HELL_PRIDE_EVIL +3752 HELL_PRIDE_GOOD +3753 HELL_FEAR_EVIL +3754 HELL_FEAR_GOOD +3755 HELL_GREED_EVIL +3756 HELL_GREED_GOOD +3757 IRENICUS_WORD_OF_POWER +3758 PLAYER1_WORD_OF_POWER +3759 HELL_GAIN_CHR +3760 HELL_GAIN_CON +3761 HELL_GAIN_DEX +3762 HELL_GAIN_WIS +3763 HELL_GAIN_INT +3764 HELL_GAIN_STR +3765 HELL_LOSE_XP +3766 HELL_LOSE_DEX +3767 HELL_LOSE_HP +3768 HELL_DISPELL +3769 HELL_HOLD +3770 HELL_EXPLODE +3771 HELL_DAMAGE_HALF +3772 HELL_FEAR +3773 EVIL_LAYONHANDS +3774 PSIONIC_MAZE +3775 PSIONIC_MIND_BLAST +3776 MAKE_STATUE +3777 BEHOLDER_BLAST_VISUAL +3778 WILD_MAGIC_ZONE +3779 ANTI_MAGIC_ZONE +3780 FLASHY_DEATH_3 +3781 FLASHY_DEATH_2 +3782 FLASHY_DEATH_1 +3783 SLAYER_ENEMY +3784 SNAKE_GAZE +3785 PERM_CHARM +3786 LICH_IMPRISON +3787 SMALL_DAMAGE_SPELL +3788 DEMILICH_TRAP_SOUL +3789 DEMILICH_DEATH +3790 LONG_VISUAL2 +3791 TROLL_ICE_CHANGE +3792 LONG_VISUAL +3793 FLASHY_DEATH_YEAH +3794 FLASHY_4 +3795 FLASHY_3 +3796 FLASHY_2 +3797 FLASHY_1 +3798 BODHI_BAT_ASYLUM +3799 DACE_FLAME +3800 FLAME_HEAD +3801 NO_FEAR_PARTY +3802 MIND_CRIPPLE +3803 DACE_MIST_FORM_CHANGE +3804 PSIONIC_EMOTION_KILL +3805 THIEF_DETECT_ILLUSION +3806 LICH_REPLACE_SELF +3807 SLAYER_FEAR +3808 DRAIN_PARTY +3809 BODHI_MIST_FORM_CHANGE +3810 GIVE_SLAYER_POWER +3811 VAMPIRE_FORM_CHANGE +3812 DEL_VAMP_FORM_CHANGE +3813 SLAVE_CHUNK +3814 TANOVA_MIST_FORM_CHANGE +3815 DEL_MIST_FORM_CHANGE +3816 VALEN_MIST_FORM_CHANGE +3817 C6BODHI_WEAKNESS +3818 C6VAMPIRE_WEAKNESS +3819 LAVA_BURST +3820 ELVEN_GUARD_WAIL +3821 LONG_RED_MIGHT +3822 SLAYER_START +3823 SLAYER_CHANGE_TWO +3824 DEATH_CURSE +3825 DROW_CHANGE +3826 MAZZY_STRENGTH +3827 MAZZY_LAY +3828 MAZZY_HASTE +3829 JAN_AMMO +3830 UNDER_NORM +3831 UNDER_SQUIRREL +3832 SILVER_DRAGON_BREATH_PARALIZATION +3833 SILVER_DRAGON_BREATH_COLD +3834 BRAIN_PSIONIC_BLAST +3835 ILLUSION_DEATH +3836 JON_ALL_DEAD +3837 JON_WISH +3838 LOSE_ALL +3839 HULK_CONFUSION +3840 BOOK_GOLEM +3841 BOOK_BEHOLD +3842 BOOK_MIND +3843 BOOK_UMBER +3844 BOOK_SPIDER +3845 BOOK_KOBOLD +3846 SAND_DIE +3847 FIRAMB05_CHANGE +3848 DISARM_ENEMY +3849 TROLL_SMALL_CHANGE +3850 DGTROLL_CHANGE +3851 FIRAMB01_CHANGE +3852 SLAYER_CHANGE +3853 FORCE_SPHERE +3854 MAGNET +3855 SUMMON_DJINN_TRAP +3856 SUMMON_DEATH_KNIGHT +3857 SUMMON_PIT_FIEND +3858 ONE_INT +3859 ONE_WIS +3860 ONE_DEX +3861 ONE_CON +3862 NOHOLD_PARTY +3863 HOLD_PARTY +3864 TRANSFORMATION_DEATH +3865 FORCE_STONE_TRAP +3866 FORCE_DISPEL_MAGIC +3867 RED_PILLAR_VISUAL +3868 CERND_CERND +3869 CERND_BEAR +3870 SUMMON_SHADOW_WOLF +3871 END_EXPLORE +3872 FIVE_ROUND_ENCHANTMENT_IMMUNITY +3873 UNPAUSE_CASTER +3874 FALDORN_PANTHER +3875 ANATH_WEREWOLF2 +3876 ANATH_WEREWOLF +3877 APPRENTI_DEATH +3878 SHADOW_DRAIN +3879 MAKE_SHADOW +3880 SUMMON_SHADOW +3881 GREATER_WEREWOLF_CHANGE +3882 VAMPIRE_FEAR +3883 VAMPIRE_DOMINATION +3884 CHICKEN_CHANGE +3885 KAMIKAZE_EXPLOSION +3886 RAELIS_OPEN_PORTAL +3887 SUMMONED_MIND +3888 SURE_STONE_SHATTER +3889 SURE_STONED +3890 DEMON_FEAR +3891 MOON_DOG_FEAR +3892 SURE_SLEEP +3893 SHADOW_DRAGON_BREATH +3894 RED_DRAGON_BREATH +3895 DRAGON_FEAR +3896 REPULSE_X +3897 BEHOLDER_GAS_SPORE +3898 ARCHER_PROTECTION +3899 RED_EFFECT +3899 ZOMBIE_SICKNESS +3900 ZOMBIE_CHANGE +3901 ZOMBIE_CON_LOSS +3902 BODVAM02_MIST_CHANGE +3903 BODVAM01_MIST_CHANGE +3904 LASSAL_MIST_CHANGE +3905 DO_NOTHING +3906 THREE_ROUND_ENCHANTMENT_IMMUNITY +3907 FIFTY_PERCENT_DAMAGE_ARROW +3908 FIFTY_PERCENT_DAMAGE +3909 PSIONIC_EGOWHIP +3910 PSIONIC_DOMINATION +3911 PSIONIC_BALLISTIC +3912 PSIONIC_DETONATE +3913 MIMIC_ACID +3914 MIMIC_GLUE +3915 SPIDER_CHANGE +3916 EDWIN_CHANGE +3917 MANE_GAS +3918 HARPASS_CHANGE +3919 JAHEIRA_WEAKNESS +3920 BEHOLDER_SPELL_TURNING +3922 REVENANT_CHANGE +3923 GENIE_LIMITED_WISH_HEAL_ALL +3924 COVER_PARTIAL +3925 COVER_FULL +3926 MEPHIT_WATER_JET +3927 MEPHIT_RAINSTORM +3928 MEPHIT_GAS_FORM +3929 MEPHIT_MIST +3930 MEPHIT_LAVA +3931 MEPHIT_SOOTY_BALL +3932 MEPHIT_BOLT +3933 MEPHIT_LIGHTNING_BOLT +3934 MEPHIT_SALT_CRYSTAL +3935 MEPHIT_GLASS_DUST +3936 MEPHIT_ICE_SHARD +3937 MEPHIT_COLOR_SPRAY +3938 MEPHIT_FLAME_FAN +3939 MEPHIT_FLAME_JET +3940 MEPHIT_STINKING_CLOUD +3941 MEPHIT_SPIT_ROCK +3942 MEPHIT_GRIT +3943 MEPHIT_BLUR +3944 CUTSCENE_POWERWORD_STUN +3945 CUTSCENE_SPELLSTRIKE +3946 CUTSCENE_BREACH +3947 CUTSCENE_MIND_FOG +3948 CUTSCENE_LOWER_RESISTANCE +3949 CUTSCENE_RUBY_RAY_OF_REVERSAL +3950 CUTSCENE_FLESH_TO_STONE +3951 CUTSCENE_POWERWORD_KILL +3952 CUTSCENE_PHANTASMAL_KILLER +3953 CUTSCENE_IMPRISONMENT +3954 SIRINE_TELEPORT_FAKE +3955 TROLL_CHANGE +3956 HELL_HOUND_FLAME +3957 GHOULLORD_FEAR +3958 ULITHARID_CURE_SERIOUS_WOUNDS +3959 ULITHARID_PSIONIC_BLAST +3960 BEHOLDER_PARALYZATION_RAY +3961 BEHOLDER_FINGER_OF_DEATH +3962 BEHOLDER_MAGIC_MISSILE +3963 VAMPIRE_BAT_FORM_CHANGE +3964 VAMPIRE_GAS_FORM_CHANGE +3965 TROLL_HEAL_ONE_HIT_POINT +3966 TROLL_SLEEP +3967 EFREETI_PHYSICAL_FORM_CHANGE +3968 DOA_PHYSICAL_FORM_CHANGE +3969 DJINNI_PHYSICAL_FORM_CHANGE +3970 EFREETI_GAS_FORM_CHANGE +3971 DOA_GAS_FORM_CHANGE +3972 DJINNI_GAS_FORM_CHANGE +3973 AIR_ELEMENTAL_EFFECT +3974 MIND_FLAYER_PSIONIC_BLAST +3975 MIND_FLAYER_DOMINATION +3976 GOLEM_CONFUSION +3977 GOLEM_SLOW +3978 GOLEM_HASTE +3979 GOLEM_GASCLOUD +3980 BEHOLDER_CHARM_PERSON +3981 BEHOLDER_FEAR +3982 BEHOLDER_DISINTEGRATE +3983 BEHOLDER_SLOW +3984 BEHOLDER_FLESH_TO_STONE +3985 BEHOLDER_DOMINATION +3986 BEHOLDER_CAUSE_SERIOUS_WOUNDS +3987 BEHOLDER_AGANNAZAR_SCORCHER +3988 BEHOLDER_HOLD_PERSON +3989 BEHOLDER_LIGHTNING_BOLT +3990 BEHOLDER_PARALYZATION +3991 BEHOLDER_DEATH_RAY +3992 BEHOLDER_ANTIMAGIC_RAY +3994 ACID_DAMAGE_1 +3996 TANARI_DEATH_GAZE +3997 TANARI_VAMPIRIC_TOUCH +3998 TANARI_SILENCE +3999 TANARI_PARALYZE +4102 BLACKGUARD_ABSORB_HEALTH +4103 AURA_OF_DESPAIR +4103 BLACKGUARD_AURA_OF_DESPAIR +4104 RESIST_FEAR +4105 IMMUNITY_TO_LEVEL_DRAIN +4106 BLACKGUARD_ANIMATE_DEAD +4121 ARCHER_CALL_SHOT +4144 KENSAI_KIA +4152 BARBARIAN_RAGE +4211 PALADIN_LAY_ON_HANDS +4212 PALADIN_DETECT_EVIL +4212 PALADIN_PROTECTION_FROM_EVIL +4213 PALADIN_PROTECTION_FROM_EVIL +4222 CAVALIER_REMOVE_FEAR +4231 INQUIS_DISPEL_MAGIC +4232 INQUIS_TRUE_SIGHT +4236 SUN_SOUL_SUN_SOULRAY +4237 SUN_SOUL_GREATER_SUN +4238 SUN_SOUL_FLAMING_FISTS +4239 SUN_SOUL_SUN_SOULBEAM +4311 RANGER_CHARM_ANIMAL +4321 BERSERKER_ENRAGE +4321 BERSERKER_RAGE +4342 BEASTMASTER_FIND_FAMILIAR +4412 SET_SNARE_TRAP +4412 THIEF_SET_SNARE +4414 SET_SPECIAL_SNARE_TRAP +4414 THIEF_SET_SPECIAL_SNARE +4423 ASSASSIN_POISON +4521 BLADE_OFFENSIVE_SPIN +4522 BLADE_DEFENSIVE_SPIN +4611 DRUID_SHAPESHIFT_BROWNBEAR +4612 DRUID_SHAPESHIFT_WOLF +4613 DRUID_SHAPESHIFT_BLACKBEAR +4621 TOTEMIC_DRUID_SUMMON_SPIRIT_ANIMAL +4632 AVENGER_SHAPESHIFT_SWORDSPIDER +4633 AVENGER_SHAPESHIFT_BABYWYVERN +4634 AVENGER_SHAPESHIFT_FIRESALAMANDER +4643 SHAPESHIFTER_SHAPESHIFT_WEREWOLF +4644 SHAPESHIFTER_SHAPESHIFT_GREATERWEREWOLF +4721 TALOS_STORMSHIELD +4722 TALOS_LIGHTNING_BOLT +4731 HELM_SEEKING_SWORD +4732 HELM_TRUE_SIGHT +4741 LATHANDER_BOON +4742 LATHANDER_HOLD_UNDEAD +4811 MONK_STUNNING_BLOW +4815 MONK_LAY_ON_HANDS +4820 MONK_QUIVERING_PALM +4900 WARRIOR_WHIRLWIND +4901 WARRIOR_GREATER_WHIRLWIND +4902 WARRIOR_DEATHBLOW +4903 WARRIOR_GREATER_DEATHBLOW +4904 WARRIOR_RESIST_MAGIC +4905 WARRIOR_CRITICAL_STRIKE +4906 WARRIOR_POWER_ATTACK +4907 WARRIOR_HARDINESS +4908 WARRIOR_WAR_CRY +4909 WARRIOR_SMITE +4910 ROGUE_SET_SPIKE_TRAP +4911 ROGUE_SET_EXPLODING_TRAP +4912 ROGUE_SET_TIME_TRAP +4913 ROGUE_EVASION +4914 ROGUE_GREATER_EVASION +4916 ROGUE_ASSASINATION +4917 ROGUE_AVOID_DEATH +4922 RANGER_TRACKING +4923 PALADIN_SUMMON_DEVA +4924 DRUID_IMMUNE_POISON +4925 DRUID_RESISTS +4935 BLACKGUARD_SUMMON_FALLEN_DEVA +4936 SHADOWDANCER_SHADOW_TWIN +4937 SHADOWDANCER_SHADOW_MAZE +4938 SHADOWDANCER_SHADOW_FORM +4940 SHAMAN_SPIRIT_FORM +4941 SHAMAN_FAVORED_OF_THE_SPIRITS diff --git a/iwdification/data/do_not_copy.2da b/iwdification/data/do_not_copy.2da new file mode 100644 index 0000000..298b2fd --- /dev/null +++ b/iwdification/data/do_not_copy.2da @@ -0,0 +1,70 @@ +SMLLAREA.PRO +ABJURH.BAM +B1-10.ITM +B1-6.ITM +GHAST1.ITM +B1-10M2.ITM +ANTIWEB.ITM +CARRIO1.ITM +PSPIDER.BCS +SPIDPH1.ITM +S1-10.ITM +SPIDGI1.ITM +AROW01.ITM +BOW05.ITM +P1-4.ITM +P1-6.ITM +S1-8.ITM +B1-12.ITM +GHOUL1.ITM +SPIDHU1.ITM +IMMUNE2.ITM +SPPR413B.BAM +SPPR413C.BAM +SPPR725D.SPL +RING95.ITM +IWOLF.BAM +SPPR306B.BAM +SPPR306C.BAM +IRING01.BAM +PARALH.BAM +SPWI213B.BAM +SPWI213C.BAM +SAFIRE.BCS +SAFROST.BCS +UHGAZE.BCS +MS6CRWL.CRE +MS6PSPI.CRE +MS5GSPI.CRE +MS5JZOM.CRE +MS4YETI.CRE +MS4OGR.CRE +MS4GHST.CRE +MS3BORB.CRE +MS3GHL.CRE +MS3HSPI.CRE +MS3OROG.CRE +MS3TLIZ.CRE +MS2BBTL.CRE +MS2GOBB.CRE +MS2GOBE.CRE +MS1FB.CRE +S5-20.ITM +SPWI914B.BAM +SPWI914C.BAM +ISHAPE06.BAM +SHGLYPH.BAM +ICSPAIN.VVC +ICEGLYP.PRO +EFATKMEL.BCS +TRAVEL.BAM +SPGLYPTI.BAM +SPPR517A.BAM +SPPR517B.BAM +SPPR517C.BAM +SPPR717A.BAM +SPPR717C.BAM +SPPR717C.BAM +SWORD01.CRE +SPWI205B.BAM +SPWI205C.BAM \ No newline at end of file diff --git a/iwdification/data/ds_iwd_arcane.2da b/iwdification/data/ds_iwd_arcane.2da new file mode 100644 index 0000000..704fe18 --- /dev/null +++ b/iwdification/data/ds_iwd_arcane.2da @@ -0,0 +1,9 @@ +FILE OPCODE PAR_1 PAR_2 CLONE TICK PATCH_WHAT // DESCRIPTION +WIZARD_MIND_BLANK 328 1 MIND_BLANK 142 n a // Mind Blank +WIZARD_MIND_BLANK 328 1 BUFF_ENHANCEMENT 142 n a +WIZARD_MIND_BLANK 328 1 BUFF_PRO_EFFECTS 142 n a +WIZARD_EMOTION_HOPE 328 1 EMOTION_HOPE 142 n a +WIZARD_EMOTION_HOPE 328 1 BUFF_ENHANCEMENT 142 n a +WIZARD_EMOTION_COURAGE 328 1 EMOTION_COURAGE 142 n a +WIZARD_EMOTION_COURAGE 328 1 BUFF_ENHANCEMENT 142 n a +WIZARD_TROLLISH_FORTITUDE 328 1 BUFF_ENHANCEMENT 142 n a \ No newline at end of file diff --git a/iwdification/data/ds_iwd_divine.2da b/iwdification/data/ds_iwd_divine.2da new file mode 100644 index 0000000..f7a372d --- /dev/null +++ b/iwdification/data/ds_iwd_divine.2da @@ -0,0 +1,4 @@ +FILE OPCODE PAR_1 PAR_2 CLONE TICK PATCH_WHAT // DESCRIPTION +CLERIC_IMPERVIOUS_SANCTITY_OF_MIND 328 1 BUFF_PRO_EFFECTS 142 n a +CLERIC_GREATER_SHIELD_OF_LATHANDER 328 1 BUFF_PRO_EFFECTS 142 n a +CLERIC_ENTROPY_SHIELD 328 1 BUFF_ENHANCEMENT 142 n a \ No newline at end of file diff --git a/iwdification/data/file_renames.2da b/iwdification/data/file_renames.2da new file mode 100644 index 0000000..155b39b --- /dev/null +++ b/iwdification/data/file_renames.2da @@ -0,0 +1,5 @@ +MISC_01C #ISC_01C WAV +ARE_M04 #RE_M04 WAV +SPPR616B SPPR618B BAM +SPPR616C SPPR618C BAM +S1-12 #S1-12 ITM \ No newline at end of file diff --git a/iwdification/data/force_iterate_start.2da b/iwdification/data/force_iterate_start.2da new file mode 100644 index 0000000..8254e19 --- /dev/null +++ b/iwdification/data/force_iterate_start.2da @@ -0,0 +1,6 @@ +BARD_SONG_BALLAD #BARD1.SPL +BARD_SONG_CURRAN #BARD2.SPL +BARD_SONG_TYMORA #BARD3.SPL +BARD_SONG_KAUDIES #BARD4.SPL +BARD_SONG_SIREN #BARD5.SPL +BARD_SONG_SITH #BARD6.SPL \ No newline at end of file diff --git a/iwdification/data/green_spells_arcane.2da b/iwdification/data/green_spells_arcane.2da new file mode 100644 index 0000000..988113e --- /dev/null +++ b/iwdification/data/green_spells_arcane.2da @@ -0,0 +1,6 @@ +CONJURE_EARTH_ELEMENTAL +CONJURE_AIR_ELEMENTAL +CONJURE_FIRE_ELEMENTAL +SUMMON_PLANATAR_GOOD +SUMMON_PLANATAR_EVIL +CREATE_BONEGUARD \ No newline at end of file diff --git a/iwdification/data/ids_remaps.2da b/iwdification/data/ids_remaps.2da new file mode 100644 index 0000000..ffadb4c --- /dev/null +++ b/iwdification/data/ids_remaps.2da @@ -0,0 +1,7 @@ +WIZARD_CONJURE_AIR_ELEMENTAL WIZARD_CONJURE_LESSER_AIR_ELEMENTAL +WIZARD_CONJURE_EARTH_ELEMENTAL WIZARD_CONJURE_LESSER_EARTH_ELEMENTAL +WIZARD_CONJURE_FIRE_ELEMENTAL WIZARD_CONJURE_LESSER_FIRE_ELEMENTAL +WIZARD_CONJURE_WATER_ELEMENTAL WIZARD_CONJURE_LESSER_WATER_ELEMENTAL +WIZARD_MORDENKAINENS_SWORD WIZARD_MORDENKAINENS_SWORD_IWD +CLERIC_CAUSE_SERIOUS_WOUNDS CLERIC_CAUSE_SERIOUS_WOUNDS_IWD +CLERIC_CAUSE_CRITICAL_WOUNDS CLERIC_CAUSE_CRITICAL_WOUNDS_IWD \ No newline at end of file diff --git a/iwdification/data/iwd_arcane.2da b/iwdification/data/iwd_arcane.2da new file mode 100644 index 0000000..37c7657 --- /dev/null +++ b/iwdification/data/iwd_arcane.2da @@ -0,0 +1,54 @@ +new_spell scroll_shadow +WIZARD_SNILLOCS_SNOWBALL_SWARM STINKING_CLOUD +WIZARD_DECASTAVE KNOCK +WIZARD_CATS_GRACE STRENGTH +WIZARD_ICELANCE FLAME_ARROW +WIZARD_LANCE_OF_DISRUPTION LIGHTNING_BOLT +WIZARD_BELTYNS_BURNING_BLOOD CONTAGION +WIZARD_EMOTION_COURAGE EMOTION_HOPELESSNESS +WIZARD_EMOTION_HOPE EMOTION_HOPELESSNESS +WIZARD_EMOTION_FEAR * +WIZARD_EMOTION_HOPELESSNESS * +WIZARD_MORDENKAINENS_FORCE_MISSILES OTILUKES_RESILIENT_SPHERE +WIZARD_SHOUT CONE_OF_COLD +WIZARD_VITRIOLIC_SPHERE ICE_STORM +WIZARD_SHROUD_OF_FLAME SUN_FIRE +WIZARD_OTILUKES_FREEZING_SPHERE CHAIN_LIGHTNING +WIZARD_DARTS_OF_BONE DISINTEGRATE +WIZARD_SOUL_EATER DEATH_FOG +WIZARD_TROLLISH_FORTITUDE TENSERS_TRANSFORMATION +WIZARD_ACID_STORM DELAYED_BLAST_FIREBALL +WIZARD_SUFFOCATE SPHERE_OF_CHAOS +WIZARD_MIND_BLANK PROTECTION_FROM_ENERGY +WIZARD_GREAT_SHOUT BIGBYS_CLENCHED_FIST +WIZARD_IRON_BODY IMPROVED_MANTLE +WIZARD_SUMMON_SHADOW CARRION +WIZARD_MONSTER_SUMMONING_4 WYVERN_CALL +WIZARD_MONSTER_SUMMONING_7 SUMMON_DJINNI +WIZARD_MONSTER_SUMMONING_6 SUMMON_EFREET +WIZARD_MONSTER_SUMMONING_5 SUMMON_EFREET +WIZARD_MONSTER_SUMMONING_1 * +WIZARD_MONSTER_SUMMONING_2 * +WIZARD_MONSTER_SUMMONING_3 * +WIZARD_CONJURE_LESSER_EARTH_ELEMENTAL * +WIZARD_CONJURE_LESSER_FIRE_ELEMENTAL * +WIZARD_CONJURE_LESSER_AIR_ELEMENTAL * +WIZARD_CONJURE_LESSER_WATER_ELEMENTAL CONJURE_LESSER_AIR_ELEMENTAL +WIZARD_MORDENKAINENS_SWORD_IWD MORDENKAINENS_SWORD +WIZARD_EXPEDITIOUS_RETREAT SLEEP +WIZARD_SHADOW_MONSTERS SPIDER_SPAWN +WIZARD_DEMI_SHADOW_MONSTERS MONSTER_SUMMONING_3 +WIZARD_ANTIMAGIC_SHELL MINOR_SPELL_TURNING +WIZARD_LICH_TOUCH DEATH_SPELL +WIZARD_SHADES MONSTER_SUMMONING_3 +WIZARD_MALAVONS_RAGE FLESH_TO_STONE +WIZARD_SEVEN_EYES SPHERE_OF_CHAOS +SEVEN_EYES_MIND * +SEVEN_EYES_MAGE * +SEVEN_EYES_SWORD * +SEVEN_EYES_VENOM * +SEVEN_EYES_FORTITUDE * +SEVEN_EYES_SPIRIT * +SEVEN_EYES_STONE * + + diff --git a/iwdification/data/iwd_bard.2da b/iwdification/data/iwd_bard.2da new file mode 100644 index 0000000..0cd77ac --- /dev/null +++ b/iwdification/data/iwd_bard.2da @@ -0,0 +1,7 @@ +new_spell +BARD_SONG_BALLAD +BARD_SONG_CURRAN +BARD_SONG_TYMORA +BARD_SONG_KAUDIES +BARD_SONG_SIREN +BARD_SONG_SITH \ No newline at end of file diff --git a/iwdification/data/iwd_divine.2da b/iwdification/data/iwd_divine.2da new file mode 100644 index 0000000..fbb12d0 --- /dev/null +++ b/iwdification/data/iwd_divine.2da @@ -0,0 +1,53 @@ +new_spell +CLERIC_CURSE +CLERIC_CAUSE_LIGHT_WOUNDS +CLERIC_SUNSCORCH +CLERIC_CURE_MODERATE_WOUNDS +CLERIC_ALICORN_LANCE +CLERIC_BEAST_CLAW +CLERIC_CAUSE_MODERATE_WOUNDS +CLERIC_PRAYER +CLERIC_CAUSE_DISEASE +CLERIC_EXALTATION +CLERIC_MOONBLADE +CLERIC_CIRCLE_OF_BONES +CLERIC_SPIKE_GROWTH +CLERIC_CLOUDBURST +CLERIC_MOLD_TOUCH +CLERIC_STORM_SHELL +CLERIC_CAUSE_MEDIUM_WOUNDS +CLERIC_FAVOR_OF_ILMATER +CLERIC_PRODUCE_FIRE +CLERIC_STATIC_CHARGE +CLERIC_RECITATION +CLERIC_BLOOD_RAGE +CLERIC_CLOUD_OF_PESTILENCE +CLERIC_UNFAILING_ENDURANCE +CLERIC_STAR_METAL_CUDGEL +CLERIC_SMASHING_WAVE +CLERIC_THORN_SPRAY +CLERIC_WALL_OF_MOONLIGHT +CLERIC_RIGHTEOUS_WRATH_OF_THE_FAITHFUL +CLERIC_SPIKE_STONES +CLERIC_SHIELD_OF_LATHANDER +CLERIC_UNDEAD_WARD +CLERIC_ANIMAL_RAGE +CLERIC_MASS_CAUSE_LIGHT_WOUNDS +CLERIC_ENTROPY_SHIELD +CLERIC_WHIRLWIND +CLERIC_SPIRITUAL_WRATH +CLERIC_SYMBOL_PAIN +CLERIC_SYMBOL_HOPELESSNESS +CLERIC_IMPERVIOUS_SANCTITY_OF_MIND +CLERIC_DESTRUCTION +CLERIC_GREATER_SHIELD_OF_LATHANDER +CLERIC_MIST_OF_ELDATH +CLERIC_STALKER +CLERIC_ENERGY_DRAIN +CLERIC_CAUSE_SERIOUS_WOUNDS_IWD +CLERIC_CAUSE_CRITICAL_WOUNDS_IWD +CLERIC_GIANT_INSECT +CLERIC_CHANT +CLERIC_WITHER +INNATE_BOMBARDIER_BEETLE_CLOUD + diff --git a/iwdification/data/key.txt b/iwdification/data/key.txt new file mode 100644 index 0000000..ee7abe0 --- /dev/null +++ b/iwdification/data/key.txt @@ -0,0 +1,26 @@ +anim (directory): any animation INI file here will cause iwdspells to fetch the required BAM and WAV files for that INI + +anim_maps: IWD CRE files with the LHS animation get mapped over to the RHS animation + +bam_copy_[arcane/divine]: spell/scroll BAM images from IWD that replace the BG2 versions + +BG2EE_SPELL.IDS: what it sounds like, verbatim copy of BG2EE's spell.ids file + +do_not_copy: items on this list don't get copied over (and nor do any resources that depend on them, unless they depend on something else too) + +ds_iwd: minimal ds data to give BGEE-level detectability to the new spells + +file_renames: these files, when copied over, get renamed to the RHS entry, and any references to them are updates + +force_iterate_start: if you install the spell on the LHS, the system starts by collecting resources fromt he file on the RHS, not from the spell. + +green_spells_[arcane/divine]: list of spells (basically summoning) that need a green icon but don't have one available in IWD. They get algorithmically recoloured. + +ids_remaps: small changes in the IWD ids entry, so as to avoid namespace awkwardness in BG2 + +iwd_[arcane/divine/bard]: The spells to install, plus the BG2 scroll to use as a shadow if installing a wizard spell + +overwrite: these spells should overwrite the BG2 equivalent (normally, if there's a BG2 version there already, we skip our version) + +resource_overwrite: these items should be copied over even if they have a namespace conflict with BG(2)EE resources + diff --git a/iwdification/data/overwrite.2da b/iwdification/data/overwrite.2da new file mode 100644 index 0000000..df600b8 --- /dev/null +++ b/iwdification/data/overwrite.2da @@ -0,0 +1,12 @@ +WIZARD_MONSTER_SUMMONING_1 +WIZARD_MONSTER_SUMMONING_2 +WIZARD_MONSTER_SUMMONING_3 +WIZARD_CONJURE_LESSER_AIR_ELEMENTAL +WIZARD_CONJURE_LESSER_EARTH_ELEMENTAL +WIZARD_CONJURE_LESSER_FIRE_ELEMENTAL +WIZARD_EMOTION_HOPELESSNESS +CLERIC_CAUSE_SERIOUS_WOUNDS +CLERIC_CAUSE_CRITICAL_WOUNDS +CLERIC_CHANT +CLERIC_INSECT_PLAGUE +CLERIC_CREEPING_DOOM \ No newline at end of file diff --git a/iwdification/data/overwrite_sr.2da b/iwdification/data/overwrite_sr.2da new file mode 100644 index 0000000..e69de29 diff --git a/iwdification/data/resource_overwrite.2da b/iwdification/data/resource_overwrite.2da new file mode 100644 index 0000000..0e7fc48 --- /dev/null +++ b/iwdification/data/resource_overwrite.2da @@ -0,0 +1,6 @@ +MSUMM1H.VVC +MSUMM1X.VVC +MSUMM1X.BAM +ASUMM1X.BAM +CWELEMW.2DA +FLPR717A.SPL \ No newline at end of file diff --git a/iwdification/data/scroll_prices_arcane.txt b/iwdification/data/scroll_prices_arcane.txt new file mode 100644 index 0000000..9d9974c --- /dev/null +++ b/iwdification/data/scroll_prices_arcane.txt @@ -0,0 +1,45 @@ + +WIZARD_SNILLOCS_SNOWBALL_SWARM 300 +WIZARD_DECASTAVE 300 +WIZARD_CATS_GRACE 200 +WIZARD_ICELANCE 400 +WIZARD_LANCE_OF_DISRUPTION 400 +WIZARD_BELTYNS_BURNING_BLOOD 400 +WIZARD_EMOTION_COURAGE 400 +WIZARD_EMOTION_HOPE 500 +WIZARD_EMOTION_FEAR 400 +WIZARD_EMOTION_HOPELESSNESS 400 +WIZARD_MORDENKAINENS_FORCE_MISSILES 400 +WIZARD_SHOUT 500 +WIZARD_VITRIOLIC_SPHERE 500 +WIZARD_SHROUD_OF_FLAME 1000 +WIZARD_OTILUKES_FREEZING_SPHERE 2000 +WIZARD_DARTS_OF_BONE 2000 +WIZARD_SOUL_EATER 2000 +WIZARD_TROLLISH_FORTITUDE 2000 +WIZARD_ACID_STORM 3000 +WIZARD_SUFFOCATE 3000 +WIZARD_MIND_BLANK 5000 +WIZARD_GREAT_SHOUT 5000 +WIZARD_IRON_BODY 5000 +WIZARD_SUMMON_SHADOW 1000 +WIZARD_MONSTER_SUMMONING_4 2000 +WIZARD_MONSTER_SUMMONING_7 5000 +WIZARD_MONSTER_SUMMONING_6 5000 +WIZARD_MONSTER_SUMMONING_5 3000 +WIZARD_MONSTER_SUMMONING_1 300 +WIZARD_MONSTER_SUMMONING_2 1200 +WIZARD_MONSTER_SUMMONING_3 500 +WIZARD_CONJURE_LESSER_EARTH_ELEMENTAL 1000 +WIZARD_CONJURE_LESSER_FIRE_ELEMENTAL 1000 +WIZARD_CONJURE_LESSER_AIR_ELEMENTAL 1000 +WIZARD_CONJURE_LESSER_WATER_ELEMENTAL 1000 +WIZARD_MORDENKAINENS_SWORD_IWD 3000 +WIZARD_EXPEDITIOUS_RETREAT 100 +WIZARD_SHADOW_MONSTERS 500 +WIZARD_DEMI_SHADOW_MONSTERS 1000 +WIZARD_ANTIMAGIC_SHELL 2000 +WIZARD_LICH_TOUCH 2000 +WIZARD_SHADES 2000 +WIZARD_MALAVONS_RAGE 3000 +WIZARD_SEVEN_EYES 3000 diff --git a/iwdification/data/scroll_prices_divine.txt b/iwdification/data/scroll_prices_divine.txt new file mode 100644 index 0000000..61c2c5f --- /dev/null +++ b/iwdification/data/scroll_prices_divine.txt @@ -0,0 +1,7 @@ + +CLERIC_CURE_MODERATE_WOUNDS 200 +CLERIC_PRAYER 300 +CLERIC_FAVOR_OF_ILMATER 300 +CLERIC_SPIKE_STONES 1500 +CLERIC_SYMBOL_PAIN 3000 +CLERIC_CHANT 200 diff --git a/iwdification/data/spell_styles_bg.2da b/iwdification/data/spell_styles_bg.2da new file mode 100644 index 0000000..3d08bee --- /dev/null +++ b/iwdification/data/spell_styles_bg.2da @@ -0,0 +1,25 @@ +2DA V1.0 +* + vvc wav glow +mage_enchantment 141-10 EFF_M05 61-509245440-1638400 +mage_abjuration 141-14 EFF_M02 61-1014504960-1638400 +mage_divination 141-28 EFF_M04 61-2021160960-1638400 +mage_invocation 141-24 null 61-1996800-1638400 +mage_alteration 141-4 null 61-2017213440-1638400 +mage_blind_deaf 141-17 EFF_M58 61-1511938560-1638400 +mage_necromancy 141-2 EFF_M07 61-2019179520-1638400 +mage_mirror_image null EFF_M92 null +mage_spook 141-17 EFF_M79 61-1511938560-1638400 +mage_invisibility 141-16 EFF_M33 61-1511938560-1638400 +mage_detect_illusion 141-30 EFF_M04 61-2021160960-1638400 +mage_antimagic SPATTCK1 null null +mage_ruby_ray null null null +mage_confusion null null 61-509245440-1638400 +mage_symbol 141-20 EFF_M03 61-2015247360-1638400 +cleric_abjuration null null 61-1014504960-1638400 +cleric_alteration 141-4 EFF_P56 61-2017213440-1638400 +cleric_conjuration 141-20 EFF_P02 61-2015247360-1638400 +cleric_divination 141-30 EFF_P03 61-2021160960-1638400 +cleric_enchantment 141-9 EFF_P13 61-509245440-1638400 +cleric_invocation null null 61-1996800-1638400 +cleric_necromancy 141-2 null 61-2019179520-1638400 diff --git a/iwdification/data/spell_styles_iwd.2da b/iwdification/data/spell_styles_iwd.2da new file mode 100644 index 0000000..538870d --- /dev/null +++ b/iwdification/data/spell_styles_iwd.2da @@ -0,0 +1,25 @@ +2DA V1.0 +* + vvc wav glow +mage_enchantment ENCHAH #EFF_M05 61-1355960320-1966080 +mage_abjuration ABJURH #EFF_M02 61-1183635200-1966080 +mage_divination DIVINH #EFF_M04 61--767138816-1966080 +mage_invocation INVOCH #EFF_M06 61--938840576-1966080 +mage_alteration ALTERH #EFF_M08 61--1596830976-1966080 +mage_blind_deaf ILLUSH #EFF_M01 61--765833216-1966080 +mage_necromancy NECROH #EFF_M07 61-1355985920-1966080 +mage_mirror_image ILLUSH #EFF_M34 61--765833216-1966080 +mage_spook ILLUSH EFF_M79 61--765833216-1966080 +mage_invisibility ILLUSH #EFF_M33 61--765833216-1966080 +mage_detect_illusion #GENDIVI #EFF_M04 61--767138816-1966080 +mage_antimagic ABJURH #EFF_M10 61-1183635200-1966080 +mage_ruby_ray ALTERH #EFF_M10 61--1596830976-1966080 +mage_confusion CONFUSH #EFF_M16 null +mage_symbol CONJUH EFF_M03 61-1188522240-1966080 +cleric_abjuration ABJURH #EFF_P01 61-1183635200-1966080 +cleric_alteration ALTERH #EFF_P07 61--1596830976-1966080 +cleric_conjuration CONJUH #EFF_P02 61-1188522240-1966080 +cleric_divination DIVINH #EFF_P03 61--767138816-1966080 +cleric_enchantment ENCHAH #EFF_P04 61-1355960320-1966080 +cleric_invocation INVOCH #EFF_P05 61--938840576-1966080 +cleric_necromancy NECROH #EFF_P06 61-1355985920-1966080 diff --git a/iwdification/data/sr_nwn_arcane.2da b/iwdification/data/sr_nwn_arcane.2da new file mode 100644 index 0000000..e2ba96d --- /dev/null +++ b/iwdification/data/sr_nwn_arcane.2da @@ -0,0 +1,8 @@ +WIZARD_SHOUT 1 +WIZARD_EMOTION_FEAR 1 +WIZARD_EMOTION_HOPELESSNESS 1 +WIZARD_SOUL_EATER 1 +WIZARD_ACID_STORM 1 +WIZARD_SUFFOCATE 1 +WIZARD_GREAT_SHOUT 1 +WIZARD_MALAVONS_RAGE 1 \ No newline at end of file diff --git a/iwdification/data/sr_nwn_divine.2da b/iwdification/data/sr_nwn_divine.2da new file mode 100644 index 0000000..7f76c0f --- /dev/null +++ b/iwdification/data/sr_nwn_divine.2da @@ -0,0 +1,6 @@ +CLERIC_CLOUDBURST 1 +CLERIC_SMASHING_WAVE 1 +CLERIC_THORN_SPRAY 1 +CLERIC_MASS_CAUSE_LIGHT_WOUNDS 1 +CLERIC_SPIRITUAL_WRATH 1 +CLERIC_PRODUCE_FIRE 1 \ No newline at end of file diff --git a/iwdification/dw_iwdspells.ini b/iwdification/dw_iwdspells.ini new file mode 100644 index 0000000..f40f330 --- /dev/null +++ b/iwdification/dw_iwdspells.ini @@ -0,0 +1,2 @@ +create_boneguard=1 +debug_variable=0 \ No newline at end of file diff --git a/iwdification/animations/e220/mbbma1.bam b/iwdification/dw_iwdspells_resource/anim/bam/mbbma1.bam similarity index 100% rename from iwdification/animations/e220/mbbma1.bam rename to iwdification/dw_iwdspells_resource/anim/bam/mbbma1.bam diff --git a/iwdification/animations/e220/mbbma1e.bam b/iwdification/dw_iwdspells_resource/anim/bam/mbbma1e.bam similarity index 100% rename from iwdification/animations/e220/mbbma1e.bam rename to iwdification/dw_iwdspells_resource/anim/bam/mbbma1e.bam diff --git a/iwdification/animations/e220/mbbma4.bam b/iwdification/dw_iwdspells_resource/anim/bam/mbbma4.bam similarity index 100% rename from iwdification/animations/e220/mbbma4.bam rename to iwdification/dw_iwdspells_resource/anim/bam/mbbma4.bam diff --git a/iwdification/animations/e220/mbbma4e.bam b/iwdification/dw_iwdspells_resource/anim/bam/mbbma4e.bam similarity index 100% rename from iwdification/animations/e220/mbbma4e.bam rename to iwdification/dw_iwdspells_resource/anim/bam/mbbma4e.bam diff --git a/iwdification/animations/e220/mbbmca.bam b/iwdification/dw_iwdspells_resource/anim/bam/mbbmca.bam similarity index 100% rename from iwdification/animations/e220/mbbmca.bam rename to iwdification/dw_iwdspells_resource/anim/bam/mbbmca.bam diff --git a/iwdification/animations/e220/mbbmcae.bam b/iwdification/dw_iwdspells_resource/anim/bam/mbbmcae.bam similarity index 100% rename from iwdification/animations/e220/mbbmcae.bam rename to iwdification/dw_iwdspells_resource/anim/bam/mbbmcae.bam diff --git a/iwdification/animations/e220/mbbmde.bam b/iwdification/dw_iwdspells_resource/anim/bam/mbbmde.bam similarity index 100% rename from iwdification/animations/e220/mbbmde.bam rename to iwdification/dw_iwdspells_resource/anim/bam/mbbmde.bam diff --git a/iwdification/animations/e220/mbbmdee.bam b/iwdification/dw_iwdspells_resource/anim/bam/mbbmdee.bam similarity index 100% rename from iwdification/animations/e220/mbbmdee.bam rename to iwdification/dw_iwdspells_resource/anim/bam/mbbmdee.bam diff --git a/iwdification/animations/e220/mbbmgh.bam b/iwdification/dw_iwdspells_resource/anim/bam/mbbmgh.bam similarity index 100% rename from iwdification/animations/e220/mbbmgh.bam rename to iwdification/dw_iwdspells_resource/anim/bam/mbbmgh.bam diff --git a/iwdification/animations/e220/mbbmghe.bam b/iwdification/dw_iwdspells_resource/anim/bam/mbbmghe.bam similarity index 100% rename from iwdification/animations/e220/mbbmghe.bam rename to iwdification/dw_iwdspells_resource/anim/bam/mbbmghe.bam diff --git a/iwdification/animations/e220/mbbmgu.bam b/iwdification/dw_iwdspells_resource/anim/bam/mbbmgu.bam similarity index 100% rename from iwdification/animations/e220/mbbmgu.bam rename to iwdification/dw_iwdspells_resource/anim/bam/mbbmgu.bam diff --git a/iwdification/animations/e220/mbbmgue.bam b/iwdification/dw_iwdspells_resource/anim/bam/mbbmgue.bam similarity index 100% rename from iwdification/animations/e220/mbbmgue.bam rename to iwdification/dw_iwdspells_resource/anim/bam/mbbmgue.bam diff --git a/iwdification/animations/e220/mbbmsc.bam b/iwdification/dw_iwdspells_resource/anim/bam/mbbmsc.bam similarity index 100% rename from iwdification/animations/e220/mbbmsc.bam rename to iwdification/dw_iwdspells_resource/anim/bam/mbbmsc.bam diff --git a/iwdification/animations/e220/mbbmsce.bam b/iwdification/dw_iwdspells_resource/anim/bam/mbbmsce.bam similarity index 100% rename from iwdification/animations/e220/mbbmsce.bam rename to iwdification/dw_iwdspells_resource/anim/bam/mbbmsce.bam diff --git a/iwdification/animations/e220/mbbmsd.bam b/iwdification/dw_iwdspells_resource/anim/bam/mbbmsd.bam similarity index 100% rename from iwdification/animations/e220/mbbmsd.bam rename to iwdification/dw_iwdspells_resource/anim/bam/mbbmsd.bam diff --git a/iwdification/animations/e220/mbbmsde.bam b/iwdification/dw_iwdspells_resource/anim/bam/mbbmsde.bam similarity index 100% rename from iwdification/animations/e220/mbbmsde.bam rename to iwdification/dw_iwdspells_resource/anim/bam/mbbmsde.bam diff --git a/iwdification/animations/e220/mbbmsl.bam b/iwdification/dw_iwdspells_resource/anim/bam/mbbmsl.bam similarity index 100% rename from iwdification/animations/e220/mbbmsl.bam rename to iwdification/dw_iwdspells_resource/anim/bam/mbbmsl.bam diff --git a/iwdification/animations/e220/mbbmsle.bam b/iwdification/dw_iwdspells_resource/anim/bam/mbbmsle.bam similarity index 100% rename from iwdification/animations/e220/mbbmsle.bam rename to iwdification/dw_iwdspells_resource/anim/bam/mbbmsle.bam diff --git a/iwdification/animations/e220/mbbmsp.bam b/iwdification/dw_iwdspells_resource/anim/bam/mbbmsp.bam similarity index 100% rename from iwdification/animations/e220/mbbmsp.bam rename to iwdification/dw_iwdspells_resource/anim/bam/mbbmsp.bam diff --git a/iwdification/animations/e220/mbbmspe.bam b/iwdification/dw_iwdspells_resource/anim/bam/mbbmspe.bam similarity index 100% rename from iwdification/animations/e220/mbbmspe.bam rename to iwdification/dw_iwdspells_resource/anim/bam/mbbmspe.bam diff --git a/iwdification/animations/e220/mbbmtw.bam b/iwdification/dw_iwdspells_resource/anim/bam/mbbmtw.bam similarity index 100% rename from iwdification/animations/e220/mbbmtw.bam rename to iwdification/dw_iwdspells_resource/anim/bam/mbbmtw.bam diff --git a/iwdification/animations/e220/mbbmtwe.bam b/iwdification/dw_iwdspells_resource/anim/bam/mbbmtwe.bam similarity index 100% rename from iwdification/animations/e220/mbbmtwe.bam rename to iwdification/dw_iwdspells_resource/anim/bam/mbbmtwe.bam diff --git a/iwdification/animations/e220/mbbmwk.bam b/iwdification/dw_iwdspells_resource/anim/bam/mbbmwk.bam similarity index 100% rename from iwdification/animations/e220/mbbmwk.bam rename to iwdification/dw_iwdspells_resource/anim/bam/mbbmwk.bam diff --git a/iwdification/animations/e220/mbbmwke.bam b/iwdification/dw_iwdspells_resource/anim/bam/mbbmwke.bam similarity index 100% rename from iwdification/animations/e220/mbbmwke.bam rename to iwdification/dw_iwdspells_resource/anim/bam/mbbmwke.bam diff --git a/iwdification/animations/e070/bf_md01.wav b/iwdification/dw_iwdspells_resource/anim/wav/bf_md01.wav similarity index 100% rename from iwdification/animations/e070/bf_md01.wav rename to iwdification/dw_iwdspells_resource/anim/wav/bf_md01.wav diff --git a/iwdification/animations/e070/bf_md02.wav b/iwdification/dw_iwdspells_resource/anim/wav/bf_md02.wav similarity index 100% rename from iwdification/animations/e070/bf_md02.wav rename to iwdification/dw_iwdspells_resource/anim/wav/bf_md02.wav diff --git a/iwdification/animations/e070/bf_md03.wav b/iwdification/dw_iwdspells_resource/anim/wav/bf_md03.wav similarity index 100% rename from iwdification/animations/e070/bf_md03.wav rename to iwdification/dw_iwdspells_resource/anim/wav/bf_md03.wav diff --git a/iwdification/dw_iwdspells_resource/anim/wav/bf_md04.wav b/iwdification/dw_iwdspells_resource/anim/wav/bf_md04.wav new file mode 100644 index 0000000..a5678e5 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/anim/wav/bf_md04.wav differ diff --git a/iwdification/dw_iwdspells_resource/anim/wav/bf_md05.wav b/iwdification/dw_iwdspells_resource/anim/wav/bf_md05.wav new file mode 100644 index 0000000..7b81be7 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/anim/wav/bf_md05.wav differ diff --git a/iwdification/dw_iwdspells_resource/anim/wav/bf_md06.wav b/iwdification/dw_iwdspells_resource/anim/wav/bf_md06.wav new file mode 100644 index 0000000..cc04196 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/anim/wav/bf_md06.wav differ diff --git a/iwdification/animations/e220/bomba01.wav b/iwdification/dw_iwdspells_resource/anim/wav/bomba01.wav similarity index 100% rename from iwdification/animations/e220/bomba01.wav rename to iwdification/dw_iwdspells_resource/anim/wav/bomba01.wav diff --git a/iwdification/animations/e220/bomba02.wav b/iwdification/dw_iwdspells_resource/anim/wav/bomba02.wav similarity index 100% rename from iwdification/animations/e220/bomba02.wav rename to iwdification/dw_iwdspells_resource/anim/wav/bomba02.wav diff --git a/iwdification/animations/e220/bomba03a.wav b/iwdification/dw_iwdspells_resource/anim/wav/bomba03a.wav similarity index 100% rename from iwdification/animations/e220/bomba03a.wav rename to iwdification/dw_iwdspells_resource/anim/wav/bomba03a.wav diff --git a/iwdification/animations/e220/bomba03b.wav b/iwdification/dw_iwdspells_resource/anim/wav/bomba03b.wav similarity index 100% rename from iwdification/animations/e220/bomba03b.wav rename to iwdification/dw_iwdspells_resource/anim/wav/bomba03b.wav diff --git a/iwdification/animations/e220/bomba07.wav b/iwdification/dw_iwdspells_resource/anim/wav/bomba07.wav similarity index 100% rename from iwdification/animations/e220/bomba07.wav rename to iwdification/dw_iwdspells_resource/anim/wav/bomba07.wav diff --git a/iwdification/animations/e220/bomba08.wav b/iwdification/dw_iwdspells_resource/anim/wav/bomba08.wav similarity index 100% rename from iwdification/animations/e220/bomba08.wav rename to iwdification/dw_iwdspells_resource/anim/wav/bomba08.wav diff --git a/iwdification/animations/e220/bomba09a.wav b/iwdification/dw_iwdspells_resource/anim/wav/bomba09a.wav similarity index 100% rename from iwdification/animations/e220/bomba09a.wav rename to iwdification/dw_iwdspells_resource/anim/wav/bomba09a.wav diff --git a/iwdification/animations/e220/bomba09b.wav b/iwdification/dw_iwdspells_resource/anim/wav/bomba09b.wav similarity index 100% rename from iwdification/animations/e220/bomba09b.wav rename to iwdification/dw_iwdspells_resource/anim/wav/bomba09b.wav diff --git a/iwdification/dw_iwdspells_resource/anim/wav/bomba11.wav b/iwdification/dw_iwdspells_resource/anim/wav/bomba11.wav new file mode 100644 index 0000000..0ddb706 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/anim/wav/bomba11.wav differ diff --git a/iwdification/dw_iwdspells_resource/arcane_proj.txt b/iwdification/dw_iwdspells_resource/arcane_proj.txt new file mode 100644 index 0000000..ce81ae8 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/arcane_proj.txt @@ -0,0 +1,29 @@ + +mfmiss 436 +mfmiss2 437 +mfmiss2 438 +mfmiss2 439 +mfmiss2 440 +mfmiss2 441 +mfmiss2 442 +mfmiss2 443 +mfmiss2 444 +mfmiss2 445 +mfmiss2 446 +idpro217 348 +idpro251 368 +idpro313 408 +lodisr 478 +idpro407 433 +idpro255 371 +mfmissa 471 +idpro315 409 +idpro316 410 +VSPHERX 477 +IDSHROUD 62 +idpro269 381 +idpro299 401 +idpro211 343 +idpro317 411 +idpro319 413 +idpro209 342 diff --git a/iwdification/dw_iwdspells_resource/arcane_resrefs.txt b/iwdification/dw_iwdspells_resource/arcane_resrefs.txt new file mode 100644 index 0000000..865dae6 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/arcane_resrefs.txt @@ -0,0 +1,52 @@ + +WIZARD_SNILLOCS_SNOWBALL_SWARM SPWI204 +WIZARD_DECASTAVE SPWI216 +WIZARD_CATS_GRACE SPWI225 +WIZARD_ICELANCE SPWI327 +WIZARD_LANCE_OF_DISRUPTION SPWI328 +WIZARD_BELTYNS_BURNING_BLOOD SPWI422 +WIZARD_EMOTION_COURAGE SPWI427 +WIZARD_EMOTION_HOPE SPWI429 +WIZARD_EMOTION_FEAR SPWI428 +WIZARD_EMOTION_HOPELESSNESS SPWI411 +WIZARD_MORDENKAINENS_FORCE_MISSILES SPWI430 +WIZARD_SHOUT SPWI431 +WIZARD_VITRIOLIC_SPHERE SPWI432 +WIZARD_SHROUD_OF_FLAME SPWI524 +WIZARD_OTILUKES_FREEZING_SPHERE SPWI628 +WIZARD_DARTS_OF_BONE SPWI630 +WIZARD_SOUL_EATER SPWI631 +WIZARD_TROLLISH_FORTITUDE SPWI632 +WIZARD_ACID_STORM SPWI724 +WIZARD_SUFFOCATE SPWI726 +WIZARD_MIND_BLANK SPWI802 +WIZARD_GREAT_SHOUT SPWI806 +WIZARD_IRON_BODY SPWI814 +WIZARD_SUMMON_SHADOW SPWI526 +WIZARD_MONSTER_SUMMONING_4 SPWI627 +WIZARD_MONSTER_SUMMONING_7 SPWI901 +WIZARD_MONSTER_SUMMONING_6 SPWI801 +WIZARD_MONSTER_SUMMONING_5 SPWI706 +WIZARD_MONSTER_SUMMONING_1 SPWI309 +WIZARD_MONSTER_SUMMONING_2 SPWI407 +WIZARD_MONSTER_SUMMONING_3 SPWI504 +WIZARD_CONJURE_LESSER_EARTH_ELEMENTAL SPWI532 +WIZARD_CONJURE_LESSER_FIRE_ELEMENTAL SPWI531 +WIZARD_CONJURE_LESSER_AIR_ELEMENTAL SPWI534 +WIZARD_CONJURE_LESSER_WATER_ELEMENTAL SPWI533 +WIZARD_MORDENKAINENS_SWORD_IWD SPWI716 +WIZARD_EXPEDITIOUS_RETREAT SPWI126 +WIZARD_SHADOW_MONSTERS SPWI426 +WIZARD_DEMI_SHADOW_MONSTERS SPWI525 +WIZARD_ANTIMAGIC_SHELL SPWI610 +WIZARD_LICH_TOUCH SPWI626 +WIZARD_SHADES SPWI629 +WIZARD_MALAVONS_RAGE SPWI709 +WIZARD_SEVEN_EYES SPWI725 +SEVEN_EYES_MIND SPIN107 +SEVEN_EYES_MAGE SPIN109 +SEVEN_EYES_SWORD SPIN108 +SEVEN_EYES_VENOM SPIN110 +SEVEN_EYES_FORTITUDE SPIN112 +SEVEN_EYES_SPIRIT SPIN111 +SEVEN_EYES_STONE SPIN113 diff --git a/iwdification/dw_iwdspells_resource/arcane_smtable.txt b/iwdification/dw_iwdspells_resource/arcane_smtable.txt new file mode 100644 index 0000000..36708a3 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/arcane_smtable.txt @@ -0,0 +1,16 @@ + +17 SShadow +3 MSUMMO4 +6 MSUMMO7 +5 MSUMMO6 +4 MSUMMO5 +0 MSUMMO1 +1 MSUMMO2 +2 MSUMMO3 +20 CEElemW +19 CFElemW +29 CAELEMW +21 CWElemW +26 SMONSTE +27 DSMONST +28 SHADES diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_aerial_servant_animation_a.bam b/iwdification/dw_iwdspells_resource/bam/cleric_aerial_servant_animation_a.bam new file mode 100644 index 0000000..c71ac62 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_aerial_servant_animation_a.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_aerial_servant_animation_b.bam b/iwdification/dw_iwdspells_resource/bam/cleric_aerial_servant_animation_b.bam new file mode 100644 index 0000000..32a37ec Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_aerial_servant_animation_b.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_aerial_servant_animation_c.bam b/iwdification/dw_iwdspells_resource/bam/cleric_aerial_servant_animation_c.bam new file mode 100644 index 0000000..a7e95a2 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_aerial_servant_animation_c.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_animal_summoning_1_animation_a.bam b/iwdification/dw_iwdspells_resource/bam/cleric_animal_summoning_1_animation_a.bam new file mode 100644 index 0000000..179acc8 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_animal_summoning_1_animation_a.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_animal_summoning_1_animation_b.bam b/iwdification/dw_iwdspells_resource/bam/cleric_animal_summoning_1_animation_b.bam new file mode 100644 index 0000000..380ad09 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_animal_summoning_1_animation_b.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_animal_summoning_1_animation_c.bam b/iwdification/dw_iwdspells_resource/bam/cleric_animal_summoning_1_animation_c.bam new file mode 100644 index 0000000..50fe9de Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_animal_summoning_1_animation_c.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_animal_summoning_2_animation_a.bam b/iwdification/dw_iwdspells_resource/bam/cleric_animal_summoning_2_animation_a.bam new file mode 100644 index 0000000..44d168c Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_animal_summoning_2_animation_a.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_animal_summoning_2_animation_b.bam b/iwdification/dw_iwdspells_resource/bam/cleric_animal_summoning_2_animation_b.bam new file mode 100644 index 0000000..653c30d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_animal_summoning_2_animation_b.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_animal_summoning_2_animation_c.bam b/iwdification/dw_iwdspells_resource/bam/cleric_animal_summoning_2_animation_c.bam new file mode 100644 index 0000000..2446b7f Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_animal_summoning_2_animation_c.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_animal_summoning_3_animation_a.bam b/iwdification/dw_iwdspells_resource/bam/cleric_animal_summoning_3_animation_a.bam new file mode 100644 index 0000000..df862c5 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_animal_summoning_3_animation_a.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_animal_summoning_3_animation_b.bam b/iwdification/dw_iwdspells_resource/bam/cleric_animal_summoning_3_animation_b.bam new file mode 100644 index 0000000..760f97f Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_animal_summoning_3_animation_b.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_animal_summoning_3_animation_c.bam b/iwdification/dw_iwdspells_resource/bam/cleric_animal_summoning_3_animation_c.bam new file mode 100644 index 0000000..56f415c Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_animal_summoning_3_animation_c.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_animate_dead_animation_a.bam b/iwdification/dw_iwdspells_resource/bam/cleric_animate_dead_animation_a.bam new file mode 100644 index 0000000..14bc315 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_animate_dead_animation_a.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_animate_dead_animation_b.bam b/iwdification/dw_iwdspells_resource/bam/cleric_animate_dead_animation_b.bam new file mode 100644 index 0000000..979e3cb Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_animate_dead_animation_b.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_animate_dead_animation_c.bam b/iwdification/dw_iwdspells_resource/bam/cleric_animate_dead_animation_c.bam new file mode 100644 index 0000000..d5b9018 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_animate_dead_animation_c.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_call_woodland_beings_animation_a.bam b/iwdification/dw_iwdspells_resource/bam/cleric_call_woodland_beings_animation_a.bam new file mode 100644 index 0000000..70a19ae Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_call_woodland_beings_animation_a.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_call_woodland_beings_animation_b.bam b/iwdification/dw_iwdspells_resource/bam/cleric_call_woodland_beings_animation_b.bam new file mode 100644 index 0000000..2bc7f5e Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_call_woodland_beings_animation_b.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_call_woodland_beings_animation_c.bam b/iwdification/dw_iwdspells_resource/bam/cleric_call_woodland_beings_animation_c.bam new file mode 100644 index 0000000..64d5bee Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_call_woodland_beings_animation_c.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_conjure_animals_animation_a.bam b/iwdification/dw_iwdspells_resource/bam/cleric_conjure_animals_animation_a.bam new file mode 100644 index 0000000..d819abd Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_conjure_animals_animation_a.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_conjure_animals_animation_b.bam b/iwdification/dw_iwdspells_resource/bam/cleric_conjure_animals_animation_b.bam new file mode 100644 index 0000000..64dbcce Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_conjure_animals_animation_b.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_conjure_animals_animation_c.bam b/iwdification/dw_iwdspells_resource/bam/cleric_conjure_animals_animation_c.bam new file mode 100644 index 0000000..663cedc Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_conjure_animals_animation_c.bam differ diff --git a/iwdification/bam/cdia532a.bam b/iwdification/dw_iwdspells_resource/bam/cleric_conjure_earth_elemental_animation_a.bam similarity index 100% rename from iwdification/bam/cdia532a.bam rename to iwdification/dw_iwdspells_resource/bam/cleric_conjure_earth_elemental_animation_a.bam diff --git a/iwdification/bam/cdia532b.bam b/iwdification/dw_iwdspells_resource/bam/cleric_conjure_earth_elemental_animation_b.bam similarity index 100% rename from iwdification/bam/cdia532b.bam rename to iwdification/dw_iwdspells_resource/bam/cleric_conjure_earth_elemental_animation_b.bam diff --git a/iwdification/bam/cdia532c.bam b/iwdification/dw_iwdspells_resource/bam/cleric_conjure_earth_elemental_animation_c.bam similarity index 100% rename from iwdification/bam/cdia532c.bam rename to iwdification/dw_iwdspells_resource/bam/cleric_conjure_earth_elemental_animation_c.bam diff --git a/iwdification/bam/cdia531a.bam b/iwdification/dw_iwdspells_resource/bam/cleric_conjure_fire_elemental_animation_a.bam similarity index 100% rename from iwdification/bam/cdia531a.bam rename to iwdification/dw_iwdspells_resource/bam/cleric_conjure_fire_elemental_animation_a.bam diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_conjure_fire_elemental_animation_b.bam b/iwdification/dw_iwdspells_resource/bam/cleric_conjure_fire_elemental_animation_b.bam new file mode 100644 index 0000000..635b3e2 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_conjure_fire_elemental_animation_b.bam differ diff --git a/iwdification/bam/cdia531c.bam b/iwdification/dw_iwdspells_resource/bam/cleric_conjure_fire_elemental_animation_c.bam similarity index 100% rename from iwdification/bam/cdia531c.bam rename to iwdification/dw_iwdspells_resource/bam/cleric_conjure_fire_elemental_animation_c.bam diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_creeping_doom_animation_a.bam b/iwdification/dw_iwdspells_resource/bam/cleric_creeping_doom_animation_a.bam new file mode 100644 index 0000000..128324a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_creeping_doom_animation_a.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_creeping_doom_animation_b.bam b/iwdification/dw_iwdspells_resource/bam/cleric_creeping_doom_animation_b.bam new file mode 100644 index 0000000..7f84b56 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_creeping_doom_animation_b.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_creeping_doom_animation_c.bam b/iwdification/dw_iwdspells_resource/bam/cleric_creeping_doom_animation_c.bam new file mode 100644 index 0000000..5930e8c Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_creeping_doom_animation_c.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_elemental_swarm_animation_a.bam b/iwdification/dw_iwdspells_resource/bam/cleric_elemental_swarm_animation_a.bam new file mode 100644 index 0000000..8d7482e Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_elemental_swarm_animation_a.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_elemental_swarm_animation_b.bam b/iwdification/dw_iwdspells_resource/bam/cleric_elemental_swarm_animation_b.bam new file mode 100644 index 0000000..20a3d5c Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_elemental_swarm_animation_b.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_elemental_swarm_animation_c.bam b/iwdification/dw_iwdspells_resource/bam/cleric_elemental_swarm_animation_c.bam new file mode 100644 index 0000000..fe42cc7 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_elemental_swarm_animation_c.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_gate_animation_a.bam b/iwdification/dw_iwdspells_resource/bam/cleric_gate_animation_a.bam new file mode 100644 index 0000000..d824b7b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_gate_animation_a.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_gate_animation_b.bam b/iwdification/dw_iwdspells_resource/bam/cleric_gate_animation_b.bam new file mode 100644 index 0000000..93cd323 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_gate_animation_b.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_gate_animation_c.bam b/iwdification/dw_iwdspells_resource/bam/cleric_gate_animation_c.bam new file mode 100644 index 0000000..39f7912 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_gate_animation_c.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_greater_elemental_swarm_animation_a.bam b/iwdification/dw_iwdspells_resource/bam/cleric_greater_elemental_swarm_animation_a.bam new file mode 100644 index 0000000..393cc6d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_greater_elemental_swarm_animation_a.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_greater_elemental_swarm_animation_b.bam b/iwdification/dw_iwdspells_resource/bam/cleric_greater_elemental_swarm_animation_b.bam new file mode 100644 index 0000000..7e4efbe Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_greater_elemental_swarm_animation_b.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_greater_elemental_swarm_animation_c.bam b/iwdification/dw_iwdspells_resource/bam/cleric_greater_elemental_swarm_animation_c.bam new file mode 100644 index 0000000..f3d6120 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_greater_elemental_swarm_animation_c.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_insect_plague_animation_a.bam b/iwdification/dw_iwdspells_resource/bam/cleric_insect_plague_animation_a.bam new file mode 100644 index 0000000..d7328d2 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_insect_plague_animation_a.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_insect_plague_animation_b.bam b/iwdification/dw_iwdspells_resource/bam/cleric_insect_plague_animation_b.bam new file mode 100644 index 0000000..243373d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_insect_plague_animation_b.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_insect_plague_animation_c.bam b/iwdification/dw_iwdspells_resource/bam/cleric_insect_plague_animation_c.bam new file mode 100644 index 0000000..601e539 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_insect_plague_animation_c.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_summon_deva_animation_a.bam b/iwdification/dw_iwdspells_resource/bam/cleric_summon_deva_animation_a.bam new file mode 100644 index 0000000..8a62dbb Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_summon_deva_animation_a.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_summon_deva_animation_b.bam b/iwdification/dw_iwdspells_resource/bam/cleric_summon_deva_animation_b.bam new file mode 100644 index 0000000..c69c3ed Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_summon_deva_animation_b.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_summon_deva_animation_c.bam b/iwdification/dw_iwdspells_resource/bam/cleric_summon_deva_animation_c.bam new file mode 100644 index 0000000..9daf53a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_summon_deva_animation_c.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_summon_fallen_deva_animation_a.bam b/iwdification/dw_iwdspells_resource/bam/cleric_summon_fallen_deva_animation_a.bam new file mode 100644 index 0000000..240540e Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_summon_fallen_deva_animation_a.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_summon_fallen_deva_animation_b.bam b/iwdification/dw_iwdspells_resource/bam/cleric_summon_fallen_deva_animation_b.bam new file mode 100644 index 0000000..9c9feba Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_summon_fallen_deva_animation_b.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_summon_fallen_deva_animation_c.bam b/iwdification/dw_iwdspells_resource/bam/cleric_summon_fallen_deva_animation_c.bam new file mode 100644 index 0000000..0b9782e Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_summon_fallen_deva_animation_c.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_summon_insects_animation_a.bam b/iwdification/dw_iwdspells_resource/bam/cleric_summon_insects_animation_a.bam new file mode 100644 index 0000000..3d62dfc Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_summon_insects_animation_a.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_summon_insects_animation_b.bam b/iwdification/dw_iwdspells_resource/bam/cleric_summon_insects_animation_b.bam new file mode 100644 index 0000000..ee43d24 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_summon_insects_animation_b.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/cleric_summon_insects_animation_c.bam b/iwdification/dw_iwdspells_resource/bam/cleric_summon_insects_animation_c.bam new file mode 100644 index 0000000..1e75e57 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/cleric_summon_insects_animation_c.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_animate_dead_animation_a.bam b/iwdification/dw_iwdspells_resource/bam/wizard_animate_dead_animation_a.bam new file mode 100644 index 0000000..14bc315 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_animate_dead_animation_a.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_animate_dead_animation_b.bam b/iwdification/dw_iwdspells_resource/bam/wizard_animate_dead_animation_b.bam new file mode 100644 index 0000000..979e3cb Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_animate_dead_animation_b.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_animate_dead_animation_c.bam b/iwdification/dw_iwdspells_resource/bam/wizard_animate_dead_animation_c.bam new file mode 100644 index 0000000..d5b9018 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_animate_dead_animation_c.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_cacofiend_animation_a.bam b/iwdification/dw_iwdspells_resource/bam/wizard_cacofiend_animation_a.bam new file mode 100644 index 0000000..453eebb Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_cacofiend_animation_a.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_cacofiend_animation_b.bam b/iwdification/dw_iwdspells_resource/bam/wizard_cacofiend_animation_b.bam new file mode 100644 index 0000000..0d2497d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_cacofiend_animation_b.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_cacofiend_animation_c.bam b/iwdification/dw_iwdspells_resource/bam/wizard_cacofiend_animation_c.bam new file mode 100644 index 0000000..288e579 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_cacofiend_animation_c.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_carrion_animation_a.bam b/iwdification/dw_iwdspells_resource/bam/wizard_carrion_animation_a.bam new file mode 100644 index 0000000..0d8baa1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_carrion_animation_a.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_carrion_animation_b.bam b/iwdification/dw_iwdspells_resource/bam/wizard_carrion_animation_b.bam new file mode 100644 index 0000000..b201e4a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_carrion_animation_b.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_carrion_animation_c.bam b/iwdification/dw_iwdspells_resource/bam/wizard_carrion_animation_c.bam new file mode 100644 index 0000000..39e06b3 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_carrion_animation_c.bam differ diff --git a/iwdification/bam/cdia534a.bam b/iwdification/dw_iwdspells_resource/bam/wizard_conjure_air_elemental_animation_a.bam similarity index 100% rename from iwdification/bam/cdia534a.bam rename to iwdification/dw_iwdspells_resource/bam/wizard_conjure_air_elemental_animation_a.bam diff --git a/iwdification/bam/cdia534b.bam b/iwdification/dw_iwdspells_resource/bam/wizard_conjure_air_elemental_animation_b.bam similarity index 100% rename from iwdification/bam/cdia534b.bam rename to iwdification/dw_iwdspells_resource/bam/wizard_conjure_air_elemental_animation_b.bam diff --git a/iwdification/bam/cdia534c.bam b/iwdification/dw_iwdspells_resource/bam/wizard_conjure_air_elemental_animation_c.bam similarity index 100% rename from iwdification/bam/cdia534c.bam rename to iwdification/dw_iwdspells_resource/bam/wizard_conjure_air_elemental_animation_c.bam diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_conjure_earth_elemental_animation_a.bam b/iwdification/dw_iwdspells_resource/bam/wizard_conjure_earth_elemental_animation_a.bam new file mode 100644 index 0000000..3cfcd7b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_conjure_earth_elemental_animation_a.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_conjure_earth_elemental_animation_b.bam b/iwdification/dw_iwdspells_resource/bam/wizard_conjure_earth_elemental_animation_b.bam new file mode 100644 index 0000000..1dc8f56 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_conjure_earth_elemental_animation_b.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_conjure_earth_elemental_animation_c.bam b/iwdification/dw_iwdspells_resource/bam/wizard_conjure_earth_elemental_animation_c.bam new file mode 100644 index 0000000..e161160 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_conjure_earth_elemental_animation_c.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_conjure_fire_elemental_animation_a.bam b/iwdification/dw_iwdspells_resource/bam/wizard_conjure_fire_elemental_animation_a.bam new file mode 100644 index 0000000..5e5e646 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_conjure_fire_elemental_animation_a.bam differ diff --git a/iwdification/bam/cdia531b.bam b/iwdification/dw_iwdspells_resource/bam/wizard_conjure_fire_elemental_animation_b.bam similarity index 100% rename from iwdification/bam/cdia531b.bam rename to iwdification/dw_iwdspells_resource/bam/wizard_conjure_fire_elemental_animation_b.bam diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_conjure_fire_elemental_animation_c.bam b/iwdification/dw_iwdspells_resource/bam/wizard_conjure_fire_elemental_animation_c.bam new file mode 100644 index 0000000..8ff5ee0 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_conjure_fire_elemental_animation_c.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_gate_animation_a.bam b/iwdification/dw_iwdspells_resource/bam/wizard_gate_animation_a.bam new file mode 100644 index 0000000..d824b7b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_gate_animation_a.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_gate_animation_b.bam b/iwdification/dw_iwdspells_resource/bam/wizard_gate_animation_b.bam new file mode 100644 index 0000000..93cd323 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_gate_animation_b.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_gate_animation_c.bam b/iwdification/dw_iwdspells_resource/bam/wizard_gate_animation_c.bam new file mode 100644 index 0000000..39f7912 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_gate_animation_c.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_spider_spawn_animation_a.bam b/iwdification/dw_iwdspells_resource/bam/wizard_spider_spawn_animation_a.bam new file mode 100644 index 0000000..177caa1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_spider_spawn_animation_a.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_spider_spawn_animation_b.bam b/iwdification/dw_iwdspells_resource/bam/wizard_spider_spawn_animation_b.bam new file mode 100644 index 0000000..e34f521 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_spider_spawn_animation_b.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_spider_spawn_animation_c.bam b/iwdification/dw_iwdspells_resource/bam/wizard_spider_spawn_animation_c.bam new file mode 100644 index 0000000..b97e634 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_spider_spawn_animation_c.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_summon_djinni_animation_a.bam b/iwdification/dw_iwdspells_resource/bam/wizard_summon_djinni_animation_a.bam new file mode 100644 index 0000000..1e229e7 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_summon_djinni_animation_a.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_summon_djinni_animation_b.bam b/iwdification/dw_iwdspells_resource/bam/wizard_summon_djinni_animation_b.bam new file mode 100644 index 0000000..4f6f909 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_summon_djinni_animation_b.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_summon_djinni_animation_c.bam b/iwdification/dw_iwdspells_resource/bam/wizard_summon_djinni_animation_c.bam new file mode 100644 index 0000000..0343848 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_summon_djinni_animation_c.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_summon_efreet_animation_a.bam b/iwdification/dw_iwdspells_resource/bam/wizard_summon_efreet_animation_a.bam new file mode 100644 index 0000000..b65b3d7 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_summon_efreet_animation_a.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_summon_efreet_animation_b.bam b/iwdification/dw_iwdspells_resource/bam/wizard_summon_efreet_animation_b.bam new file mode 100644 index 0000000..7efc129 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_summon_efreet_animation_b.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_summon_efreet_animation_c.bam b/iwdification/dw_iwdspells_resource/bam/wizard_summon_efreet_animation_c.bam new file mode 100644 index 0000000..4783651 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_summon_efreet_animation_c.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_summon_fiend_animation_a.bam b/iwdification/dw_iwdspells_resource/bam/wizard_summon_fiend_animation_a.bam new file mode 100644 index 0000000..41c0d14 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_summon_fiend_animation_a.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_summon_fiend_animation_b.bam b/iwdification/dw_iwdspells_resource/bam/wizard_summon_fiend_animation_b.bam new file mode 100644 index 0000000..f63e855 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_summon_fiend_animation_b.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_summon_fiend_animation_c.bam b/iwdification/dw_iwdspells_resource/bam/wizard_summon_fiend_animation_c.bam new file mode 100644 index 0000000..e436afb Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_summon_fiend_animation_c.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_summon_hakeashar_animation_a.bam b/iwdification/dw_iwdspells_resource/bam/wizard_summon_hakeashar_animation_a.bam new file mode 100644 index 0000000..969f2b7 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_summon_hakeashar_animation_a.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_summon_hakeashar_animation_b.bam b/iwdification/dw_iwdspells_resource/bam/wizard_summon_hakeashar_animation_b.bam new file mode 100644 index 0000000..033809b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_summon_hakeashar_animation_b.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_summon_hakeashar_animation_c.bam b/iwdification/dw_iwdspells_resource/bam/wizard_summon_hakeashar_animation_c.bam new file mode 100644 index 0000000..cedb5f7 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_summon_hakeashar_animation_c.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_summon_nishruu_animation_a.bam b/iwdification/dw_iwdspells_resource/bam/wizard_summon_nishruu_animation_a.bam new file mode 100644 index 0000000..95cebd1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_summon_nishruu_animation_a.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_summon_nishruu_animation_b.bam b/iwdification/dw_iwdspells_resource/bam/wizard_summon_nishruu_animation_b.bam new file mode 100644 index 0000000..b993bdb Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_summon_nishruu_animation_b.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_summon_nishruu_animation_c.bam b/iwdification/dw_iwdspells_resource/bam/wizard_summon_nishruu_animation_c.bam new file mode 100644 index 0000000..757bbc2 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_summon_nishruu_animation_c.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_wyvern_call_animation_a.bam b/iwdification/dw_iwdspells_resource/bam/wizard_wyvern_call_animation_a.bam new file mode 100644 index 0000000..a43862b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_wyvern_call_animation_a.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_wyvern_call_animation_b.bam b/iwdification/dw_iwdspells_resource/bam/wizard_wyvern_call_animation_b.bam new file mode 100644 index 0000000..e8833c8 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_wyvern_call_animation_b.bam differ diff --git a/iwdification/dw_iwdspells_resource/bam/wizard_wyvern_call_animation_c.bam b/iwdification/dw_iwdspells_resource/bam/wizard_wyvern_call_animation_c.bam new file mode 100644 index 0000000..a90a340 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bam/wizard_wyvern_call_animation_c.bam differ diff --git a/iwdification/dw_iwdspells_resource/bard_song_ballad/#bard1.spl b/iwdification/dw_iwdspells_resource/bard_song_ballad/#bard1.spl new file mode 100644 index 0000000..7034a49 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bard_song_ballad/#bard1.spl differ diff --git a/iwdification/dw_iwdspells_resource/bard_song_ballad/bard1.bam b/iwdification/dw_iwdspells_resource/bard_song_ballad/bard1.bam new file mode 100644 index 0000000..8138093 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bard_song_ballad/bard1.bam differ diff --git a/iwdification/dw_iwdspells_resource/bard_song_ballad/bard1b.bam b/iwdification/dw_iwdspells_resource/bard_song_ballad/bard1b.bam new file mode 100644 index 0000000..8138093 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bard_song_ballad/bard1b.bam differ diff --git a/iwdification/dw_iwdspells_resource/bard_song_ballad/ohvrpo.pro b/iwdification/dw_iwdspells_resource/bard_song_ballad/ohvrpo.pro new file mode 100644 index 0000000..1b660f7 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bard_song_ballad/ohvrpo.pro differ diff --git a/iwdification/dw_iwdspells_resource/bard_song_ballad/spcl120.spl b/iwdification/dw_iwdspells_resource/bard_song_ballad/spcl120.spl new file mode 100644 index 0000000..dcea9a2 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bard_song_ballad/spcl120.spl differ diff --git a/iwdification/dw_iwdspells_resource/bard_song_curran/#bard2.spl b/iwdification/dw_iwdspells_resource/bard_song_curran/#bard2.spl new file mode 100644 index 0000000..9d2c774 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bard_song_curran/#bard2.spl differ diff --git a/iwdification/dw_iwdspells_resource/bard_song_curran/bard2.bam b/iwdification/dw_iwdspells_resource/bard_song_curran/bard2.bam new file mode 100644 index 0000000..7b22b1b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bard_song_curran/bard2.bam differ diff --git a/iwdification/dw_iwdspells_resource/bard_song_curran/bard2b.bam b/iwdification/dw_iwdspells_resource/bard_song_curran/bard2b.bam new file mode 100644 index 0000000..7b22b1b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bard_song_curran/bard2b.bam differ diff --git a/iwdification/dw_iwdspells_resource/bard_song_curran/ohvrpo.pro b/iwdification/dw_iwdspells_resource/bard_song_curran/ohvrpo.pro new file mode 100644 index 0000000..1b660f7 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bard_song_curran/ohvrpo.pro differ diff --git a/iwdification/dw_iwdspells_resource/bard_song_curran/spcl115.spl b/iwdification/dw_iwdspells_resource/bard_song_curran/spcl115.spl new file mode 100644 index 0000000..196e4a1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bard_song_curran/spcl115.spl differ diff --git a/iwdification/dw_iwdspells_resource/bard_song_kaudies/#bard4.spl b/iwdification/dw_iwdspells_resource/bard_song_kaudies/#bard4.spl new file mode 100644 index 0000000..1d0ed24 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bard_song_kaudies/#bard4.spl differ diff --git a/iwdification/dw_iwdspells_resource/bard_song_kaudies/bard4.bam b/iwdification/dw_iwdspells_resource/bard_song_kaudies/bard4.bam new file mode 100644 index 0000000..d00ded4 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bard_song_kaudies/bard4.bam differ diff --git a/iwdification/dw_iwdspells_resource/bard_song_kaudies/bard4b.bam b/iwdification/dw_iwdspells_resource/bard_song_kaudies/bard4b.bam new file mode 100644 index 0000000..d00ded4 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bard_song_kaudies/bard4b.bam differ diff --git a/iwdification/dw_iwdspells_resource/bard_song_kaudies/ohvrpo.pro b/iwdification/dw_iwdspells_resource/bard_song_kaudies/ohvrpo.pro new file mode 100644 index 0000000..1b660f7 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bard_song_kaudies/ohvrpo.pro differ diff --git a/iwdification/dw_iwdspells_resource/bard_song_kaudies/spcl117.spl b/iwdification/dw_iwdspells_resource/bard_song_kaudies/spcl117.spl new file mode 100644 index 0000000..0bf469a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bard_song_kaudies/spcl117.spl differ diff --git a/iwdification/dw_iwdspells_resource/bard_song_siren/#bard5.spl b/iwdification/dw_iwdspells_resource/bard_song_siren/#bard5.spl new file mode 100644 index 0000000..c7f455c Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bard_song_siren/#bard5.spl differ diff --git a/iwdification/dw_iwdspells_resource/bard_song_siren/#cureent.spl b/iwdification/dw_iwdspells_resource/bard_song_siren/#cureent.spl new file mode 100644 index 0000000..3387eca Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bard_song_siren/#cureent.spl differ diff --git a/iwdification/dw_iwdspells_resource/bard_song_siren/bard5.bam b/iwdification/dw_iwdspells_resource/bard_song_siren/bard5.bam new file mode 100644 index 0000000..b26fccb Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bard_song_siren/bard5.bam differ diff --git a/iwdification/dw_iwdspells_resource/bard_song_siren/bard5b.bam b/iwdification/dw_iwdspells_resource/bard_song_siren/bard5b.bam new file mode 100644 index 0000000..b26fccb Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bard_song_siren/bard5b.bam differ diff --git a/iwdification/dw_iwdspells_resource/bard_song_siren/ohvrnp.pro b/iwdification/dw_iwdspells_resource/bard_song_siren/ohvrnp.pro new file mode 100644 index 0000000..8b1ad4f Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bard_song_siren/ohvrnp.pro differ diff --git a/iwdification/dw_iwdspells_resource/bard_song_siren/spcl118.spl b/iwdification/dw_iwdspells_resource/bard_song_siren/spcl118.spl new file mode 100644 index 0000000..cd0aed4 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bard_song_siren/spcl118.spl differ diff --git a/iwdification/dw_iwdspells_resource/bard_song_siren/spmindat.bam b/iwdification/dw_iwdspells_resource/bard_song_siren/spmindat.bam new file mode 100644 index 0000000..66bccb7 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bard_song_siren/spmindat.bam differ diff --git a/iwdification/dw_iwdspells_resource/bard_song_siren/spmindat.vvc b/iwdification/dw_iwdspells_resource/bard_song_siren/spmindat.vvc new file mode 100644 index 0000000..b251e6b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bard_song_siren/spmindat.vvc differ diff --git a/iwdification/dw_iwdspells_resource/bard_song_sith/#bard6.spl b/iwdification/dw_iwdspells_resource/bard_song_sith/#bard6.spl new file mode 100644 index 0000000..74ceaba Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bard_song_sith/#bard6.spl differ diff --git a/iwdification/dw_iwdspells_resource/bard_song_sith/bard6.bam b/iwdification/dw_iwdspells_resource/bard_song_sith/bard6.bam new file mode 100644 index 0000000..f79e7de Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bard_song_sith/bard6.bam differ diff --git a/iwdification/dw_iwdspells_resource/bard_song_sith/bard6b.bam b/iwdification/dw_iwdspells_resource/bard_song_sith/bard6b.bam new file mode 100644 index 0000000..f79e7de Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bard_song_sith/bard6b.bam differ diff --git a/iwdification/dw_iwdspells_resource/bard_song_sith/ohvrpo.pro b/iwdification/dw_iwdspells_resource/bard_song_sith/ohvrpo.pro new file mode 100644 index 0000000..1b660f7 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bard_song_sith/ohvrpo.pro differ diff --git a/iwdification/dw_iwdspells_resource/bard_song_sith/spcl119.spl b/iwdification/dw_iwdspells_resource/bard_song_sith/spcl119.spl new file mode 100644 index 0000000..bd413c3 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bard_song_sith/spcl119.spl differ diff --git a/iwdification/dw_iwdspells_resource/bard_song_tymora/#bard3.spl b/iwdification/dw_iwdspells_resource/bard_song_tymora/#bard3.spl new file mode 100644 index 0000000..18c002a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bard_song_tymora/#bard3.spl differ diff --git a/iwdification/dw_iwdspells_resource/bard_song_tymora/bard3.bam b/iwdification/dw_iwdspells_resource/bard_song_tymora/bard3.bam new file mode 100644 index 0000000..d2e016c Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bard_song_tymora/bard3.bam differ diff --git a/iwdification/dw_iwdspells_resource/bard_song_tymora/bard3b.bam b/iwdification/dw_iwdspells_resource/bard_song_tymora/bard3b.bam new file mode 100644 index 0000000..d2e016c Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bard_song_tymora/bard3b.bam differ diff --git a/iwdification/dw_iwdspells_resource/bard_song_tymora/ohvrpo.pro b/iwdification/dw_iwdspells_resource/bard_song_tymora/ohvrpo.pro new file mode 100644 index 0000000..1b660f7 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bard_song_tymora/ohvrpo.pro differ diff --git a/iwdification/dw_iwdspells_resource/bard_song_tymora/spcl116.spl b/iwdification/dw_iwdspells_resource/bard_song_tymora/spcl116.spl new file mode 100644 index 0000000..7858be4 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/bard_song_tymora/spcl116.spl differ diff --git a/iwdification/dw_iwdspells_resource/bardic_proj.txt b/iwdification/dw_iwdspells_resource/bardic_proj.txt new file mode 100644 index 0000000..596bd0d --- /dev/null +++ b/iwdification/dw_iwdspells_resource/bardic_proj.txt @@ -0,0 +1,3 @@ + +ohvrpo 455 +ohvrnp 456 diff --git a/iwdification/dw_iwdspells_resource/bardic_resrefs.txt b/iwdification/dw_iwdspells_resource/bardic_resrefs.txt new file mode 100644 index 0000000..18554b9 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/bardic_resrefs.txt @@ -0,0 +1,7 @@ + +BARD_SONG_BALLAD SPCL120 +BARD_SONG_CURRAN SPCL115 +BARD_SONG_TYMORA SPCL116 +BARD_SONG_KAUDIES SPCL117 +BARD_SONG_SIREN SPCL118 +BARD_SONG_SITH SPCL119 diff --git a/iwdification/dw_iwdspells_resource/bardic_smtable.txt b/iwdification/dw_iwdspells_resource/bardic_smtable.txt new file mode 100644 index 0000000..9510d7a --- /dev/null +++ b/iwdification/dw_iwdspells_resource/bardic_smtable.txt @@ -0,0 +1,18 @@ + +17 SShadow +3 MSUMMO4 +6 MSUMMO7 +5 MSUMMO6 +4 MSUMMO5 +0 MSUMMO1 +1 MSUMMO2 +2 MSUMMO3 +20 CEElemW +19 CFElemW +29 CAELEMW +21 CWElemW +26 SMONSTE +27 DSMONST +28 SHADES +47 SSHAMB +10 GINSECT diff --git a/iwdification/dw_iwdspells_resource/beetle/bam/mbbma1.bam b/iwdification/dw_iwdspells_resource/beetle/bam/mbbma1.bam new file mode 100644 index 0000000..0de2c18 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/bam/mbbma1.bam differ diff --git a/iwdification/dw_iwdspells_resource/beetle/bam/mbbma1e.bam b/iwdification/dw_iwdspells_resource/beetle/bam/mbbma1e.bam new file mode 100644 index 0000000..b501911 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/bam/mbbma1e.bam differ diff --git a/iwdification/dw_iwdspells_resource/beetle/bam/mbbma4.bam b/iwdification/dw_iwdspells_resource/beetle/bam/mbbma4.bam new file mode 100644 index 0000000..c3d3588 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/bam/mbbma4.bam differ diff --git a/iwdification/dw_iwdspells_resource/beetle/bam/mbbma4e.bam b/iwdification/dw_iwdspells_resource/beetle/bam/mbbma4e.bam new file mode 100644 index 0000000..45d9fd7 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/bam/mbbma4e.bam differ diff --git a/iwdification/dw_iwdspells_resource/beetle/bam/mbbmca.bam b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmca.bam new file mode 100644 index 0000000..c3d3588 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmca.bam differ diff --git a/iwdification/dw_iwdspells_resource/beetle/bam/mbbmcae.bam b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmcae.bam new file mode 100644 index 0000000..45d9fd7 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmcae.bam differ diff --git a/iwdification/dw_iwdspells_resource/beetle/bam/mbbmde.bam b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmde.bam new file mode 100644 index 0000000..8fcbcaa Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmde.bam differ diff --git a/iwdification/dw_iwdspells_resource/beetle/bam/mbbmdee.bam b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmdee.bam new file mode 100644 index 0000000..98371a8 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmdee.bam differ diff --git a/iwdification/dw_iwdspells_resource/beetle/bam/mbbmgh.bam b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmgh.bam new file mode 100644 index 0000000..e992a52 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmgh.bam differ diff --git a/iwdification/dw_iwdspells_resource/beetle/bam/mbbmghe.bam b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmghe.bam new file mode 100644 index 0000000..831734f Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmghe.bam differ diff --git a/iwdification/dw_iwdspells_resource/beetle/bam/mbbmgu.bam b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmgu.bam new file mode 100644 index 0000000..0dc0f07 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmgu.bam differ diff --git a/iwdification/dw_iwdspells_resource/beetle/bam/mbbmgue.bam b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmgue.bam new file mode 100644 index 0000000..70ac1c7 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmgue.bam differ diff --git a/iwdification/dw_iwdspells_resource/beetle/bam/mbbmsc.bam b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmsc.bam new file mode 100644 index 0000000..97ba1e8 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmsc.bam differ diff --git a/iwdification/dw_iwdspells_resource/beetle/bam/mbbmsce.bam b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmsce.bam new file mode 100644 index 0000000..01bf4ba Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmsce.bam differ diff --git a/iwdification/dw_iwdspells_resource/beetle/bam/mbbmsd.bam b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmsd.bam new file mode 100644 index 0000000..9881611 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmsd.bam differ diff --git a/iwdification/dw_iwdspells_resource/beetle/bam/mbbmsde.bam b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmsde.bam new file mode 100644 index 0000000..e72fb47 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmsde.bam differ diff --git a/iwdification/dw_iwdspells_resource/beetle/bam/mbbmsl.bam b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmsl.bam new file mode 100644 index 0000000..6938a8b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmsl.bam differ diff --git a/iwdification/dw_iwdspells_resource/beetle/bam/mbbmsle.bam b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmsle.bam new file mode 100644 index 0000000..f53ccef Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmsle.bam differ diff --git a/iwdification/dw_iwdspells_resource/beetle/bam/mbbmsp.bam b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmsp.bam new file mode 100644 index 0000000..97ba1e8 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmsp.bam differ diff --git a/iwdification/dw_iwdspells_resource/beetle/bam/mbbmspe.bam b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmspe.bam new file mode 100644 index 0000000..01bf4ba Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmspe.bam differ diff --git a/iwdification/dw_iwdspells_resource/beetle/bam/mbbmtw.bam b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmtw.bam new file mode 100644 index 0000000..f452285 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmtw.bam differ diff --git a/iwdification/dw_iwdspells_resource/beetle/bam/mbbmtwe.bam b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmtwe.bam new file mode 100644 index 0000000..c4fe85b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmtwe.bam differ diff --git a/iwdification/dw_iwdspells_resource/beetle/bam/mbbmwk.bam b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmwk.bam new file mode 100644 index 0000000..fd9e3c1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmwk.bam differ diff --git a/iwdification/dw_iwdspells_resource/beetle/bam/mbbmwke.bam b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmwke.bam new file mode 100644 index 0000000..d14de32 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/bam/mbbmwke.bam differ diff --git a/iwdification/dw_iwdspells_resource/beetle/wav/bomba01.wav b/iwdification/dw_iwdspells_resource/beetle/wav/bomba01.wav new file mode 100644 index 0000000..7d23f1a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/wav/bomba01.wav differ diff --git a/iwdification/dw_iwdspells_resource/beetle/wav/bomba02.wav b/iwdification/dw_iwdspells_resource/beetle/wav/bomba02.wav new file mode 100644 index 0000000..21b8f59 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/wav/bomba02.wav differ diff --git a/iwdification/dw_iwdspells_resource/beetle/wav/bomba03a.wav b/iwdification/dw_iwdspells_resource/beetle/wav/bomba03a.wav new file mode 100644 index 0000000..eb25e53 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/wav/bomba03a.wav differ diff --git a/iwdification/dw_iwdspells_resource/beetle/wav/bomba03b.wav b/iwdification/dw_iwdspells_resource/beetle/wav/bomba03b.wav new file mode 100644 index 0000000..58e6268 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/wav/bomba03b.wav differ diff --git a/iwdification/dw_iwdspells_resource/beetle/wav/bomba03c.wav b/iwdification/dw_iwdspells_resource/beetle/wav/bomba03c.wav new file mode 100644 index 0000000..8467423 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/wav/bomba03c.wav differ diff --git a/iwdification/dw_iwdspells_resource/beetle/wav/bomba07.wav b/iwdification/dw_iwdspells_resource/beetle/wav/bomba07.wav new file mode 100644 index 0000000..a1cd9c5 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/wav/bomba07.wav differ diff --git a/iwdification/dw_iwdspells_resource/beetle/wav/bomba08.wav b/iwdification/dw_iwdspells_resource/beetle/wav/bomba08.wav new file mode 100644 index 0000000..f4f65a8 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/wav/bomba08.wav differ diff --git a/iwdification/dw_iwdspells_resource/beetle/wav/bomba09a.wav b/iwdification/dw_iwdspells_resource/beetle/wav/bomba09a.wav new file mode 100644 index 0000000..85be828 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/wav/bomba09a.wav differ diff --git a/iwdification/dw_iwdspells_resource/beetle/wav/bomba09b.wav b/iwdification/dw_iwdspells_resource/beetle/wav/bomba09b.wav new file mode 100644 index 0000000..b78367e Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/wav/bomba09b.wav differ diff --git a/iwdification/dw_iwdspells_resource/beetle/wav/bomba11.wav b/iwdification/dw_iwdspells_resource/beetle/wav/bomba11.wav new file mode 100644 index 0000000..0ddb706 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/beetle/wav/bomba11.wav differ diff --git a/iwdification/wav/cdiee08.ogg b/iwdification/dw_iwdspells_resource/cleric_alicorn_lance/#eff_e08.wav similarity index 100% rename from iwdification/wav/cdiee08.ogg rename to iwdification/dw_iwdspells_resource/cleric_alicorn_lance/#eff_e08.wav diff --git a/iwdification/wav/cditra57.ogg b/iwdification/dw_iwdspells_resource/cleric_alicorn_lance/#tra_57.wav similarity index 100% rename from iwdification/wav/cditra57.ogg rename to iwdification/dw_iwdspells_resource/cleric_alicorn_lance/#tra_57.wav diff --git a/iwdification/dw_iwdspells_resource/cleric_alicorn_lance/alancet.bam b/iwdification/dw_iwdspells_resource/cleric_alicorn_lance/alancet.bam new file mode 100644 index 0000000..ed5584a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_alicorn_lance/alancet.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_alicorn_lance/idpro298.pro b/iwdification/dw_iwdspells_resource/cleric_alicorn_lance/idpro298.pro new file mode 100644 index 0000000..e8efbc7 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_alicorn_lance/idpro298.pro differ diff --git a/iwdification/dw_iwdspells_resource/cleric_alicorn_lance/sppr218.spl b/iwdification/dw_iwdspells_resource/cleric_alicorn_lance/sppr218.spl new file mode 100644 index 0000000..cbc3f4d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_alicorn_lance/sppr218.spl differ diff --git a/iwdification/bam/cdid218a.bam b/iwdification/dw_iwdspells_resource/cleric_alicorn_lance/sppr218a.bam similarity index 100% rename from iwdification/bam/cdid218a.bam rename to iwdification/dw_iwdspells_resource/cleric_alicorn_lance/sppr218a.bam diff --git a/iwdification/bam/cdid218b.bam b/iwdification/dw_iwdspells_resource/cleric_alicorn_lance/sppr218b.bam similarity index 100% rename from iwdification/bam/cdid218b.bam rename to iwdification/dw_iwdspells_resource/cleric_alicorn_lance/sppr218b.bam diff --git a/iwdification/bam/cdid218c.bam b/iwdification/dw_iwdspells_resource/cleric_alicorn_lance/sppr218c.bam similarity index 100% rename from iwdification/bam/cdid218c.bam rename to iwdification/dw_iwdspells_resource/cleric_alicorn_lance/sppr218c.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_animal_rage/#eff_p04.wav b/iwdification/dw_iwdspells_resource/cleric_animal_rage/#eff_p04.wav new file mode 100644 index 0000000..c8a4fd2 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_animal_rage/#eff_p04.wav differ diff --git a/iwdification/dw_iwdspells_resource/cleric_animal_rage/enchah.bam b/iwdification/dw_iwdspells_resource/cleric_animal_rage/enchah.bam new file mode 100644 index 0000000..e4a62a9 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_animal_rage/enchah.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_animal_rage/enchah.vvc b/iwdification/dw_iwdspells_resource/cleric_animal_rage/enchah.vvc new file mode 100644 index 0000000..611e089 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_animal_rage/enchah.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_animal_rage/sppr522.spl b/iwdification/dw_iwdspells_resource/cleric_animal_rage/sppr522.spl new file mode 100644 index 0000000..1af2af7 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_animal_rage/sppr522.spl differ diff --git a/iwdification/bam/cdid522a.bam b/iwdification/dw_iwdspells_resource/cleric_animal_rage/sppr522a.bam similarity index 100% rename from iwdification/bam/cdid522a.bam rename to iwdification/dw_iwdspells_resource/cleric_animal_rage/sppr522a.bam diff --git a/iwdification/bam/cdid522b.bam b/iwdification/dw_iwdspells_resource/cleric_animal_rage/sppr522b.bam similarity index 100% rename from iwdification/bam/cdid522b.bam rename to iwdification/dw_iwdspells_resource/cleric_animal_rage/sppr522b.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_animal_rage/sppr522b.spl b/iwdification/dw_iwdspells_resource/cleric_animal_rage/sppr522b.spl new file mode 100644 index 0000000..1ce28f4 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_animal_rage/sppr522b.spl differ diff --git a/iwdification/bam/cdid522c.bam b/iwdification/dw_iwdspells_resource/cleric_animal_rage/sppr522c.bam similarity index 100% rename from iwdification/bam/cdid522c.bam rename to iwdification/dw_iwdspells_resource/cleric_animal_rage/sppr522c.bam diff --git a/iwdification/wav/cdiep07.ogg b/iwdification/dw_iwdspells_resource/cleric_beast_claw/#eff_p07.wav similarity index 100% rename from iwdification/wav/cdiep07.ogg rename to iwdification/dw_iwdspells_resource/cleric_beast_claw/#eff_p07.wav diff --git a/iwdification/dw_iwdspells_resource/cleric_beast_claw/alterh.bam b/iwdification/dw_iwdspells_resource/cleric_beast_claw/alterh.bam new file mode 100644 index 0000000..56902ce Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_beast_claw/alterh.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_beast_claw/alterh.vvc b/iwdification/dw_iwdspells_resource/cleric_beast_claw/alterh.vvc new file mode 100644 index 0000000..3af5aa9 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_beast_claw/alterh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_beast_claw/bclaw.itm b/iwdification/dw_iwdspells_resource/cleric_beast_claw/bclaw.itm new file mode 100644 index 0000000..1a2e3ae Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_beast_claw/bclaw.itm differ diff --git a/iwdification/bam/cdibclaw.bam b/iwdification/dw_iwdspells_resource/cleric_beast_claw/ibclaw.bam similarity index 100% rename from iwdification/bam/cdibclaw.bam rename to iwdification/dw_iwdspells_resource/cleric_beast_claw/ibclaw.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_beast_claw/sppr219.spl b/iwdification/dw_iwdspells_resource/cleric_beast_claw/sppr219.spl new file mode 100644 index 0000000..12f613b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_beast_claw/sppr219.spl differ diff --git a/iwdification/bam/cdid219a.bam b/iwdification/dw_iwdspells_resource/cleric_beast_claw/sppr219a.bam similarity index 100% rename from iwdification/bam/cdid219a.bam rename to iwdification/dw_iwdspells_resource/cleric_beast_claw/sppr219a.bam diff --git a/iwdification/bam/cdid219b.bam b/iwdification/dw_iwdspells_resource/cleric_beast_claw/sppr219b.bam similarity index 100% rename from iwdification/bam/cdid219b.bam rename to iwdification/dw_iwdspells_resource/cleric_beast_claw/sppr219b.bam diff --git a/iwdification/bam/cdid219c.bam b/iwdification/dw_iwdspells_resource/cleric_beast_claw/sppr219c.bam similarity index 100% rename from iwdification/bam/cdid219c.bam rename to iwdification/dw_iwdspells_resource/cleric_beast_claw/sppr219c.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_blood_rage/#eff_p07.wav b/iwdification/dw_iwdspells_resource/cleric_blood_rage/#eff_p07.wav new file mode 100644 index 0000000..f0a6bdd Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_blood_rage/#eff_p07.wav differ diff --git a/iwdification/dw_iwdspells_resource/cleric_blood_rage/alterh.bam b/iwdification/dw_iwdspells_resource/cleric_blood_rage/alterh.bam new file mode 100644 index 0000000..56902ce Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_blood_rage/alterh.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_blood_rage/alterh.vvc b/iwdification/dw_iwdspells_resource/cleric_blood_rage/alterh.vvc new file mode 100644 index 0000000..3af5aa9 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_blood_rage/alterh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_blood_rage/sppr422.spl b/iwdification/dw_iwdspells_resource/cleric_blood_rage/sppr422.spl new file mode 100644 index 0000000..f7ca699 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_blood_rage/sppr422.spl differ diff --git a/iwdification/bam/cdid422a.bam b/iwdification/dw_iwdspells_resource/cleric_blood_rage/sppr422a.bam similarity index 100% rename from iwdification/bam/cdid422a.bam rename to iwdification/dw_iwdspells_resource/cleric_blood_rage/sppr422a.bam diff --git a/iwdification/bam/cdid422b.bam b/iwdification/dw_iwdspells_resource/cleric_blood_rage/sppr422b.bam similarity index 100% rename from iwdification/bam/cdid422b.bam rename to iwdification/dw_iwdspells_resource/cleric_blood_rage/sppr422b.bam diff --git a/iwdification/bam/cdid422c.bam b/iwdification/dw_iwdspells_resource/cleric_blood_rage/sppr422c.bam similarity index 100% rename from iwdification/bam/cdid422c.bam rename to iwdification/dw_iwdspells_resource/cleric_blood_rage/sppr422c.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds/#ff_p103.wav b/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds/#ff_p103.wav new file mode 100644 index 0000000..836ce70 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds/#ff_p103.wav differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds/ccdamah.bam b/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds/ccdamah.bam new file mode 100644 index 0000000..d7b0b4d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds/ccdamah.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds/ccdamah.vvc b/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds/ccdamah.vvc new file mode 100644 index 0000000..181ef22 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds/ccdamah.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds/sppr510.spl b/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds/sppr510.spl new file mode 100644 index 0000000..5f5551c Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds/sppr510.spl differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds/sppr510a.bam b/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds/sppr510a.bam new file mode 100644 index 0000000..9987ede Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds/sppr510a.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds/sppr510b.bam b/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds/sppr510b.bam new file mode 100644 index 0000000..6c2455a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds/sppr510b.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds/sppr510c.bam b/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds/sppr510c.bam new file mode 100644 index 0000000..3738f0f Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds/sppr510c.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds_iwd/#ff_p103.wav b/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds_iwd/#ff_p103.wav new file mode 100644 index 0000000..836ce70 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds_iwd/#ff_p103.wav differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds_iwd/ccdamah.bam b/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds_iwd/ccdamah.bam new file mode 100644 index 0000000..d7b0b4d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds_iwd/ccdamah.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds_iwd/ccdamah.vvc b/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds_iwd/ccdamah.vvc new file mode 100644 index 0000000..181ef22 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds_iwd/ccdamah.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds_iwd/sppr510.spl b/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds_iwd/sppr510.spl new file mode 100644 index 0000000..5f5551c Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds_iwd/sppr510.spl differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds_iwd/sppr510a.bam b/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds_iwd/sppr510a.bam new file mode 100644 index 0000000..9987ede Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds_iwd/sppr510a.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds_iwd/sppr510b.bam b/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds_iwd/sppr510b.bam new file mode 100644 index 0000000..6c2455a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds_iwd/sppr510b.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds_iwd/sppr510c.bam b/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds_iwd/sppr510c.bam new file mode 100644 index 0000000..3738f0f Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_critical_wounds_iwd/sppr510c.bam differ diff --git a/iwdification/wav/cdiep108.ogg b/iwdification/dw_iwdspells_resource/cleric_cause_disease/#ff_p108.wav similarity index 100% rename from iwdification/wav/cdiep108.ogg rename to iwdification/dw_iwdspells_resource/cleric_cause_disease/#ff_p108.wav diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_disease/cdiseah.bam b/iwdification/dw_iwdspells_resource/cleric_cause_disease/cdiseah.bam new file mode 100644 index 0000000..978483f Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_disease/cdiseah.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_disease/cdiseah.vvc b/iwdification/dw_iwdspells_resource/cleric_cause_disease/cdiseah.vvc new file mode 100644 index 0000000..ad09f23 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_disease/cdiseah.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_disease/sppr320.spl b/iwdification/dw_iwdspells_resource/cleric_cause_disease/sppr320.spl new file mode 100644 index 0000000..ad8656d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_disease/sppr320.spl differ diff --git a/iwdification/bam/cdid320a.bam b/iwdification/dw_iwdspells_resource/cleric_cause_disease/sppr320a.bam similarity index 100% rename from iwdification/bam/cdid320a.bam rename to iwdification/dw_iwdspells_resource/cleric_cause_disease/sppr320a.bam diff --git a/iwdification/bam/cdid320b.bam b/iwdification/dw_iwdspells_resource/cleric_cause_disease/sppr320b.bam similarity index 100% rename from iwdification/bam/cdid320b.bam rename to iwdification/dw_iwdspells_resource/cleric_cause_disease/sppr320b.bam diff --git a/iwdification/bam/cdid320c.bam b/iwdification/dw_iwdspells_resource/cleric_cause_disease/sppr320c.bam similarity index 100% rename from iwdification/bam/cdid320c.bam rename to iwdification/dw_iwdspells_resource/cleric_cause_disease/sppr320c.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_light_wounds/#ff_p103.wav b/iwdification/dw_iwdspells_resource/cleric_cause_light_wounds/#ff_p103.wav new file mode 100644 index 0000000..836ce70 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_light_wounds/#ff_p103.wav differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_light_wounds/cldamah.bam b/iwdification/dw_iwdspells_resource/cleric_cause_light_wounds/cldamah.bam new file mode 100644 index 0000000..1f64aad Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_light_wounds/cldamah.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_light_wounds/cldamah.vvc b/iwdification/dw_iwdspells_resource/cleric_cause_light_wounds/cldamah.vvc new file mode 100644 index 0000000..f6cac20 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_light_wounds/cldamah.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_light_wounds/sppr114.spl b/iwdification/dw_iwdspells_resource/cleric_cause_light_wounds/sppr114.spl new file mode 100644 index 0000000..0cd9810 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_light_wounds/sppr114.spl differ diff --git a/iwdification/bam/cdid114a.bam b/iwdification/dw_iwdspells_resource/cleric_cause_light_wounds/sppr114a.bam similarity index 100% rename from iwdification/bam/cdid114a.bam rename to iwdification/dw_iwdspells_resource/cleric_cause_light_wounds/sppr114a.bam diff --git a/iwdification/bam/cdid114b.bam b/iwdification/dw_iwdspells_resource/cleric_cause_light_wounds/sppr114b.bam similarity index 100% rename from iwdification/bam/cdid114b.bam rename to iwdification/dw_iwdspells_resource/cleric_cause_light_wounds/sppr114b.bam diff --git a/iwdification/bam/cdid114c.bam b/iwdification/dw_iwdspells_resource/cleric_cause_light_wounds/sppr114c.bam similarity index 100% rename from iwdification/bam/cdid114c.bam rename to iwdification/dw_iwdspells_resource/cleric_cause_light_wounds/sppr114c.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_medium_wounds/#ff_p103.wav b/iwdification/dw_iwdspells_resource/cleric_cause_medium_wounds/#ff_p103.wav new file mode 100644 index 0000000..836ce70 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_medium_wounds/#ff_p103.wav differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_medium_wounds/cidamah.bam b/iwdification/dw_iwdspells_resource/cleric_cause_medium_wounds/cidamah.bam new file mode 100644 index 0000000..a3ad8ba Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_medium_wounds/cidamah.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_medium_wounds/cidamah.vvc b/iwdification/dw_iwdspells_resource/cleric_cause_medium_wounds/cidamah.vvc new file mode 100644 index 0000000..be501fe Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_medium_wounds/cidamah.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_medium_wounds/sppr330.spl b/iwdification/dw_iwdspells_resource/cleric_cause_medium_wounds/sppr330.spl new file mode 100644 index 0000000..5c57026 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_medium_wounds/sppr330.spl differ diff --git a/iwdification/bam/cdid330a.bam b/iwdification/dw_iwdspells_resource/cleric_cause_medium_wounds/sppr330a.bam similarity index 100% rename from iwdification/bam/cdid330a.bam rename to iwdification/dw_iwdspells_resource/cleric_cause_medium_wounds/sppr330a.bam diff --git a/iwdification/bam/cdid330b.bam b/iwdification/dw_iwdspells_resource/cleric_cause_medium_wounds/sppr330b.bam similarity index 100% rename from iwdification/bam/cdid330b.bam rename to iwdification/dw_iwdspells_resource/cleric_cause_medium_wounds/sppr330b.bam diff --git a/iwdification/bam/cdid330c.bam b/iwdification/dw_iwdspells_resource/cleric_cause_medium_wounds/sppr330c.bam similarity index 100% rename from iwdification/bam/cdid330c.bam rename to iwdification/dw_iwdspells_resource/cleric_cause_medium_wounds/sppr330c.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_moderate_wounds/#ff_p103.wav b/iwdification/dw_iwdspells_resource/cleric_cause_moderate_wounds/#ff_p103.wav new file mode 100644 index 0000000..836ce70 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_moderate_wounds/#ff_p103.wav differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_moderate_wounds/cmdamah.bam b/iwdification/dw_iwdspells_resource/cleric_cause_moderate_wounds/cmdamah.bam new file mode 100644 index 0000000..4955a2c Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_moderate_wounds/cmdamah.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_moderate_wounds/cmdamah.vvc b/iwdification/dw_iwdspells_resource/cleric_cause_moderate_wounds/cmdamah.vvc new file mode 100644 index 0000000..37dfd8f Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_moderate_wounds/cmdamah.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_moderate_wounds/sppr220.spl b/iwdification/dw_iwdspells_resource/cleric_cause_moderate_wounds/sppr220.spl new file mode 100644 index 0000000..7a59595 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_moderate_wounds/sppr220.spl differ diff --git a/iwdification/bam/cdid220a.bam b/iwdification/dw_iwdspells_resource/cleric_cause_moderate_wounds/sppr220a.bam similarity index 100% rename from iwdification/bam/cdid220a.bam rename to iwdification/dw_iwdspells_resource/cleric_cause_moderate_wounds/sppr220a.bam diff --git a/iwdification/bam/cdid220b.bam b/iwdification/dw_iwdspells_resource/cleric_cause_moderate_wounds/sppr220b.bam similarity index 100% rename from iwdification/bam/cdid220b.bam rename to iwdification/dw_iwdspells_resource/cleric_cause_moderate_wounds/sppr220b.bam diff --git a/iwdification/bam/cdid220c.bam b/iwdification/dw_iwdspells_resource/cleric_cause_moderate_wounds/sppr220c.bam similarity index 100% rename from iwdification/bam/cdid220c.bam rename to iwdification/dw_iwdspells_resource/cleric_cause_moderate_wounds/sppr220c.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds/#ff_p103.wav b/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds/#ff_p103.wav new file mode 100644 index 0000000..836ce70 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds/#ff_p103.wav differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds/csdamah.bam b/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds/csdamah.bam new file mode 100644 index 0000000..fc00866 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds/csdamah.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds/csdamah.vvc b/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds/csdamah.vvc new file mode 100644 index 0000000..d26c759 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds/csdamah.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds/sppr414.spl b/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds/sppr414.spl new file mode 100644 index 0000000..6030851 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds/sppr414.spl differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds/sppr414a.bam b/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds/sppr414a.bam new file mode 100644 index 0000000..052690a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds/sppr414a.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds/sppr414b.bam b/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds/sppr414b.bam new file mode 100644 index 0000000..3c329ec Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds/sppr414b.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds/sppr414c.bam b/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds/sppr414c.bam new file mode 100644 index 0000000..5f9cad0 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds/sppr414c.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds_iwd/#ff_p103.wav b/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds_iwd/#ff_p103.wav new file mode 100644 index 0000000..836ce70 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds_iwd/#ff_p103.wav differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds_iwd/csdamah.bam b/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds_iwd/csdamah.bam new file mode 100644 index 0000000..fc00866 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds_iwd/csdamah.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds_iwd/csdamah.vvc b/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds_iwd/csdamah.vvc new file mode 100644 index 0000000..d26c759 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds_iwd/csdamah.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds_iwd/sppr414.spl b/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds_iwd/sppr414.spl new file mode 100644 index 0000000..6030851 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds_iwd/sppr414.spl differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds_iwd/sppr414a.bam b/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds_iwd/sppr414a.bam new file mode 100644 index 0000000..052690a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds_iwd/sppr414a.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds_iwd/sppr414b.bam b/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds_iwd/sppr414b.bam new file mode 100644 index 0000000..3c329ec Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds_iwd/sppr414b.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds_iwd/sppr414c.bam b/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds_iwd/sppr414c.bam new file mode 100644 index 0000000..5f9cad0 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cause_serious_wounds_iwd/sppr414c.bam differ diff --git a/iwdification/wav/cdiep31.ogg b/iwdification/dw_iwdspells_resource/cleric_chant/#eff_p31.wav similarity index 100% rename from iwdification/wav/cdiep31.ogg rename to iwdification/dw_iwdspells_resource/cleric_chant/#eff_p31.wav diff --git a/iwdification/dw_iwdspells_resource/cleric_chant/blessh.bam b/iwdification/dw_iwdspells_resource/cleric_chant/blessh.bam new file mode 100644 index 0000000..856f261 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_chant/blessh.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_chant/blessh.vvc b/iwdification/dw_iwdspells_resource/cleric_chant/blessh.vvc new file mode 100644 index 0000000..144cf17 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_chant/blessh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_chant/curseh.bam b/iwdification/dw_iwdspells_resource/cleric_chant/curseh.bam new file mode 100644 index 0000000..20dcdf2 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_chant/curseh.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_chant/curseh.vvc b/iwdification/dw_iwdspells_resource/cleric_chant/curseh.vvc new file mode 100644 index 0000000..39dc243 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_chant/curseh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_chant/ohvrnp.pro b/iwdification/dw_iwdspells_resource/cleric_chant/ohvrnp.pro new file mode 100644 index 0000000..8b1ad4f Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_chant/ohvrnp.pro differ diff --git a/iwdification/dw_iwdspells_resource/cleric_chant/ohvrpo.pro b/iwdification/dw_iwdspells_resource/cleric_chant/ohvrpo.pro new file mode 100644 index 0000000..1b660f7 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_chant/ohvrpo.pro differ diff --git a/iwdification/dw_iwdspells_resource/cleric_chant/sppr203.spl b/iwdification/dw_iwdspells_resource/cleric_chant/sppr203.spl new file mode 100644 index 0000000..508f7b5 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_chant/sppr203.spl differ diff --git a/iwdification/dw_iwdspells_resource/cleric_chant/sppr203a.bam b/iwdification/dw_iwdspells_resource/cleric_chant/sppr203a.bam new file mode 100644 index 0000000..7831c3d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_chant/sppr203a.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_chant/sppr203b.bam b/iwdification/dw_iwdspells_resource/cleric_chant/sppr203b.bam new file mode 100644 index 0000000..7cf69a5 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_chant/sppr203b.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_chant/sppr203c.bam b/iwdification/dw_iwdspells_resource/cleric_chant/sppr203c.bam new file mode 100644 index 0000000..051e1e1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_chant/sppr203c.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_chant/sppr203d.spl b/iwdification/dw_iwdspells_resource/cleric_chant/sppr203d.spl new file mode 100644 index 0000000..3c54550 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_chant/sppr203d.spl differ diff --git a/iwdification/dw_iwdspells_resource/cleric_chant/sppr203e.spl b/iwdification/dw_iwdspells_resource/cleric_chant/sppr203e.spl new file mode 100644 index 0000000..0682d29 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_chant/sppr203e.spl differ diff --git a/iwdification/wav/cdiafp22.ogg b/iwdification/dw_iwdspells_resource/cleric_circle_of_bones/#aft_p22.wav similarity index 100% rename from iwdification/wav/cdiafp22.ogg rename to iwdification/dw_iwdspells_resource/cleric_circle_of_bones/#aft_p22.wav diff --git a/iwdification/wav/cdiarp21.ogg b/iwdification/dw_iwdspells_resource/cleric_circle_of_bones/#are_p21.wav similarity index 100% rename from iwdification/wav/cdiarp21.ogg rename to iwdification/dw_iwdspells_resource/cleric_circle_of_bones/#are_p21.wav diff --git a/iwdification/dw_iwdspells_resource/cleric_circle_of_bones/cobonh1.bam b/iwdification/dw_iwdspells_resource/cleric_circle_of_bones/cobonh1.bam new file mode 100644 index 0000000..9d1dd8a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_circle_of_bones/cobonh1.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_circle_of_bones/cobonh1.vvc b/iwdification/dw_iwdspells_resource/cleric_circle_of_bones/cobonh1.vvc new file mode 100644 index 0000000..5561794 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_circle_of_bones/cobonh1.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_circle_of_bones/cobonh2.bam b/iwdification/dw_iwdspells_resource/cleric_circle_of_bones/cobonh2.bam new file mode 100644 index 0000000..0d5e1fa Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_circle_of_bones/cobonh2.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_circle_of_bones/cobonh2.vvc b/iwdification/dw_iwdspells_resource/cleric_circle_of_bones/cobonh2.vvc new file mode 100644 index 0000000..48e9fa1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_circle_of_bones/cobonh2.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_circle_of_bones/smllarnc.pro b/iwdification/dw_iwdspells_resource/cleric_circle_of_bones/smllarnc.pro new file mode 100644 index 0000000..d032f02 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_circle_of_bones/smllarnc.pro differ diff --git a/iwdification/dw_iwdspells_resource/cleric_circle_of_bones/sppr323.spl b/iwdification/dw_iwdspells_resource/cleric_circle_of_bones/sppr323.spl new file mode 100644 index 0000000..5fd2845 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_circle_of_bones/sppr323.spl differ diff --git a/iwdification/bam/cdid323a.bam b/iwdification/dw_iwdspells_resource/cleric_circle_of_bones/sppr323a.bam similarity index 100% rename from iwdification/bam/cdid323a.bam rename to iwdification/dw_iwdspells_resource/cleric_circle_of_bones/sppr323a.bam diff --git a/iwdification/bam/cdid323b.bam b/iwdification/dw_iwdspells_resource/cleric_circle_of_bones/sppr323b.bam similarity index 100% rename from iwdification/bam/cdid323b.bam rename to iwdification/dw_iwdspells_resource/cleric_circle_of_bones/sppr323b.bam diff --git a/iwdification/bam/cdid323c.bam b/iwdification/dw_iwdspells_resource/cleric_circle_of_bones/sppr323c.bam similarity index 100% rename from iwdification/bam/cdid323c.bam rename to iwdification/dw_iwdspells_resource/cleric_circle_of_bones/sppr323c.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_circle_of_bones/sppr323d.eff b/iwdification/dw_iwdspells_resource/cleric_circle_of_bones/sppr323d.eff new file mode 100644 index 0000000..887ebb7 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_circle_of_bones/sppr323d.eff differ diff --git a/iwdification/dw_iwdspells_resource/cleric_circle_of_bones/sppr323d.spl b/iwdification/dw_iwdspells_resource/cleric_circle_of_bones/sppr323d.spl new file mode 100644 index 0000000..9eafa82 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_circle_of_bones/sppr323d.spl differ diff --git a/iwdification/wav/cdiarp25.ogg b/iwdification/dw_iwdspells_resource/cleric_cloud_of_pestilence/are_p25.wav similarity index 100% rename from iwdification/wav/cdiarp25.ogg rename to iwdification/dw_iwdspells_resource/cleric_cloud_of_pestilence/are_p25.wav diff --git a/iwdification/dw_iwdspells_resource/cleric_cloud_of_pestilence/copesta.bam b/iwdification/dw_iwdspells_resource/cleric_cloud_of_pestilence/copesta.bam new file mode 100644 index 0000000..bd69b49 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cloud_of_pestilence/copesta.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cloud_of_pestilence/idpro309.pro b/iwdification/dw_iwdspells_resource/cleric_cloud_of_pestilence/idpro309.pro new file mode 100644 index 0000000..1935d67 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cloud_of_pestilence/idpro309.pro differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cloud_of_pestilence/sppr423.spl b/iwdification/dw_iwdspells_resource/cleric_cloud_of_pestilence/sppr423.spl new file mode 100644 index 0000000..826cd75 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cloud_of_pestilence/sppr423.spl differ diff --git a/iwdification/bam/cdid423a.bam b/iwdification/dw_iwdspells_resource/cleric_cloud_of_pestilence/sppr423a.bam similarity index 100% rename from iwdification/bam/cdid423a.bam rename to iwdification/dw_iwdspells_resource/cleric_cloud_of_pestilence/sppr423a.bam diff --git a/iwdification/bam/cdid423b.bam b/iwdification/dw_iwdspells_resource/cleric_cloud_of_pestilence/sppr423b.bam similarity index 100% rename from iwdification/bam/cdid423b.bam rename to iwdification/dw_iwdspells_resource/cleric_cloud_of_pestilence/sppr423b.bam diff --git a/iwdification/bam/cdid423c.bam b/iwdification/dw_iwdspells_resource/cleric_cloud_of_pestilence/sppr423c.bam similarity index 100% rename from iwdification/bam/cdid423c.bam rename to iwdification/dw_iwdspells_resource/cleric_cloud_of_pestilence/sppr423c.bam diff --git a/iwdification/wav/cdiarp24.ogg b/iwdification/dw_iwdspells_resource/cleric_cloudburst/are_p24.wav similarity index 100% rename from iwdification/wav/cdiarp24.ogg rename to iwdification/dw_iwdspells_resource/cleric_cloudburst/are_p24.wav diff --git a/iwdification/dw_iwdspells_resource/cleric_cloudburst/cloudba.bam b/iwdification/dw_iwdspells_resource/cleric_cloudburst/cloudba.bam new file mode 100644 index 0000000..a9f3d14 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cloudburst/cloudba.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cloudburst/cloudbh.bam b/iwdification/dw_iwdspells_resource/cleric_cloudburst/cloudbh.bam new file mode 100644 index 0000000..e6e8fc8 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cloudburst/cloudbh.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cloudburst/cloudbh.vvc b/iwdification/dw_iwdspells_resource/cleric_cloudburst/cloudbh.vvc new file mode 100644 index 0000000..382c6bf Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cloudburst/cloudbh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cloudburst/idpro301.pro b/iwdification/dw_iwdspells_resource/cleric_cloudburst/idpro301.pro new file mode 100644 index 0000000..fa696a6 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cloudburst/idpro301.pro differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cloudburst/sppr325.spl b/iwdification/dw_iwdspells_resource/cleric_cloudburst/sppr325.spl new file mode 100644 index 0000000..806959f Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cloudburst/sppr325.spl differ diff --git a/iwdification/bam/cdid325a.bam b/iwdification/dw_iwdspells_resource/cleric_cloudburst/sppr325a.bam similarity index 100% rename from iwdification/bam/cdid325a.bam rename to iwdification/dw_iwdspells_resource/cleric_cloudburst/sppr325a.bam diff --git a/iwdification/bam/cdid325b.bam b/iwdification/dw_iwdspells_resource/cleric_cloudburst/sppr325b.bam similarity index 100% rename from iwdification/bam/cdid325b.bam rename to iwdification/dw_iwdspells_resource/cleric_cloudburst/sppr325b.bam diff --git a/iwdification/bam/cdid325c.bam b/iwdification/dw_iwdspells_resource/cleric_cloudburst/sppr325c.bam similarity index 100% rename from iwdification/bam/cdid325c.bam rename to iwdification/dw_iwdspells_resource/cleric_cloudburst/sppr325c.bam diff --git a/iwdification/wav/cdiep26.ogg b/iwdification/dw_iwdspells_resource/cleric_cure_moderate_wounds/#eff_p26.wav similarity index 100% rename from iwdification/wav/cdiep26.ogg rename to iwdification/dw_iwdspells_resource/cleric_cure_moderate_wounds/#eff_p26.wav diff --git a/iwdification/dw_iwdspells_resource/cleric_cure_moderate_wounds/cmwounh.bam b/iwdification/dw_iwdspells_resource/cleric_cure_moderate_wounds/cmwounh.bam new file mode 100644 index 0000000..ed6315a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cure_moderate_wounds/cmwounh.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cure_moderate_wounds/cmwounh.vvc b/iwdification/dw_iwdspells_resource/cleric_cure_moderate_wounds/cmwounh.vvc new file mode 100644 index 0000000..b3699f9 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cure_moderate_wounds/cmwounh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_cure_moderate_wounds/sppr217.spl b/iwdification/dw_iwdspells_resource/cleric_cure_moderate_wounds/sppr217.spl new file mode 100644 index 0000000..4710e9b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_cure_moderate_wounds/sppr217.spl differ diff --git a/iwdification/bam/cdid217a.bam b/iwdification/dw_iwdspells_resource/cleric_cure_moderate_wounds/sppr217a.bam similarity index 100% rename from iwdification/bam/cdid217a.bam rename to iwdification/dw_iwdspells_resource/cleric_cure_moderate_wounds/sppr217a.bam diff --git a/iwdification/bam/cdid217b.bam b/iwdification/dw_iwdspells_resource/cleric_cure_moderate_wounds/sppr217b.bam similarity index 100% rename from iwdification/bam/cdid217b.bam rename to iwdification/dw_iwdspells_resource/cleric_cure_moderate_wounds/sppr217b.bam diff --git a/iwdification/bam/cdid217c.bam b/iwdification/dw_iwdspells_resource/cleric_cure_moderate_wounds/sppr217c.bam similarity index 100% rename from iwdification/bam/cdid217c.bam rename to iwdification/dw_iwdspells_resource/cleric_cure_moderate_wounds/sppr217c.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_curse/#bless.vvc b/iwdification/dw_iwdspells_resource/cleric_curse/#bless.vvc new file mode 100644 index 0000000..a029906 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_curse/#bless.vvc differ diff --git a/iwdification/wav/cdiee04.ogg b/iwdification/dw_iwdspells_resource/cleric_curse/#eff_e04.wav similarity index 100% rename from iwdification/wav/cdiee04.ogg rename to iwdification/dw_iwdspells_resource/cleric_curse/#eff_e04.wav diff --git a/iwdification/wav/cdiep32.ogg b/iwdification/dw_iwdspells_resource/cleric_curse/#eff_p32.wav similarity index 100% rename from iwdification/wav/cdiep32.ogg rename to iwdification/dw_iwdspells_resource/cleric_curse/#eff_p32.wav diff --git a/iwdification/wav/cdiep99.ogg b/iwdification/dw_iwdspells_resource/cleric_curse/#eff_p99.wav similarity index 100% rename from iwdification/wav/cdiep99.ogg rename to iwdification/dw_iwdspells_resource/cleric_curse/#eff_p99.wav diff --git a/iwdification/dw_iwdspells_resource/cleric_curse/area1x.bam b/iwdification/dw_iwdspells_resource/cleric_curse/area1x.bam new file mode 100644 index 0000000..db4e045 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_curse/area1x.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_curse/curseh.bam b/iwdification/dw_iwdspells_resource/cleric_curse/curseh.bam new file mode 100644 index 0000000..20dcdf2 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_curse/curseh.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_curse/curseh.vvc b/iwdification/dw_iwdspells_resource/cleric_curse/curseh.vvc new file mode 100644 index 0000000..39dc243 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_curse/curseh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_curse/idpro237.pro b/iwdification/dw_iwdspells_resource/cleric_curse/idpro237.pro new file mode 100644 index 0000000..7031504 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_curse/idpro237.pro differ diff --git a/iwdification/dw_iwdspells_resource/cleric_curse/sppr112.spl b/iwdification/dw_iwdspells_resource/cleric_curse/sppr112.spl new file mode 100644 index 0000000..0c20f9b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_curse/sppr112.spl differ diff --git a/iwdification/bam/cdid112a.bam b/iwdification/dw_iwdspells_resource/cleric_curse/sppr112a.bam similarity index 100% rename from iwdification/bam/cdid112a.bam rename to iwdification/dw_iwdspells_resource/cleric_curse/sppr112a.bam diff --git a/iwdification/bam/cdid112b.bam b/iwdification/dw_iwdspells_resource/cleric_curse/sppr112b.bam similarity index 100% rename from iwdification/bam/cdid112b.bam rename to iwdification/dw_iwdspells_resource/cleric_curse/sppr112b.bam diff --git a/iwdification/bam/cdid112c.bam b/iwdification/dw_iwdspells_resource/cleric_curse/sppr112c.bam similarity index 100% rename from iwdification/bam/cdid112c.bam rename to iwdification/dw_iwdspells_resource/cleric_curse/sppr112c.bam diff --git a/iwdification/wav/cdiep113.ogg b/iwdification/dw_iwdspells_resource/cleric_destruction/#ff_p113.wav similarity index 100% rename from iwdification/wav/cdiep113.ogg rename to iwdification/dw_iwdspells_resource/cleric_destruction/#ff_p113.wav diff --git a/iwdification/dw_iwdspells_resource/cleric_destruction/destruh.bam b/iwdification/dw_iwdspells_resource/cleric_destruction/destruh.bam new file mode 100644 index 0000000..9823942 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_destruction/destruh.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_destruction/destruh.vvc b/iwdification/dw_iwdspells_resource/cleric_destruction/destruh.vvc new file mode 100644 index 0000000..131fe62 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_destruction/destruh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_destruction/sppr734.spl b/iwdification/dw_iwdspells_resource/cleric_destruction/sppr734.spl new file mode 100644 index 0000000..ff6a22f Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_destruction/sppr734.spl differ diff --git a/iwdification/bam/cdid734a.bam b/iwdification/dw_iwdspells_resource/cleric_destruction/sppr734a.bam similarity index 100% rename from iwdification/bam/cdid734a.bam rename to iwdification/dw_iwdspells_resource/cleric_destruction/sppr734a.bam diff --git a/iwdification/bam/cdid734b.bam b/iwdification/dw_iwdspells_resource/cleric_destruction/sppr734b.bam similarity index 100% rename from iwdification/bam/cdid734b.bam rename to iwdification/dw_iwdspells_resource/cleric_destruction/sppr734b.bam diff --git a/iwdification/bam/cdid734c.bam b/iwdification/dw_iwdspells_resource/cleric_destruction/sppr734c.bam similarity index 100% rename from iwdification/bam/cdid734c.bam rename to iwdification/dw_iwdspells_resource/cleric_destruction/sppr734c.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_energy_drain/#eff_p06.wav b/iwdification/dw_iwdspells_resource/cleric_energy_drain/#eff_p06.wav new file mode 100644 index 0000000..4b50c9d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_energy_drain/#eff_p06.wav differ diff --git a/iwdification/dw_iwdspells_resource/cleric_energy_drain/necroh.bam b/iwdification/dw_iwdspells_resource/cleric_energy_drain/necroh.bam new file mode 100644 index 0000000..1712f6d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_energy_drain/necroh.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_energy_drain/necroh.vvc b/iwdification/dw_iwdspells_resource/cleric_energy_drain/necroh.vvc new file mode 100644 index 0000000..26e9f2a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_energy_drain/necroh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_energy_drain/sppr739.spl b/iwdification/dw_iwdspells_resource/cleric_energy_drain/sppr739.spl new file mode 100644 index 0000000..96358ed Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_energy_drain/sppr739.spl differ diff --git a/iwdification/dw_iwdspells_resource/cleric_entropy_shield/#entropy.vvc b/iwdification/dw_iwdspells_resource/cleric_entropy_shield/#entropy.vvc new file mode 100644 index 0000000..e6c64bd Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_entropy_shield/#entropy.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_entropy_shield/abjurh.vvc b/iwdification/dw_iwdspells_resource/cleric_entropy_shield/abjurh.vvc new file mode 100644 index 0000000..a570456 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_entropy_shield/abjurh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_entropy_shield/eshielc.bam b/iwdification/dw_iwdspells_resource/cleric_entropy_shield/eshielc.bam new file mode 100644 index 0000000..a012da4 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_entropy_shield/eshielc.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_entropy_shield/sppr615.spl b/iwdification/dw_iwdspells_resource/cleric_entropy_shield/sppr615.spl new file mode 100644 index 0000000..7764210 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_entropy_shield/sppr615.spl differ diff --git a/iwdification/bam/cdid615a.bam b/iwdification/dw_iwdspells_resource/cleric_entropy_shield/sppr615a.bam similarity index 100% rename from iwdification/bam/cdid615a.bam rename to iwdification/dw_iwdspells_resource/cleric_entropy_shield/sppr615a.bam diff --git a/iwdification/bam/cdid615b.bam b/iwdification/dw_iwdspells_resource/cleric_entropy_shield/sppr615b.bam similarity index 100% rename from iwdification/bam/cdid615b.bam rename to iwdification/dw_iwdspells_resource/cleric_entropy_shield/sppr615b.bam diff --git a/iwdification/bam/cdid615c.bam b/iwdification/dw_iwdspells_resource/cleric_entropy_shield/sppr615c.bam similarity index 100% rename from iwdification/bam/cdid615c.bam rename to iwdification/dw_iwdspells_resource/cleric_entropy_shield/sppr615c.bam diff --git a/iwdification/wav/cdiep106.ogg b/iwdification/dw_iwdspells_resource/cleric_exaltation/#ff_p106.wav similarity index 100% rename from iwdification/wav/cdiep106.ogg rename to iwdification/dw_iwdspells_resource/cleric_exaltation/#ff_p106.wav diff --git a/iwdification/dw_iwdspells_resource/cleric_exaltation/exaltah.bam b/iwdification/dw_iwdspells_resource/cleric_exaltation/exaltah.bam new file mode 100644 index 0000000..b57137c Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_exaltation/exaltah.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_exaltation/exaltah.vvc b/iwdification/dw_iwdspells_resource/cleric_exaltation/exaltah.vvc new file mode 100644 index 0000000..5055b68 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_exaltation/exaltah.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_exaltation/sppr321.spl b/iwdification/dw_iwdspells_resource/cleric_exaltation/sppr321.spl new file mode 100644 index 0000000..f4ffbc0 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_exaltation/sppr321.spl differ diff --git a/iwdification/bam/cdid321a.bam b/iwdification/dw_iwdspells_resource/cleric_exaltation/sppr321a.bam similarity index 100% rename from iwdification/bam/cdid321a.bam rename to iwdification/dw_iwdspells_resource/cleric_exaltation/sppr321a.bam diff --git a/iwdification/bam/cdid321b.bam b/iwdification/dw_iwdspells_resource/cleric_exaltation/sppr321b.bam similarity index 100% rename from iwdification/bam/cdid321b.bam rename to iwdification/dw_iwdspells_resource/cleric_exaltation/sppr321b.bam diff --git a/iwdification/bam/cdid321c.bam b/iwdification/dw_iwdspells_resource/cleric_exaltation/sppr321c.bam similarity index 100% rename from iwdification/bam/cdid321c.bam rename to iwdification/dw_iwdspells_resource/cleric_exaltation/sppr321c.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/#eff_p34.wav b/iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/#eff_p34.wav new file mode 100644 index 0000000..fb28680 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/#eff_p34.wav differ diff --git a/iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/#tra_02.wav b/iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/#tra_02.wav new file mode 100644 index 0000000..2d7a3b9 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/#tra_02.wav differ diff --git a/iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/cidamah.bam b/iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/cidamah.bam new file mode 100644 index 0000000..a3ad8ba Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/cidamah.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/cidamah.vvc b/iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/cidamah.vvc new file mode 100644 index 0000000..be501fe Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/cidamah.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/ciwounh.bam b/iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/ciwounh.bam new file mode 100644 index 0000000..a11cfb9 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/ciwounh.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/ciwounh.vvc b/iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/ciwounh.vvc new file mode 100644 index 0000000..f30a95f Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/ciwounh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/idpro230.pro b/iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/idpro230.pro new file mode 100644 index 0000000..cfe9d55 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/idpro230.pro differ diff --git a/iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/necrot.bam b/iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/necrot.bam new file mode 100644 index 0000000..5ae1b27 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/necrot.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/sppr331.spl b/iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/sppr331.spl new file mode 100644 index 0000000..de8655d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/sppr331.spl differ diff --git a/iwdification/bam/cdid331a.bam b/iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/sppr331a.bam similarity index 100% rename from iwdification/bam/cdid331a.bam rename to iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/sppr331a.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/sppr331a.spl b/iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/sppr331a.spl new file mode 100644 index 0000000..c301fb3 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/sppr331a.spl differ diff --git a/iwdification/bam/cdid331b.bam b/iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/sppr331b.bam similarity index 100% rename from iwdification/bam/cdid331b.bam rename to iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/sppr331b.bam diff --git a/iwdification/bam/cdid331c.bam b/iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/sppr331c.bam similarity index 100% rename from iwdification/bam/cdid331c.bam rename to iwdification/dw_iwdspells_resource/cleric_favor_of_ilmater/sppr331c.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_giant_insect/#eff_m13.wav b/iwdification/dw_iwdspells_resource/cleric_giant_insect/#eff_m13.wav new file mode 100644 index 0000000..3e1b1c3 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_giant_insect/#eff_m13.wav differ diff --git a/iwdification/dw_iwdspells_resource/cleric_giant_insect/#isc_01c.wav b/iwdification/dw_iwdspells_resource/cleric_giant_insect/#isc_01c.wav new file mode 100644 index 0000000..c6d87c1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_giant_insect/#isc_01c.wav differ diff --git a/iwdification/dw_iwdspells_resource/cleric_giant_insect/#s1-12.itm b/iwdification/dw_iwdspells_resource/cleric_giant_insect/#s1-12.itm new file mode 100644 index 0000000..d4db322 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_giant_insect/#s1-12.itm differ diff --git a/iwdification/dw_iwdspells_resource/cleric_giant_insect/asumm1x.bam b/iwdification/dw_iwdspells_resource/cleric_giant_insect/asumm1x.bam new file mode 100644 index 0000000..0fd4142 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_giant_insect/asumm1x.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_giant_insect/asumm1x.vvc b/iwdification/dw_iwdspells_resource/cleric_giant_insect/asumm1x.vvc new file mode 100644 index 0000000..ea64bf0 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_giant_insect/asumm1x.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_giant_insect/bbcloud.baf b/iwdification/dw_iwdspells_resource/cleric_giant_insect/bbcloud.baf new file mode 100644 index 0000000..541a9a7 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/cleric_giant_insect/bbcloud.baf @@ -0,0 +1,21 @@ +IF + !Global("BBCLOUD_inactive","LOCALS",1) + Global("Internal4","LOCALS",2) +THEN + RESPONSE #100 + SetGlobal("BBCLOUD_inactive","LOCALS",1) +END + +IF + !Global("BBCLOUD_inactive","LOCALS",1) + !GlobalTimerNotExpired("#localtimer","LOCALS") + See(NearestEnemyOf(Myself)) + Range(NearestEnemyOf(Myself),5) +THEN + RESPONSE #100 + IncrementGlobal("Internal4","LOCALS",1) + SetGlobalTimer("#localtimer","LOCALS",21) + ReallyForceSpell(Myself,INNATE_BOMBARDIER_BEETLE_CLOUD) + Wait(2) +END + diff --git a/iwdification/dw_iwdspells_resource/cleric_giant_insect/fartrng.itm b/iwdification/dw_iwdspells_resource/cleric_giant_insect/fartrng.itm new file mode 100644 index 0000000..1b6e702 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_giant_insect/fartrng.itm differ diff --git a/iwdification/dw_iwdspells_resource/cleric_giant_insect/ginsect.2da b/iwdification/dw_iwdspells_resource/cleric_giant_insect/ginsect.2da new file mode 100644 index 0000000..66c9174 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/cleric_giant_insect/ginsect.2da @@ -0,0 +1,5 @@ +2DA V1.0 +0 + RESREF HitAnimation AreaHitAnimation +1 GISbomb MSumm1H ASumm1X +2 GISborb MSumm1H ASumm1X diff --git a/iwdification/dw_iwdspells_resource/cleric_giant_insect/gisbomb.cre b/iwdification/dw_iwdspells_resource/cleric_giant_insect/gisbomb.cre new file mode 100644 index 0000000..302f8c3 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_giant_insect/gisbomb.cre differ diff --git a/iwdification/dw_iwdspells_resource/cleric_giant_insect/gisborb.cre b/iwdification/dw_iwdspells_resource/cleric_giant_insect/gisborb.cre new file mode 100644 index 0000000..cc527dd Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_giant_insect/gisborb.cre differ diff --git a/iwdification/dw_iwdspells_resource/cleric_giant_insect/gnsummm.baf b/iwdification/dw_iwdspells_resource/cleric_giant_insect/gnsummm.baf new file mode 100644 index 0000000..6723232 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/cleric_giant_insect/gnsummm.baf @@ -0,0 +1,14 @@ +IF + See(NearestEnemyOf(Myself)) +THEN + RESPONSE #100 + AttackReevaluate(LastSeenBy(Myself),75) +END + +IF + AttackedBy(NearestEnemyOf(Myself),DEFAULT) +THEN + RESPONSE #100 + MoveToObject(LastAttackerOf(Myself)) +END + diff --git a/iwdification/bam/cdimsm1h.bam b/iwdification/dw_iwdspells_resource/cleric_giant_insect/msumm1h.bam similarity index 100% rename from iwdification/bam/cdimsm1h.bam rename to iwdification/dw_iwdspells_resource/cleric_giant_insect/msumm1h.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_giant_insect/msumm1h.vvc b/iwdification/dw_iwdspells_resource/cleric_giant_insect/msumm1h.vvc new file mode 100644 index 0000000..8aabcd1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_giant_insect/msumm1h.vvc differ diff --git a/iwdification/bam/cdiplypb.bam b/iwdification/dw_iwdspells_resource/cleric_giant_insect/ppaw.bam similarity index 100% rename from iwdification/bam/cdiplypb.bam rename to iwdification/dw_iwdspells_resource/cleric_giant_insect/ppaw.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_giant_insect/sppr418.spl b/iwdification/dw_iwdspells_resource/cleric_giant_insect/sppr418.spl new file mode 100644 index 0000000..e294b0b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_giant_insect/sppr418.spl differ diff --git a/iwdification/bam/cdid418a.bam b/iwdification/dw_iwdspells_resource/cleric_giant_insect/sppr418a.bam similarity index 100% rename from iwdification/bam/cdid418a.bam rename to iwdification/dw_iwdspells_resource/cleric_giant_insect/sppr418a.bam diff --git a/iwdification/bam/cdid418b.bam b/iwdification/dw_iwdspells_resource/cleric_giant_insect/sppr418b.bam similarity index 100% rename from iwdification/bam/cdid418b.bam rename to iwdification/dw_iwdspells_resource/cleric_giant_insect/sppr418b.bam diff --git a/iwdification/bam/cdid418c.bam b/iwdification/dw_iwdspells_resource/cleric_giant_insect/sppr418c.bam similarity index 100% rename from iwdification/bam/cdid418c.bam rename to iwdification/dw_iwdspells_resource/cleric_giant_insect/sppr418c.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_greater_shield_of_lathander/#latshg1.vvc b/iwdification/dw_iwdspells_resource/cleric_greater_shield_of_lathander/#latshg1.vvc new file mode 100644 index 0000000..068a748 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_greater_shield_of_lathander/#latshg1.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_greater_shield_of_lathander/#latshg2.vvc b/iwdification/dw_iwdspells_resource/cleric_greater_shield_of_lathander/#latshg2.vvc new file mode 100644 index 0000000..2e2b9be Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_greater_shield_of_lathander/#latshg2.vvc differ diff --git a/iwdification/bam/cdigsol1.bam b/iwdification/dw_iwdspells_resource/cleric_greater_shield_of_lathander/gsolac1.bam similarity index 100% rename from iwdification/bam/cdigsol1.bam rename to iwdification/dw_iwdspells_resource/cleric_greater_shield_of_lathander/gsolac1.bam diff --git a/iwdification/bam/cdigsol2.bam b/iwdification/dw_iwdspells_resource/cleric_greater_shield_of_lathander/gsolac2.bam similarity index 100% rename from iwdification/bam/cdigsol2.bam rename to iwdification/dw_iwdspells_resource/cleric_greater_shield_of_lathander/gsolac2.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_greater_shield_of_lathander/sppr735.spl b/iwdification/dw_iwdspells_resource/cleric_greater_shield_of_lathander/sppr735.spl new file mode 100644 index 0000000..16133bb Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_greater_shield_of_lathander/sppr735.spl differ diff --git a/iwdification/bam/cdid735a.bam b/iwdification/dw_iwdspells_resource/cleric_greater_shield_of_lathander/sppr735a.bam similarity index 100% rename from iwdification/bam/cdid735a.bam rename to iwdification/dw_iwdspells_resource/cleric_greater_shield_of_lathander/sppr735a.bam diff --git a/iwdification/bam/cdid735b.bam b/iwdification/dw_iwdspells_resource/cleric_greater_shield_of_lathander/sppr735b.bam similarity index 100% rename from iwdification/bam/cdid735b.bam rename to iwdification/dw_iwdspells_resource/cleric_greater_shield_of_lathander/sppr735b.bam diff --git a/iwdification/bam/cdid735c.bam b/iwdification/dw_iwdspells_resource/cleric_greater_shield_of_lathander/sppr735c.bam similarity index 100% rename from iwdification/bam/cdid735c.bam rename to iwdification/dw_iwdspells_resource/cleric_greater_shield_of_lathander/sppr735c.bam diff --git a/iwdification/wav/cdiee03.ogg b/iwdification/dw_iwdspells_resource/cleric_impervious_sanctity_of_mind/#eff_e03.wav similarity index 100% rename from iwdification/wav/cdiee03.ogg rename to iwdification/dw_iwdspells_resource/cleric_impervious_sanctity_of_mind/#eff_e03.wav diff --git a/iwdification/wav/cdiep01.ogg b/iwdification/dw_iwdspells_resource/cleric_impervious_sanctity_of_mind/#eff_p01.wav similarity index 100% rename from iwdification/wav/cdiep01.ogg rename to iwdification/dw_iwdspells_resource/cleric_impervious_sanctity_of_mind/#eff_p01.wav diff --git a/iwdification/dw_iwdspells_resource/cleric_impervious_sanctity_of_mind/abjurh.vvc b/iwdification/dw_iwdspells_resource/cleric_impervious_sanctity_of_mind/abjurh.vvc new file mode 100644 index 0000000..a570456 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_impervious_sanctity_of_mind/abjurh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_impervious_sanctity_of_mind/sppr733.spl b/iwdification/dw_iwdspells_resource/cleric_impervious_sanctity_of_mind/sppr733.spl new file mode 100644 index 0000000..a3a670d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_impervious_sanctity_of_mind/sppr733.spl differ diff --git a/iwdification/bam/cdid733a.bam b/iwdification/dw_iwdspells_resource/cleric_impervious_sanctity_of_mind/sppr733a.bam similarity index 100% rename from iwdification/bam/cdid733a.bam rename to iwdification/dw_iwdspells_resource/cleric_impervious_sanctity_of_mind/sppr733a.bam diff --git a/iwdification/bam/cdid733b.bam b/iwdification/dw_iwdspells_resource/cleric_impervious_sanctity_of_mind/sppr733b.bam similarity index 100% rename from iwdification/bam/cdid733b.bam rename to iwdification/dw_iwdspells_resource/cleric_impervious_sanctity_of_mind/sppr733b.bam diff --git a/iwdification/bam/cdid733c.bam b/iwdification/dw_iwdspells_resource/cleric_impervious_sanctity_of_mind/sppr733c.bam similarity index 100% rename from iwdification/bam/cdid733c.bam rename to iwdification/dw_iwdspells_resource/cleric_impervious_sanctity_of_mind/sppr733c.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_mass_cause_light_wounds/#eff_m99.wav b/iwdification/dw_iwdspells_resource/cleric_mass_cause_light_wounds/#eff_m99.wav new file mode 100644 index 0000000..cd7af8c Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_mass_cause_light_wounds/#eff_m99.wav differ diff --git a/iwdification/dw_iwdspells_resource/cleric_mass_cause_light_wounds/#ff_p103.wav b/iwdification/dw_iwdspells_resource/cleric_mass_cause_light_wounds/#ff_p103.wav new file mode 100644 index 0000000..836ce70 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_mass_cause_light_wounds/#ff_p103.wav differ diff --git a/iwdification/dw_iwdspells_resource/cleric_mass_cause_light_wounds/#grnring.vvc b/iwdification/dw_iwdspells_resource/cleric_mass_cause_light_wounds/#grnring.vvc new file mode 100644 index 0000000..a42f838 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_mass_cause_light_wounds/#grnring.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_mass_cause_light_wounds/area4x.bam b/iwdification/dw_iwdspells_resource/cleric_mass_cause_light_wounds/area4x.bam new file mode 100644 index 0000000..72ff1e1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_mass_cause_light_wounds/area4x.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_mass_cause_light_wounds/cldamah.bam b/iwdification/dw_iwdspells_resource/cleric_mass_cause_light_wounds/cldamah.bam new file mode 100644 index 0000000..1f64aad Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_mass_cause_light_wounds/cldamah.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_mass_cause_light_wounds/cldamah.vvc b/iwdification/dw_iwdspells_resource/cleric_mass_cause_light_wounds/cldamah.vvc new file mode 100644 index 0000000..f6cac20 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_mass_cause_light_wounds/cldamah.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_mass_cause_light_wounds/idpro241.pro b/iwdification/dw_iwdspells_resource/cleric_mass_cause_light_wounds/idpro241.pro new file mode 100644 index 0000000..dae513f Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_mass_cause_light_wounds/idpro241.pro differ diff --git a/iwdification/dw_iwdspells_resource/cleric_mass_cause_light_wounds/sppr523.spl b/iwdification/dw_iwdspells_resource/cleric_mass_cause_light_wounds/sppr523.spl new file mode 100644 index 0000000..fee10b9 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_mass_cause_light_wounds/sppr523.spl differ diff --git a/iwdification/bam/cdid523a.bam b/iwdification/dw_iwdspells_resource/cleric_mass_cause_light_wounds/sppr523a.bam similarity index 100% rename from iwdification/bam/cdid523a.bam rename to iwdification/dw_iwdspells_resource/cleric_mass_cause_light_wounds/sppr523a.bam diff --git a/iwdification/bam/cdid523b.bam b/iwdification/dw_iwdspells_resource/cleric_mass_cause_light_wounds/sppr523b.bam similarity index 100% rename from iwdification/bam/cdid523b.bam rename to iwdification/dw_iwdspells_resource/cleric_mass_cause_light_wounds/sppr523b.bam diff --git a/iwdification/bam/cdid523c.bam b/iwdification/dw_iwdspells_resource/cleric_mass_cause_light_wounds/sppr523c.bam similarity index 100% rename from iwdification/bam/cdid523c.bam rename to iwdification/dw_iwdspells_resource/cleric_mass_cause_light_wounds/sppr523c.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_mist_of_eldath/idpro307.pro b/iwdification/dw_iwdspells_resource/cleric_mist_of_eldath/idpro307.pro new file mode 100644 index 0000000..48119d1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_mist_of_eldath/idpro307.pro differ diff --git a/iwdification/bam/cdimoeld.bam b/iwdification/dw_iwdspells_resource/cleric_mist_of_eldath/moeldaa.bam similarity index 100% rename from iwdification/bam/cdimoeld.bam rename to iwdification/dw_iwdspells_resource/cleric_mist_of_eldath/moeldaa.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_mist_of_eldath/sppr736.spl b/iwdification/dw_iwdspells_resource/cleric_mist_of_eldath/sppr736.spl new file mode 100644 index 0000000..2d1e76c Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_mist_of_eldath/sppr736.spl differ diff --git a/iwdification/bam/cdid736a.bam b/iwdification/dw_iwdspells_resource/cleric_mist_of_eldath/sppr736a.bam similarity index 100% rename from iwdification/bam/cdid736a.bam rename to iwdification/dw_iwdspells_resource/cleric_mist_of_eldath/sppr736a.bam diff --git a/iwdification/bam/cdid736b.bam b/iwdification/dw_iwdspells_resource/cleric_mist_of_eldath/sppr736b.bam similarity index 100% rename from iwdification/bam/cdid736b.bam rename to iwdification/dw_iwdspells_resource/cleric_mist_of_eldath/sppr736b.bam diff --git a/iwdification/bam/cdid736c.bam b/iwdification/dw_iwdspells_resource/cleric_mist_of_eldath/sppr736c.bam similarity index 100% rename from iwdification/bam/cdid736c.bam rename to iwdification/dw_iwdspells_resource/cleric_mist_of_eldath/sppr736c.bam diff --git a/iwdification/wav/cdiep107.ogg b/iwdification/dw_iwdspells_resource/cleric_mold_touch/#ff_p107.wav similarity index 100% rename from iwdification/wav/cdiep107.ogg rename to iwdification/dw_iwdspells_resource/cleric_mold_touch/#ff_p107.wav diff --git a/iwdification/dw_iwdspells_resource/cleric_mold_touch/idmold.pro b/iwdification/dw_iwdspells_resource/cleric_mold_touch/idmold.pro new file mode 100644 index 0000000..b7e4c42 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_mold_touch/idmold.pro differ diff --git a/iwdification/dw_iwdspells_resource/cleric_mold_touch/mtouchh.bam b/iwdification/dw_iwdspells_resource/cleric_mold_touch/mtouchh.bam new file mode 100644 index 0000000..7be2230 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_mold_touch/mtouchh.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_mold_touch/mtouchh.vvc b/iwdification/dw_iwdspells_resource/cleric_mold_touch/mtouchh.vvc new file mode 100644 index 0000000..802d45d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_mold_touch/mtouchh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_mold_touch/sppr326.spl b/iwdification/dw_iwdspells_resource/cleric_mold_touch/sppr326.spl new file mode 100644 index 0000000..08fa421 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_mold_touch/sppr326.spl differ diff --git a/iwdification/bam/cdid326a.bam b/iwdification/dw_iwdspells_resource/cleric_mold_touch/sppr326a.bam similarity index 100% rename from iwdification/bam/cdid326a.bam rename to iwdification/dw_iwdspells_resource/cleric_mold_touch/sppr326a.bam diff --git a/iwdification/bam/cdid326b.bam b/iwdification/dw_iwdspells_resource/cleric_mold_touch/sppr326b.bam similarity index 100% rename from iwdification/bam/cdid326b.bam rename to iwdification/dw_iwdspells_resource/cleric_mold_touch/sppr326b.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_mold_touch/sppr326b.spl b/iwdification/dw_iwdspells_resource/cleric_mold_touch/sppr326b.spl new file mode 100644 index 0000000..408f7de Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_mold_touch/sppr326b.spl differ diff --git a/iwdification/bam/cdid326c.bam b/iwdification/dw_iwdspells_resource/cleric_mold_touch/sppr326c.bam similarity index 100% rename from iwdification/bam/cdid326c.bam rename to iwdification/dw_iwdspells_resource/cleric_mold_touch/sppr326c.bam diff --git a/iwdification/wav/cdiem06.ogg b/iwdification/dw_iwdspells_resource/cleric_moonblade/#eff_m06.wav similarity index 100% rename from iwdification/wav/cdiem06.ogg rename to iwdification/dw_iwdspells_resource/cleric_moonblade/#eff_m06.wav diff --git a/iwdification/wav/cdiep05.ogg b/iwdification/dw_iwdspells_resource/cleric_moonblade/#eff_p05.wav similarity index 100% rename from iwdification/wav/cdiep05.ogg rename to iwdification/dw_iwdspells_resource/cleric_moonblade/#eff_p05.wav diff --git a/iwdification/dw_iwdspells_resource/cleric_moonblade/gsw1h01.bam b/iwdification/dw_iwdspells_resource/cleric_moonblade/gsw1h01.bam new file mode 100644 index 0000000..59b7abc Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_moonblade/gsw1h01.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_moonblade/invoch.bam b/iwdification/dw_iwdspells_resource/cleric_moonblade/invoch.bam new file mode 100644 index 0000000..c3bf486 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_moonblade/invoch.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_moonblade/invoch.vvc b/iwdification/dw_iwdspells_resource/cleric_moonblade/invoch.vvc new file mode 100644 index 0000000..0030503 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_moonblade/invoch.vvc differ diff --git a/iwdification/bam/cdimoonb.bam b/iwdification/dw_iwdspells_resource/cleric_moonblade/moonbla.bam similarity index 100% rename from iwdification/bam/cdimoonb.bam rename to iwdification/dw_iwdspells_resource/cleric_moonblade/moonbla.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_moonblade/moonbla.itm b/iwdification/dw_iwdspells_resource/cleric_moonblade/moonbla.itm new file mode 100644 index 0000000..b7fb96e Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_moonblade/moonbla.itm differ diff --git a/iwdification/dw_iwdspells_resource/cleric_moonblade/sppr322.spl b/iwdification/dw_iwdspells_resource/cleric_moonblade/sppr322.spl new file mode 100644 index 0000000..54f6482 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_moonblade/sppr322.spl differ diff --git a/iwdification/bam/cdid322a.bam b/iwdification/dw_iwdspells_resource/cleric_moonblade/sppr322a.bam similarity index 100% rename from iwdification/bam/cdid322a.bam rename to iwdification/dw_iwdspells_resource/cleric_moonblade/sppr322a.bam diff --git a/iwdification/bam/cdid322b.bam b/iwdification/dw_iwdspells_resource/cleric_moonblade/sppr322b.bam similarity index 100% rename from iwdification/bam/cdid322b.bam rename to iwdification/dw_iwdspells_resource/cleric_moonblade/sppr322b.bam diff --git a/iwdification/bam/cdid322c.bam b/iwdification/dw_iwdspells_resource/cleric_moonblade/sppr322c.bam similarity index 100% rename from iwdification/bam/cdid322c.bam rename to iwdification/dw_iwdspells_resource/cleric_moonblade/sppr322c.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_prayer/#eff_p31.wav b/iwdification/dw_iwdspells_resource/cleric_prayer/#eff_p31.wav new file mode 100644 index 0000000..6eb2067 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_prayer/#eff_p31.wav differ diff --git a/iwdification/dw_iwdspells_resource/cleric_prayer/#prayerb.spl b/iwdification/dw_iwdspells_resource/cleric_prayer/#prayerb.spl new file mode 100644 index 0000000..a02de2c Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_prayer/#prayerb.spl differ diff --git a/iwdification/dw_iwdspells_resource/cleric_prayer/#prayerg.spl b/iwdification/dw_iwdspells_resource/cleric_prayer/#prayerg.spl new file mode 100644 index 0000000..574b7cf Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_prayer/#prayerg.spl differ diff --git a/iwdification/dw_iwdspells_resource/cleric_prayer/ohvrnp.pro b/iwdification/dw_iwdspells_resource/cleric_prayer/ohvrnp.pro new file mode 100644 index 0000000..8b1ad4f Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_prayer/ohvrnp.pro differ diff --git a/iwdification/dw_iwdspells_resource/cleric_prayer/ohvrpo.pro b/iwdification/dw_iwdspells_resource/cleric_prayer/ohvrpo.pro new file mode 100644 index 0000000..1b660f7 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_prayer/ohvrpo.pro differ diff --git a/iwdification/dw_iwdspells_resource/cleric_prayer/prayerb.bam b/iwdification/dw_iwdspells_resource/cleric_prayer/prayerb.bam new file mode 100644 index 0000000..af290ea Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_prayer/prayerb.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_prayer/prayerb.vvc b/iwdification/dw_iwdspells_resource/cleric_prayer/prayerb.vvc new file mode 100644 index 0000000..125bb32 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_prayer/prayerb.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_prayer/prayerg.bam b/iwdification/dw_iwdspells_resource/cleric_prayer/prayerg.bam new file mode 100644 index 0000000..0e70bfb Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_prayer/prayerg.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_prayer/prayerg.vvc b/iwdification/dw_iwdspells_resource/cleric_prayer/prayerg.vvc new file mode 100644 index 0000000..4ba9684 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_prayer/prayerg.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_prayer/sppr316.spl b/iwdification/dw_iwdspells_resource/cleric_prayer/sppr316.spl new file mode 100644 index 0000000..84188b8 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_prayer/sppr316.spl differ diff --git a/iwdification/bam/cdid316a.bam b/iwdification/dw_iwdspells_resource/cleric_prayer/sppr316a.bam similarity index 100% rename from iwdification/bam/cdid316a.bam rename to iwdification/dw_iwdspells_resource/cleric_prayer/sppr316a.bam diff --git a/iwdification/bam/cdid316b.bam b/iwdification/dw_iwdspells_resource/cleric_prayer/sppr316b.bam similarity index 100% rename from iwdification/bam/cdid316b.bam rename to iwdification/dw_iwdspells_resource/cleric_prayer/sppr316b.bam diff --git a/iwdification/bam/cdid316c.bam b/iwdification/dw_iwdspells_resource/cleric_prayer/sppr316c.bam similarity index 100% rename from iwdification/bam/cdid316c.bam rename to iwdification/dw_iwdspells_resource/cleric_prayer/sppr316c.bam diff --git a/iwdification/wav/cdiep45.ogg b/iwdification/dw_iwdspells_resource/cleric_produce_fire/#eff_p45.wav similarity index 100% rename from iwdification/wav/cdiep45.ogg rename to iwdification/dw_iwdspells_resource/cleric_produce_fire/#eff_p45.wav diff --git a/iwdification/dw_iwdspells_resource/cleric_produce_fire/idpro215.pro b/iwdification/dw_iwdspells_resource/cleric_produce_fire/idpro215.pro new file mode 100644 index 0000000..a40ac47 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_produce_fire/idpro215.pro differ diff --git a/iwdification/dw_iwdspells_resource/cleric_produce_fire/pfirea.bam b/iwdification/dw_iwdspells_resource/cleric_produce_fire/pfirea.bam new file mode 100644 index 0000000..b8128b8 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_produce_fire/pfirea.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_produce_fire/pfirex.bam b/iwdification/dw_iwdspells_resource/cleric_produce_fire/pfirex.bam new file mode 100644 index 0000000..e60282a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_produce_fire/pfirex.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_produce_fire/sppr419.spl b/iwdification/dw_iwdspells_resource/cleric_produce_fire/sppr419.spl new file mode 100644 index 0000000..34c9323 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_produce_fire/sppr419.spl differ diff --git a/iwdification/bam/cdid419a.bam b/iwdification/dw_iwdspells_resource/cleric_produce_fire/sppr419a.bam similarity index 100% rename from iwdification/bam/cdid419a.bam rename to iwdification/dw_iwdspells_resource/cleric_produce_fire/sppr419a.bam diff --git a/iwdification/bam/cdid419b.bam b/iwdification/dw_iwdspells_resource/cleric_produce_fire/sppr419b.bam similarity index 100% rename from iwdification/bam/cdid419b.bam rename to iwdification/dw_iwdspells_resource/cleric_produce_fire/sppr419b.bam diff --git a/iwdification/bam/cdid419c.bam b/iwdification/dw_iwdspells_resource/cleric_produce_fire/sppr419c.bam similarity index 100% rename from iwdification/bam/cdid419c.bam rename to iwdification/dw_iwdspells_resource/cleric_produce_fire/sppr419c.bam diff --git a/iwdification/wav/cdiep44.ogg b/iwdification/dw_iwdspells_resource/cleric_recitation/#eff_p44.wav similarity index 100% rename from iwdification/wav/cdiep44.ogg rename to iwdification/dw_iwdspells_resource/cleric_recitation/#eff_p44.wav diff --git a/iwdification/dw_iwdspells_resource/cleric_recitation/#reciteb.spl b/iwdification/dw_iwdspells_resource/cleric_recitation/#reciteb.spl new file mode 100644 index 0000000..0915c7a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_recitation/#reciteb.spl differ diff --git a/iwdification/dw_iwdspells_resource/cleric_recitation/#reciteg.spl b/iwdification/dw_iwdspells_resource/cleric_recitation/#reciteg.spl new file mode 100644 index 0000000..43117f0 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_recitation/#reciteg.spl differ diff --git a/iwdification/dw_iwdspells_resource/cleric_recitation/ohvrnp.pro b/iwdification/dw_iwdspells_resource/cleric_recitation/ohvrnp.pro new file mode 100644 index 0000000..8b1ad4f Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_recitation/ohvrnp.pro differ diff --git a/iwdification/dw_iwdspells_resource/cleric_recitation/ohvrpo.pro b/iwdification/dw_iwdspells_resource/cleric_recitation/ohvrpo.pro new file mode 100644 index 0000000..1b660f7 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_recitation/ohvrpo.pro differ diff --git a/iwdification/dw_iwdspells_resource/cleric_recitation/recitab.bam b/iwdification/dw_iwdspells_resource/cleric_recitation/recitab.bam new file mode 100644 index 0000000..f2ff4eb Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_recitation/recitab.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_recitation/recitab.vvc b/iwdification/dw_iwdspells_resource/cleric_recitation/recitab.vvc new file mode 100644 index 0000000..352120b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_recitation/recitab.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_recitation/recitag.bam b/iwdification/dw_iwdspells_resource/cleric_recitation/recitag.bam new file mode 100644 index 0000000..cadfc37 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_recitation/recitag.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_recitation/recitag.vvc b/iwdification/dw_iwdspells_resource/cleric_recitation/recitag.vvc new file mode 100644 index 0000000..cc9e1c2 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_recitation/recitag.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_recitation/sppr421.spl b/iwdification/dw_iwdspells_resource/cleric_recitation/sppr421.spl new file mode 100644 index 0000000..fe52880 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_recitation/sppr421.spl differ diff --git a/iwdification/bam/cdid421a.bam b/iwdification/dw_iwdspells_resource/cleric_recitation/sppr421a.bam similarity index 100% rename from iwdification/bam/cdid421a.bam rename to iwdification/dw_iwdspells_resource/cleric_recitation/sppr421a.bam diff --git a/iwdification/bam/cdid421b.bam b/iwdification/dw_iwdspells_resource/cleric_recitation/sppr421b.bam similarity index 100% rename from iwdification/bam/cdid421b.bam rename to iwdification/dw_iwdspells_resource/cleric_recitation/sppr421b.bam diff --git a/iwdification/bam/cdid421c.bam b/iwdification/dw_iwdspells_resource/cleric_recitation/sppr421c.bam similarity index 100% rename from iwdification/bam/cdid421c.bam rename to iwdification/dw_iwdspells_resource/cleric_recitation/sppr421c.bam diff --git a/iwdification/wav/cdiarm20.ogg b/iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/#are_m20.wav similarity index 100% rename from iwdification/wav/cdiarm20.ogg rename to iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/#are_m20.wav diff --git a/iwdification/wav/cdiee01.ogg b/iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/#eff_e01.wav similarity index 100% rename from iwdification/wav/cdiee01.ogg rename to iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/#eff_e01.wav diff --git a/iwdification/wav/cdiep36.ogg b/iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/#eff_p36.wav similarity index 100% rename from iwdification/wav/cdiep36.ogg rename to iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/#eff_p36.wav diff --git a/iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/#genabju.vvc b/iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/#genabju.vvc new file mode 100644 index 0000000..1ef5b17 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/#genabju.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/abjurax.bam b/iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/abjurax.bam new file mode 100644 index 0000000..01142a9 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/abjurax.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/idpro266.pro b/iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/idpro266.pro new file mode 100644 index 0000000..7c0cb0a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/idpro266.pro differ diff --git a/iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/rwotfag.vvc b/iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/rwotfag.vvc new file mode 100644 index 0000000..d9b139a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/rwotfag.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/rwotfah.bam b/iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/rwotfah.bam new file mode 100644 index 0000000..cdb43df Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/rwotfah.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/rwotfah.vvc b/iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/rwotfah.vvc new file mode 100644 index 0000000..aa7ba65 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/rwotfah.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/sppr518.spl b/iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/sppr518.spl new file mode 100644 index 0000000..31c93d4 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/sppr518.spl differ diff --git a/iwdification/bam/cdid518a.bam b/iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/sppr518a.bam similarity index 100% rename from iwdification/bam/cdid518a.bam rename to iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/sppr518a.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/sppr518a.spl b/iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/sppr518a.spl new file mode 100644 index 0000000..8712241 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/sppr518a.spl differ diff --git a/iwdification/bam/cdid518b.bam b/iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/sppr518b.bam similarity index 100% rename from iwdification/bam/cdid518b.bam rename to iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/sppr518b.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/sppr518b.spl b/iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/sppr518b.spl new file mode 100644 index 0000000..9c5c17a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/sppr518b.spl differ diff --git a/iwdification/bam/cdid518c.bam b/iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/sppr518c.bam similarity index 100% rename from iwdification/bam/cdid518c.bam rename to iwdification/dw_iwdspells_resource/cleric_righteous_wrath_of_the_faithful/sppr518c.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_shield_of_lathander/#latshl1.vvc b/iwdification/dw_iwdspells_resource/cleric_shield_of_lathander/#latshl1.vvc new file mode 100644 index 0000000..7663302 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_shield_of_lathander/#latshl1.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_shield_of_lathander/#latshl2.vvc b/iwdification/dw_iwdspells_resource/cleric_shield_of_lathander/#latshl2.vvc new file mode 100644 index 0000000..8b6b2db Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_shield_of_lathander/#latshl2.vvc differ diff --git a/iwdification/bam/cdisol1.bam b/iwdification/dw_iwdspells_resource/cleric_shield_of_lathander/solatc1.bam similarity index 100% rename from iwdification/bam/cdisol1.bam rename to iwdification/dw_iwdspells_resource/cleric_shield_of_lathander/solatc1.bam diff --git a/iwdification/bam/cdisol2.bam b/iwdification/dw_iwdspells_resource/cleric_shield_of_lathander/solatc2.bam similarity index 100% rename from iwdification/bam/cdisol2.bam rename to iwdification/dw_iwdspells_resource/cleric_shield_of_lathander/solatc2.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_shield_of_lathander/sppr520.spl b/iwdification/dw_iwdspells_resource/cleric_shield_of_lathander/sppr520.spl new file mode 100644 index 0000000..b3d0b3d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_shield_of_lathander/sppr520.spl differ diff --git a/iwdification/bam/cdid520a.bam b/iwdification/dw_iwdspells_resource/cleric_shield_of_lathander/sppr520a.bam similarity index 100% rename from iwdification/bam/cdid520a.bam rename to iwdification/dw_iwdspells_resource/cleric_shield_of_lathander/sppr520a.bam diff --git a/iwdification/bam/cdid520b.bam b/iwdification/dw_iwdspells_resource/cleric_shield_of_lathander/sppr520b.bam similarity index 100% rename from iwdification/bam/cdid520b.bam rename to iwdification/dw_iwdspells_resource/cleric_shield_of_lathander/sppr520b.bam diff --git a/iwdification/bam/cdid520c.bam b/iwdification/dw_iwdspells_resource/cleric_shield_of_lathander/sppr520c.bam similarity index 100% rename from iwdification/bam/cdid520c.bam rename to iwdification/dw_iwdspells_resource/cleric_shield_of_lathander/sppr520c.bam diff --git a/iwdification/wav/cdiep110.ogg b/iwdification/dw_iwdspells_resource/cleric_smashing_wave/#ff_p110.wav similarity index 100% rename from iwdification/wav/cdiep110.ogg rename to iwdification/dw_iwdspells_resource/cleric_smashing_wave/#ff_p110.wav diff --git a/iwdification/dw_iwdspells_resource/cleric_smashing_wave/idpro302.pro b/iwdification/dw_iwdspells_resource/cleric_smashing_wave/idpro302.pro new file mode 100644 index 0000000..d4d2796 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_smashing_wave/idpro302.pro differ diff --git a/iwdification/dw_iwdspells_resource/cleric_smashing_wave/sppr426.spl b/iwdification/dw_iwdspells_resource/cleric_smashing_wave/sppr426.spl new file mode 100644 index 0000000..9cfb335 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_smashing_wave/sppr426.spl differ diff --git a/iwdification/bam/cdid426a.bam b/iwdification/dw_iwdspells_resource/cleric_smashing_wave/sppr426a.bam similarity index 100% rename from iwdification/bam/cdid426a.bam rename to iwdification/dw_iwdspells_resource/cleric_smashing_wave/sppr426a.bam diff --git a/iwdification/bam/cdid426b.bam b/iwdification/dw_iwdspells_resource/cleric_smashing_wave/sppr426b.bam similarity index 100% rename from iwdification/bam/cdid426b.bam rename to iwdification/dw_iwdspells_resource/cleric_smashing_wave/sppr426b.bam diff --git a/iwdification/bam/cdid426c.bam b/iwdification/dw_iwdspells_resource/cleric_smashing_wave/sppr426c.bam similarity index 100% rename from iwdification/bam/cdid426c.bam rename to iwdification/dw_iwdspells_resource/cleric_smashing_wave/sppr426c.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_smashing_wave/swave.pro b/iwdification/dw_iwdspells_resource/cleric_smashing_wave/swave.pro new file mode 100644 index 0000000..1d004cf Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_smashing_wave/swave.pro differ diff --git a/iwdification/dw_iwdspells_resource/cleric_smashing_wave/swaveh.bam b/iwdification/dw_iwdspells_resource/cleric_smashing_wave/swaveh.bam new file mode 100644 index 0000000..0db9426 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_smashing_wave/swaveh.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_smashing_wave/swaveh.vvc b/iwdification/dw_iwdspells_resource/cleric_smashing_wave/swaveh.vvc new file mode 100644 index 0000000..d5934e8 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_smashing_wave/swaveh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_smashing_wave/swavex.bam b/iwdification/dw_iwdspells_resource/cleric_smashing_wave/swavex.bam new file mode 100644 index 0000000..ba79f43 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_smashing_wave/swavex.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_spike_growth/idpro300.pro b/iwdification/dw_iwdspells_resource/cleric_spike_growth/idpro300.pro new file mode 100644 index 0000000..5890aad Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_spike_growth/idpro300.pro differ diff --git a/iwdification/dw_iwdspells_resource/cleric_spike_growth/sgrowta.bam b/iwdification/dw_iwdspells_resource/cleric_spike_growth/sgrowta.bam new file mode 100644 index 0000000..130ff47 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_spike_growth/sgrowta.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_spike_growth/sgrowtx.bam b/iwdification/dw_iwdspells_resource/cleric_spike_growth/sgrowtx.bam new file mode 100644 index 0000000..5ea771e Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_spike_growth/sgrowtx.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_spike_growth/sppr324.spl b/iwdification/dw_iwdspells_resource/cleric_spike_growth/sppr324.spl new file mode 100644 index 0000000..ac7d2b6 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_spike_growth/sppr324.spl differ diff --git a/iwdification/bam/cdid324a.bam b/iwdification/dw_iwdspells_resource/cleric_spike_growth/sppr324a.bam similarity index 100% rename from iwdification/bam/cdid324a.bam rename to iwdification/dw_iwdspells_resource/cleric_spike_growth/sppr324a.bam diff --git a/iwdification/bam/cdid324b.bam b/iwdification/dw_iwdspells_resource/cleric_spike_growth/sppr324b.bam similarity index 100% rename from iwdification/bam/cdid324b.bam rename to iwdification/dw_iwdspells_resource/cleric_spike_growth/sppr324b.bam diff --git a/iwdification/bam/cdid324c.bam b/iwdification/dw_iwdspells_resource/cleric_spike_growth/sppr324c.bam similarity index 100% rename from iwdification/bam/cdid324c.bam rename to iwdification/dw_iwdspells_resource/cleric_spike_growth/sppr324c.bam diff --git a/iwdification/wav/cdicp03.ogg b/iwdification/dw_iwdspells_resource/cleric_spike_stones/#cre_p03.wav similarity index 100% rename from iwdification/wav/cdicp03.ogg rename to iwdification/dw_iwdspells_resource/cleric_spike_stones/#cre_p03.wav diff --git a/iwdification/wav/cdiarp04.ogg b/iwdification/dw_iwdspells_resource/cleric_spike_stones/are_p04.wav similarity index 100% rename from iwdification/wav/cdiarp04.ogg rename to iwdification/dw_iwdspells_resource/cleric_spike_stones/are_p04.wav diff --git a/iwdification/dw_iwdspells_resource/cleric_spike_stones/idpro213.pro b/iwdification/dw_iwdspells_resource/cleric_spike_stones/idpro213.pro new file mode 100644 index 0000000..31a485a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_spike_stones/idpro213.pro differ diff --git a/iwdification/dw_iwdspells_resource/cleric_spike_stones/sppr519.spl b/iwdification/dw_iwdspells_resource/cleric_spike_stones/sppr519.spl new file mode 100644 index 0000000..3bd1da8 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_spike_stones/sppr519.spl differ diff --git a/iwdification/bam/cdid519a.bam b/iwdification/dw_iwdspells_resource/cleric_spike_stones/sppr519a.bam similarity index 100% rename from iwdification/bam/cdid519a.bam rename to iwdification/dw_iwdspells_resource/cleric_spike_stones/sppr519a.bam diff --git a/iwdification/bam/cdid519b.bam b/iwdification/dw_iwdspells_resource/cleric_spike_stones/sppr519b.bam similarity index 100% rename from iwdification/bam/cdid519b.bam rename to iwdification/dw_iwdspells_resource/cleric_spike_stones/sppr519b.bam diff --git a/iwdification/bam/cdid519c.bam b/iwdification/dw_iwdspells_resource/cleric_spike_stones/sppr519c.bam similarity index 100% rename from iwdification/bam/cdid519c.bam rename to iwdification/dw_iwdspells_resource/cleric_spike_stones/sppr519c.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_spike_stones/sstonea.bam b/iwdification/dw_iwdspells_resource/cleric_spike_stones/sstonea.bam new file mode 100644 index 0000000..17efe40 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_spike_stones/sstonea.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_spike_stones/sstonea.vvc b/iwdification/dw_iwdspells_resource/cleric_spike_stones/sstonea.vvc new file mode 100644 index 0000000..47f62c9 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_spike_stones/sstonea.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_spiritual_wrath/#eff_p05.wav b/iwdification/dw_iwdspells_resource/cleric_spiritual_wrath/#eff_p05.wav new file mode 100644 index 0000000..6007a5a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_spiritual_wrath/#eff_p05.wav differ diff --git a/iwdification/dw_iwdspells_resource/cleric_spiritual_wrath/idpro312.pro b/iwdification/dw_iwdspells_resource/cleric_spiritual_wrath/idpro312.pro new file mode 100644 index 0000000..90a57d7 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_spiritual_wrath/idpro312.pro differ diff --git a/iwdification/dw_iwdspells_resource/cleric_spiritual_wrath/invoch.bam b/iwdification/dw_iwdspells_resource/cleric_spiritual_wrath/invoch.bam new file mode 100644 index 0000000..c3bf486 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_spiritual_wrath/invoch.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_spiritual_wrath/invoch.vvc b/iwdification/dw_iwdspells_resource/cleric_spiritual_wrath/invoch.vvc new file mode 100644 index 0000000..0030503 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_spiritual_wrath/invoch.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_spiritual_wrath/sppr618.spl b/iwdification/dw_iwdspells_resource/cleric_spiritual_wrath/sppr618.spl new file mode 100644 index 0000000..a76a60e Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_spiritual_wrath/sppr618.spl differ diff --git a/iwdification/bam/cdid618b.bam b/iwdification/dw_iwdspells_resource/cleric_spiritual_wrath/sppr618b.bam similarity index 100% rename from iwdification/bam/cdid618b.bam rename to iwdification/dw_iwdspells_resource/cleric_spiritual_wrath/sppr618b.bam diff --git a/iwdification/bam/cdid618c.bam b/iwdification/dw_iwdspells_resource/cleric_spiritual_wrath/sppr618c.bam similarity index 100% rename from iwdification/bam/cdid618c.bam rename to iwdification/dw_iwdspells_resource/cleric_spiritual_wrath/sppr618c.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_spiritual_wrath/swrath.pro b/iwdification/dw_iwdspells_resource/cleric_spiritual_wrath/swrath.pro new file mode 100644 index 0000000..ed7ea96 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_spiritual_wrath/swrath.pro differ diff --git a/iwdification/dw_iwdspells_resource/cleric_spiritual_wrath/swratht.bam b/iwdification/dw_iwdspells_resource/cleric_spiritual_wrath/swratht.bam new file mode 100644 index 0000000..580e8a7 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_spiritual_wrath/swratht.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_stalker/#eff_m13.wav b/iwdification/dw_iwdspells_resource/cleric_stalker/#eff_m13.wav new file mode 100644 index 0000000..3e1b1c3 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_stalker/#eff_m13.wav differ diff --git a/iwdification/dw_iwdspells_resource/cleric_stalker/#isc_01c.wav b/iwdification/dw_iwdspells_resource/cleric_stalker/#isc_01c.wav new file mode 100644 index 0000000..c6d87c1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_stalker/#isc_01c.wav differ diff --git a/iwdification/dw_iwdspells_resource/cleric_stalker/asumm1x.bam b/iwdification/dw_iwdspells_resource/cleric_stalker/asumm1x.bam new file mode 100644 index 0000000..0fd4142 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_stalker/asumm1x.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_stalker/asumm1x.vvc b/iwdification/dw_iwdspells_resource/cleric_stalker/asumm1x.vvc new file mode 100644 index 0000000..ea64bf0 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_stalker/asumm1x.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_stalker/msumm1h.bam b/iwdification/dw_iwdspells_resource/cleric_stalker/msumm1h.bam new file mode 100644 index 0000000..db39f3d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_stalker/msumm1h.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_stalker/msumm1h.vvc b/iwdification/dw_iwdspells_resource/cleric_stalker/msumm1h.vvc new file mode 100644 index 0000000..8aabcd1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_stalker/msumm1h.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_stalker/shmblr.itm b/iwdification/dw_iwdspells_resource/cleric_stalker/shmblr.itm new file mode 100644 index 0000000..42c4c62 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_stalker/shmblr.itm differ diff --git a/iwdification/dw_iwdspells_resource/cleric_stalker/sppr737.spl b/iwdification/dw_iwdspells_resource/cleric_stalker/sppr737.spl new file mode 100644 index 0000000..c6869cf Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_stalker/sppr737.spl differ diff --git a/iwdification/bam/cdid737a.bam b/iwdification/dw_iwdspells_resource/cleric_stalker/sppr737a.bam similarity index 100% rename from iwdification/bam/cdid737a.bam rename to iwdification/dw_iwdspells_resource/cleric_stalker/sppr737a.bam diff --git a/iwdification/bam/cdid737b.bam b/iwdification/dw_iwdspells_resource/cleric_stalker/sppr737b.bam similarity index 100% rename from iwdification/bam/cdid737b.bam rename to iwdification/dw_iwdspells_resource/cleric_stalker/sppr737b.bam diff --git a/iwdification/bam/cdid737c.bam b/iwdification/dw_iwdspells_resource/cleric_stalker/sppr737c.bam similarity index 100% rename from iwdification/bam/cdid737c.bam rename to iwdification/dw_iwdspells_resource/cleric_stalker/sppr737c.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_stalker/sshamb.2da b/iwdification/dw_iwdspells_resource/cleric_stalker/sshamb.2da new file mode 100644 index 0000000..0c27c03 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/cleric_stalker/sshamb.2da @@ -0,0 +1,4 @@ +2DA V1.0 +0 + RESREF HitAnimation AreaHitAnimation +1 SSHAMB MSumm1H ASumm1X diff --git a/iwdification/dw_iwdspells_resource/cleric_stalker/sshamb.cre b/iwdification/dw_iwdspells_resource/cleric_stalker/sshamb.cre new file mode 100644 index 0000000..a8d66a9 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_stalker/sshamb.cre differ diff --git a/iwdification/wav/cdiep02.ogg b/iwdification/dw_iwdspells_resource/cleric_star_metal_cudgel/#eff_p02.wav similarity index 100% rename from iwdification/wav/cdiep02.ogg rename to iwdification/dw_iwdspells_resource/cleric_star_metal_cudgel/#eff_p02.wav diff --git a/iwdification/dw_iwdspells_resource/cleric_star_metal_cudgel/conjuh.bam b/iwdification/dw_iwdspells_resource/cleric_star_metal_cudgel/conjuh.bam new file mode 100644 index 0000000..6b61a5e Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_star_metal_cudgel/conjuh.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_star_metal_cudgel/conjuh.vvc b/iwdification/dw_iwdspells_resource/cleric_star_metal_cudgel/conjuh.vvc new file mode 100644 index 0000000..1a5c3dc Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_star_metal_cudgel/conjuh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_star_metal_cudgel/gblun01.bam b/iwdification/dw_iwdspells_resource/cleric_star_metal_cudgel/gblun01.bam new file mode 100644 index 0000000..502e1dc Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_star_metal_cudgel/gblun01.bam differ diff --git a/iwdification/bam/cdismcud.bam b/iwdification/dw_iwdspells_resource/cleric_star_metal_cudgel/ismcudge.bam similarity index 100% rename from iwdification/bam/cdismcud.bam rename to iwdification/dw_iwdspells_resource/cleric_star_metal_cudgel/ismcudge.bam diff --git a/iwdification/eff/cdismcud.eff b/iwdification/dw_iwdspells_resource/cleric_star_metal_cudgel/smcudge.eff similarity index 100% rename from iwdification/eff/cdismcud.eff rename to iwdification/dw_iwdspells_resource/cleric_star_metal_cudgel/smcudge.eff diff --git a/iwdification/dw_iwdspells_resource/cleric_star_metal_cudgel/smcudge.itm b/iwdification/dw_iwdspells_resource/cleric_star_metal_cudgel/smcudge.itm new file mode 100644 index 0000000..79f5d45 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_star_metal_cudgel/smcudge.itm differ diff --git a/iwdification/dw_iwdspells_resource/cleric_star_metal_cudgel/sppr425.spl b/iwdification/dw_iwdspells_resource/cleric_star_metal_cudgel/sppr425.spl new file mode 100644 index 0000000..dacdba7 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_star_metal_cudgel/sppr425.spl differ diff --git a/iwdification/bam/cdid425a.bam b/iwdification/dw_iwdspells_resource/cleric_star_metal_cudgel/sppr425a.bam similarity index 100% rename from iwdification/bam/cdid425a.bam rename to iwdification/dw_iwdspells_resource/cleric_star_metal_cudgel/sppr425a.bam diff --git a/iwdification/bam/cdid425b.bam b/iwdification/dw_iwdspells_resource/cleric_star_metal_cudgel/sppr425b.bam similarity index 100% rename from iwdification/bam/cdid425b.bam rename to iwdification/dw_iwdspells_resource/cleric_star_metal_cudgel/sppr425b.bam diff --git a/iwdification/bam/cdid425c.bam b/iwdification/dw_iwdspells_resource/cleric_star_metal_cudgel/sppr425c.bam similarity index 100% rename from iwdification/bam/cdid425c.bam rename to iwdification/dw_iwdspells_resource/cleric_star_metal_cudgel/sppr425c.bam diff --git a/iwdification/pro/cdistatc.pro b/iwdification/dw_iwdspells_resource/cleric_static_charge/idstatic.pro similarity index 100% rename from iwdification/pro/cdistatc.pro rename to iwdification/dw_iwdspells_resource/cleric_static_charge/idstatic.pro diff --git a/iwdification/dw_iwdspells_resource/cleric_static_charge/schargh.bam b/iwdification/dw_iwdspells_resource/cleric_static_charge/schargh.bam new file mode 100644 index 0000000..b08b182 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_static_charge/schargh.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_static_charge/schargh.vvc b/iwdification/dw_iwdspells_resource/cleric_static_charge/schargh.vvc new file mode 100644 index 0000000..8173594 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_static_charge/schargh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_static_charge/sppr420.spl b/iwdification/dw_iwdspells_resource/cleric_static_charge/sppr420.spl new file mode 100644 index 0000000..6a4f4df Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_static_charge/sppr420.spl differ diff --git a/iwdification/bam/cdid420a.bam b/iwdification/dw_iwdspells_resource/cleric_static_charge/sppr420a.bam similarity index 100% rename from iwdification/bam/cdid420a.bam rename to iwdification/dw_iwdspells_resource/cleric_static_charge/sppr420a.bam diff --git a/iwdification/bam/cdid420b.bam b/iwdification/dw_iwdspells_resource/cleric_static_charge/sppr420b.bam similarity index 100% rename from iwdification/bam/cdid420b.bam rename to iwdification/dw_iwdspells_resource/cleric_static_charge/sppr420b.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_static_charge/sppr420b.spl b/iwdification/dw_iwdspells_resource/cleric_static_charge/sppr420b.spl new file mode 100644 index 0000000..3c13267 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_static_charge/sppr420b.spl differ diff --git a/iwdification/bam/cdid420c.bam b/iwdification/dw_iwdspells_resource/cleric_static_charge/sppr420c.bam similarity index 100% rename from iwdification/bam/cdid420c.bam rename to iwdification/dw_iwdspells_resource/cleric_static_charge/sppr420c.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_storm_shell/#storm.vvc b/iwdification/dw_iwdspells_resource/cleric_storm_shell/#storm.vvc new file mode 100644 index 0000000..a6b6d8f Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_storm_shell/#storm.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_storm_shell/sppr327.spl b/iwdification/dw_iwdspells_resource/cleric_storm_shell/sppr327.spl new file mode 100644 index 0000000..8e02812 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_storm_shell/sppr327.spl differ diff --git a/iwdification/bam/cdid327a.bam b/iwdification/dw_iwdspells_resource/cleric_storm_shell/sppr327a.bam similarity index 100% rename from iwdification/bam/cdid327a.bam rename to iwdification/dw_iwdspells_resource/cleric_storm_shell/sppr327a.bam diff --git a/iwdification/bam/cdid327b.bam b/iwdification/dw_iwdspells_resource/cleric_storm_shell/sppr327b.bam similarity index 100% rename from iwdification/bam/cdid327b.bam rename to iwdification/dw_iwdspells_resource/cleric_storm_shell/sppr327b.bam diff --git a/iwdification/bam/cdid327c.bam b/iwdification/dw_iwdspells_resource/cleric_storm_shell/sppr327c.bam similarity index 100% rename from iwdification/bam/cdid327c.bam rename to iwdification/dw_iwdspells_resource/cleric_storm_shell/sppr327c.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_storm_shell/sshellc.bam b/iwdification/dw_iwdspells_resource/cleric_storm_shell/sshellc.bam new file mode 100644 index 0000000..f82ebd0 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_storm_shell/sshellc.bam differ diff --git a/iwdification/wav/cdiep39.ogg b/iwdification/dw_iwdspells_resource/cleric_sunscorch/#eff_p39.wav similarity index 100% rename from iwdification/wav/cdiep39.ogg rename to iwdification/dw_iwdspells_resource/cleric_sunscorch/#eff_p39.wav diff --git a/iwdification/dw_iwdspells_resource/cleric_sunscorch/sppr115.spl b/iwdification/dw_iwdspells_resource/cleric_sunscorch/sppr115.spl new file mode 100644 index 0000000..bcc4b15 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_sunscorch/sppr115.spl differ diff --git a/iwdification/bam/cdid115a.bam b/iwdification/dw_iwdspells_resource/cleric_sunscorch/sppr115a.bam similarity index 100% rename from iwdification/bam/cdid115a.bam rename to iwdification/dw_iwdspells_resource/cleric_sunscorch/sppr115a.bam diff --git a/iwdification/bam/cdid115b.bam b/iwdification/dw_iwdspells_resource/cleric_sunscorch/sppr115b.bam similarity index 100% rename from iwdification/bam/cdid115b.bam rename to iwdification/dw_iwdspells_resource/cleric_sunscorch/sppr115b.bam diff --git a/iwdification/bam/cdid115c.bam b/iwdification/dw_iwdspells_resource/cleric_sunscorch/sppr115c.bam similarity index 100% rename from iwdification/bam/cdid115c.bam rename to iwdification/dw_iwdspells_resource/cleric_sunscorch/sppr115c.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_sunscorch/sppr115c.spl b/iwdification/dw_iwdspells_resource/cleric_sunscorch/sppr115c.spl new file mode 100644 index 0000000..51ce5c4 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_sunscorch/sppr115c.spl differ diff --git a/iwdification/dw_iwdspells_resource/cleric_sunscorch/sppr115d.spl b/iwdification/dw_iwdspells_resource/cleric_sunscorch/sppr115d.spl new file mode 100644 index 0000000..8b05553 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_sunscorch/sppr115d.spl differ diff --git a/iwdification/dw_iwdspells_resource/cleric_sunscorch/sunscoh.bam b/iwdification/dw_iwdspells_resource/cleric_sunscorch/sunscoh.bam new file mode 100644 index 0000000..a7fb637 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_sunscorch/sunscoh.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_sunscorch/sunscoh.pro b/iwdification/dw_iwdspells_resource/cleric_sunscorch/sunscoh.pro new file mode 100644 index 0000000..f18760c Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_sunscorch/sunscoh.pro differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/#eff_e04.wav b/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/#eff_e04.wav new file mode 100644 index 0000000..72bd0e2 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/#eff_e04.wav differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/#eff_p02.wav b/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/#eff_p02.wav new file mode 100644 index 0000000..ccda563 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/#eff_p02.wav differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/idpro277.pro b/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/idpro277.pro new file mode 100644 index 0000000..8708336 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/idpro277.pro differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/insec3.pro b/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/insec3.pro new file mode 100644 index 0000000..a5e8853 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/insec3.pro differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/insec4.pro b/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/insec4.pro new file mode 100644 index 0000000..c3fa4bc Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/insec4.pro differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/paralh.vvc b/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/paralh.vvc new file mode 100644 index 0000000..204ac0f Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/paralh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/rng_p01.wav b/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/rng_p01.wav new file mode 100644 index 0000000..2f32c67 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/rng_p01.wav differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/sohopex.bam b/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/sohopex.bam new file mode 100644 index 0000000..afd63b5 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/sohopex.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/sohopex.vvc b/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/sohopex.vvc new file mode 100644 index 0000000..544a5f9 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/sohopex.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/spinsect.bam b/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/spinsect.bam new file mode 100644 index 0000000..58f416f Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/spinsect.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/spiplari.bam b/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/spiplari.bam new file mode 100644 index 0000000..d8c5051 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/spiplari.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/spiplaui.bam b/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/spiplaui.bam new file mode 100644 index 0000000..67e8e2d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/spiplaui.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/sppr716.spl b/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/sppr716.spl new file mode 100644 index 0000000..bfc4335 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/sppr716.spl differ diff --git a/iwdification/bam/cdid716a.bam b/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/sppr716a.bam similarity index 100% rename from iwdification/bam/cdid716a.bam rename to iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/sppr716a.bam diff --git a/iwdification/bam/cdid716b.bam b/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/sppr716b.bam similarity index 100% rename from iwdification/bam/cdid716b.bam rename to iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/sppr716b.bam diff --git a/iwdification/bam/cdid716c.bam b/iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/sppr716c.bam similarity index 100% rename from iwdification/bam/cdid716c.bam rename to iwdification/dw_iwdspells_resource/cleric_symbol_hopelessness/sppr716c.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/#eff_e04.wav b/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/#eff_e04.wav new file mode 100644 index 0000000..72bd0e2 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/#eff_e04.wav differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/#eff_p02.wav b/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/#eff_p02.wav new file mode 100644 index 0000000..ccda563 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/#eff_p02.wav differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/idpro277.pro b/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/idpro277.pro new file mode 100644 index 0000000..8708336 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/idpro277.pro differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/insec3.pro b/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/insec3.pro new file mode 100644 index 0000000..a5e8853 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/insec3.pro differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/insec4.pro b/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/insec4.pro new file mode 100644 index 0000000..c3fa4bc Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/insec4.pro differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/paralh.vvc b/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/paralh.vvc new file mode 100644 index 0000000..204ac0f Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/paralh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/rng_p01.wav b/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/rng_p01.wav new file mode 100644 index 0000000..2f32c67 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/rng_p01.wav differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/sohopex.bam b/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/sohopex.bam new file mode 100644 index 0000000..afd63b5 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/sohopex.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/sohopex.vvc b/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/sohopex.vvc new file mode 100644 index 0000000..544a5f9 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/sohopex.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/spinsect.bam b/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/spinsect.bam new file mode 100644 index 0000000..58f416f Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/spinsect.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/spiplari.bam b/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/spiplari.bam new file mode 100644 index 0000000..d8c5051 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/spiplari.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/spiplaui.bam b/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/spiplaui.bam new file mode 100644 index 0000000..67e8e2d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/spiplaui.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/sppr716.spl b/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/sppr716.spl new file mode 100644 index 0000000..bfc4335 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/sppr716.spl differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/sppr716a.bam b/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/sppr716a.bam new file mode 100644 index 0000000..bb254e6 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/sppr716a.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/sppr716b.bam b/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/sppr716b.bam new file mode 100644 index 0000000..079c017 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/sppr716b.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/sppr716c.bam b/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/sppr716c.bam new file mode 100644 index 0000000..6389e30 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_of_hopelessness/sppr716c.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_of_pain/#eff_e04.wav b/iwdification/dw_iwdspells_resource/cleric_symbol_of_pain/#eff_e04.wav new file mode 100644 index 0000000..72bd0e2 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_of_pain/#eff_e04.wav differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_of_pain/#eff_p02.wav b/iwdification/dw_iwdspells_resource/cleric_symbol_of_pain/#eff_p02.wav new file mode 100644 index 0000000..ccda563 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_of_pain/#eff_p02.wav differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_of_pain/conjuh.bam b/iwdification/dw_iwdspells_resource/cleric_symbol_of_pain/conjuh.bam new file mode 100644 index 0000000..6b61a5e Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_of_pain/conjuh.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_of_pain/conjuh.vvc b/iwdification/dw_iwdspells_resource/cleric_symbol_of_pain/conjuh.vvc new file mode 100644 index 0000000..1a5c3dc Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_of_pain/conjuh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_of_pain/sppr714.spl b/iwdification/dw_iwdspells_resource/cleric_symbol_of_pain/sppr714.spl new file mode 100644 index 0000000..04e9eea Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_of_pain/sppr714.spl differ diff --git a/iwdification/bam/cdid714a.bam b/iwdification/dw_iwdspells_resource/cleric_symbol_of_pain/sppr714a.bam similarity index 100% rename from iwdification/bam/cdid714a.bam rename to iwdification/dw_iwdspells_resource/cleric_symbol_of_pain/sppr714a.bam diff --git a/iwdification/bam/cdid714b.bam b/iwdification/dw_iwdspells_resource/cleric_symbol_of_pain/sppr714b.bam similarity index 100% rename from iwdification/bam/cdid714b.bam rename to iwdification/dw_iwdspells_resource/cleric_symbol_of_pain/sppr714b.bam diff --git a/iwdification/bam/cdid714c.bam b/iwdification/dw_iwdspells_resource/cleric_symbol_of_pain/sppr714c.bam similarity index 100% rename from iwdification/bam/cdid714c.bam rename to iwdification/dw_iwdspells_resource/cleric_symbol_of_pain/sppr714c.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_pain/#eff_e04.wav b/iwdification/dw_iwdspells_resource/cleric_symbol_pain/#eff_e04.wav new file mode 100644 index 0000000..72bd0e2 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_pain/#eff_e04.wav differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_pain/#eff_p02.wav b/iwdification/dw_iwdspells_resource/cleric_symbol_pain/#eff_p02.wav new file mode 100644 index 0000000..ccda563 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_pain/#eff_p02.wav differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_pain/conjuh.bam b/iwdification/dw_iwdspells_resource/cleric_symbol_pain/conjuh.bam new file mode 100644 index 0000000..6b61a5e Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_pain/conjuh.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_pain/conjuh.vvc b/iwdification/dw_iwdspells_resource/cleric_symbol_pain/conjuh.vvc new file mode 100644 index 0000000..1a5c3dc Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_pain/conjuh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_pain/sppr714.spl b/iwdification/dw_iwdspells_resource/cleric_symbol_pain/sppr714.spl new file mode 100644 index 0000000..04e9eea Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_pain/sppr714.spl differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_pain/sppr714a.bam b/iwdification/dw_iwdspells_resource/cleric_symbol_pain/sppr714a.bam new file mode 100644 index 0000000..f0c91d1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_pain/sppr714a.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_pain/sppr714b.bam b/iwdification/dw_iwdspells_resource/cleric_symbol_pain/sppr714b.bam new file mode 100644 index 0000000..f6229b9 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_pain/sppr714b.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_symbol_pain/sppr714c.bam b/iwdification/dw_iwdspells_resource/cleric_symbol_pain/sppr714c.bam new file mode 100644 index 0000000..2c32ebd Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_symbol_pain/sppr714c.bam differ diff --git a/iwdification/wav/cditra61.ogg b/iwdification/dw_iwdspells_resource/cleric_thorn_spray/#tra_61.wav similarity index 100% rename from iwdification/wav/cditra61.ogg rename to iwdification/dw_iwdspells_resource/cleric_thorn_spray/#tra_61.wav diff --git a/iwdification/dw_iwdspells_resource/cleric_thorn_spray/idpro303.pro b/iwdification/dw_iwdspells_resource/cleric_thorn_spray/idpro303.pro new file mode 100644 index 0000000..8529baf Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_thorn_spray/idpro303.pro differ diff --git a/iwdification/dw_iwdspells_resource/cleric_thorn_spray/sppr427.spl b/iwdification/dw_iwdspells_resource/cleric_thorn_spray/sppr427.spl new file mode 100644 index 0000000..44f9130 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_thorn_spray/sppr427.spl differ diff --git a/iwdification/bam/cdid427a.bam b/iwdification/dw_iwdspells_resource/cleric_thorn_spray/sppr427a.bam similarity index 100% rename from iwdification/bam/cdid427a.bam rename to iwdification/dw_iwdspells_resource/cleric_thorn_spray/sppr427a.bam diff --git a/iwdification/bam/cdid427b.bam b/iwdification/dw_iwdspells_resource/cleric_thorn_spray/sppr427b.bam similarity index 100% rename from iwdification/bam/cdid427b.bam rename to iwdification/dw_iwdspells_resource/cleric_thorn_spray/sppr427b.bam diff --git a/iwdification/bam/cdid427c.bam b/iwdification/dw_iwdspells_resource/cleric_thorn_spray/sppr427c.bam similarity index 100% rename from iwdification/bam/cdid427c.bam rename to iwdification/dw_iwdspells_resource/cleric_thorn_spray/sppr427c.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_thorn_spray/tsprayt.bam b/iwdification/dw_iwdspells_resource/cleric_thorn_spray/tsprayt.bam new file mode 100644 index 0000000..5111a0c Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_thorn_spray/tsprayt.bam differ diff --git a/iwdification/wav/cdiafp27.ogg b/iwdification/dw_iwdspells_resource/cleric_undead_ward/#aft_p27.wav similarity index 100% rename from iwdification/wav/cdiafp27.ogg rename to iwdification/dw_iwdspells_resource/cleric_undead_ward/#aft_p27.wav diff --git a/iwdification/wav/cdiarp28.ogg b/iwdification/dw_iwdspells_resource/cleric_undead_ward/#are_p28.wav similarity index 100% rename from iwdification/wav/cdiarp28.ogg rename to iwdification/dw_iwdspells_resource/cleric_undead_ward/#are_p28.wav diff --git a/iwdification/dw_iwdspells_resource/cleric_undead_ward/sppr521.spl b/iwdification/dw_iwdspells_resource/cleric_undead_ward/sppr521.spl new file mode 100644 index 0000000..48251d3 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_undead_ward/sppr521.spl differ diff --git a/iwdification/bam/cdid521a.bam b/iwdification/dw_iwdspells_resource/cleric_undead_ward/sppr521a.bam similarity index 100% rename from iwdification/bam/cdid521a.bam rename to iwdification/dw_iwdspells_resource/cleric_undead_ward/sppr521a.bam diff --git a/iwdification/bam/cdid521b.bam b/iwdification/dw_iwdspells_resource/cleric_undead_ward/sppr521b.bam similarity index 100% rename from iwdification/bam/cdid521b.bam rename to iwdification/dw_iwdspells_resource/cleric_undead_ward/sppr521b.bam diff --git a/iwdification/bam/cdid521c.bam b/iwdification/dw_iwdspells_resource/cleric_undead_ward/sppr521c.bam similarity index 100% rename from iwdification/bam/cdid521c.bam rename to iwdification/dw_iwdspells_resource/cleric_undead_ward/sppr521c.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_undead_ward/uward.pro b/iwdification/dw_iwdspells_resource/cleric_undead_ward/uward.pro new file mode 100644 index 0000000..3def927 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_undead_ward/uward.pro differ diff --git a/iwdification/bam/cdiuwrdx.bam b/iwdification/dw_iwdspells_resource/cleric_undead_ward/uwardx.bam similarity index 100% rename from iwdification/bam/cdiuwrdx.bam rename to iwdification/dw_iwdspells_resource/cleric_undead_ward/uwardx.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_undead_ward/uwardx.vvc b/iwdification/dw_iwdspells_resource/cleric_undead_ward/uwardx.vvc new file mode 100644 index 0000000..f026f7b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_undead_ward/uwardx.vvc differ diff --git a/iwdification/wav/cdiep112.ogg b/iwdification/dw_iwdspells_resource/cleric_unfailing_endurance/#ff_p112.wav similarity index 100% rename from iwdification/wav/cdiep112.ogg rename to iwdification/dw_iwdspells_resource/cleric_unfailing_endurance/#ff_p112.wav diff --git a/iwdification/dw_iwdspells_resource/cleric_unfailing_endurance/necroh.bam b/iwdification/dw_iwdspells_resource/cleric_unfailing_endurance/necroh.bam new file mode 100644 index 0000000..1712f6d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_unfailing_endurance/necroh.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_unfailing_endurance/necroh.vvc b/iwdification/dw_iwdspells_resource/cleric_unfailing_endurance/necroh.vvc new file mode 100644 index 0000000..26e9f2a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_unfailing_endurance/necroh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_unfailing_endurance/sppr424.spl b/iwdification/dw_iwdspells_resource/cleric_unfailing_endurance/sppr424.spl new file mode 100644 index 0000000..aff30c0 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_unfailing_endurance/sppr424.spl differ diff --git a/iwdification/bam/cdid424a.bam b/iwdification/dw_iwdspells_resource/cleric_unfailing_endurance/sppr424a.bam similarity index 100% rename from iwdification/bam/cdid424a.bam rename to iwdification/dw_iwdspells_resource/cleric_unfailing_endurance/sppr424a.bam diff --git a/iwdification/bam/cdid424b.bam b/iwdification/dw_iwdspells_resource/cleric_unfailing_endurance/sppr424b.bam similarity index 100% rename from iwdification/bam/cdid424b.bam rename to iwdification/dw_iwdspells_resource/cleric_unfailing_endurance/sppr424b.bam diff --git a/iwdification/bam/cdid424c.bam b/iwdification/dw_iwdspells_resource/cleric_unfailing_endurance/sppr424c.bam similarity index 100% rename from iwdification/bam/cdid424c.bam rename to iwdification/dw_iwdspells_resource/cleric_unfailing_endurance/sppr424c.bam diff --git a/iwdification/wav/cdiarp22.ogg b/iwdification/dw_iwdspells_resource/cleric_wall_of_moonlight/are_p22.wav similarity index 100% rename from iwdification/wav/cdiarp22.ogg rename to iwdification/dw_iwdspells_resource/cleric_wall_of_moonlight/are_p22.wav diff --git a/iwdification/dw_iwdspells_resource/cleric_wall_of_moonlight/sppr428.spl b/iwdification/dw_iwdspells_resource/cleric_wall_of_moonlight/sppr428.spl new file mode 100644 index 0000000..f67de79 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_wall_of_moonlight/sppr428.spl differ diff --git a/iwdification/bam/cdid428a.bam b/iwdification/dw_iwdspells_resource/cleric_wall_of_moonlight/sppr428a.bam similarity index 100% rename from iwdification/bam/cdid428a.bam rename to iwdification/dw_iwdspells_resource/cleric_wall_of_moonlight/sppr428a.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_wall_of_moonlight/sppr428a.spl b/iwdification/dw_iwdspells_resource/cleric_wall_of_moonlight/sppr428a.spl new file mode 100644 index 0000000..7a35500 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_wall_of_moonlight/sppr428a.spl differ diff --git a/iwdification/bam/cdid428b.bam b/iwdification/dw_iwdspells_resource/cleric_wall_of_moonlight/sppr428b.bam similarity index 100% rename from iwdification/bam/cdid428b.bam rename to iwdification/dw_iwdspells_resource/cleric_wall_of_moonlight/sppr428b.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_wall_of_moonlight/sppr428b.spl b/iwdification/dw_iwdspells_resource/cleric_wall_of_moonlight/sppr428b.spl new file mode 100644 index 0000000..2b9323b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_wall_of_moonlight/sppr428b.spl differ diff --git a/iwdification/bam/cdid428c.bam b/iwdification/dw_iwdspells_resource/cleric_wall_of_moonlight/sppr428c.bam similarity index 100% rename from iwdification/bam/cdid428c.bam rename to iwdification/dw_iwdspells_resource/cleric_wall_of_moonlight/sppr428c.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_wall_of_moonlight/womoon.pro b/iwdification/dw_iwdspells_resource/cleric_wall_of_moonlight/womoon.pro new file mode 100644 index 0000000..dfbdf62 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_wall_of_moonlight/womoon.pro differ diff --git a/iwdification/dw_iwdspells_resource/cleric_wall_of_moonlight/womoonx.bam b/iwdification/dw_iwdspells_resource/cleric_wall_of_moonlight/womoonx.bam new file mode 100644 index 0000000..bf6e72d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_wall_of_moonlight/womoonx.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_wall_of_moonlight/womoonx.vvc b/iwdification/dw_iwdspells_resource/cleric_wall_of_moonlight/womoonx.vvc new file mode 100644 index 0000000..b1a326f Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_wall_of_moonlight/womoonx.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_whirlwind/sppr617.spl b/iwdification/dw_iwdspells_resource/cleric_whirlwind/sppr617.spl new file mode 100644 index 0000000..6c17286 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_whirlwind/sppr617.spl differ diff --git a/iwdification/bam/cdid617a.bam b/iwdification/dw_iwdspells_resource/cleric_whirlwind/sppr617a.bam similarity index 100% rename from iwdification/bam/cdid617a.bam rename to iwdification/dw_iwdspells_resource/cleric_whirlwind/sppr617a.bam diff --git a/iwdification/bam/cdid617b.bam b/iwdification/dw_iwdspells_resource/cleric_whirlwind/sppr617b.bam similarity index 100% rename from iwdification/bam/cdid617b.bam rename to iwdification/dw_iwdspells_resource/cleric_whirlwind/sppr617b.bam diff --git a/iwdification/bam/cdid617c.bam b/iwdification/dw_iwdspells_resource/cleric_whirlwind/sppr617c.bam similarity index 100% rename from iwdification/bam/cdid617c.bam rename to iwdification/dw_iwdspells_resource/cleric_whirlwind/sppr617c.bam diff --git a/iwdification/dw_iwdspells_resource/cleric_whirlwind/whirlw.pro b/iwdification/dw_iwdspells_resource/cleric_whirlwind/whirlw.pro new file mode 100644 index 0000000..dc83e1c Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_whirlwind/whirlw.pro differ diff --git a/iwdification/dw_iwdspells_resource/cleric_whirlwind/whirlwx.bam b/iwdification/dw_iwdspells_resource/cleric_whirlwind/whirlwx.bam new file mode 100644 index 0000000..85bbff2 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_whirlwind/whirlwx.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_wither/#ff_p103.wav b/iwdification/dw_iwdspells_resource/cleric_wither/#ff_p103.wav new file mode 100644 index 0000000..836ce70 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_wither/#ff_p103.wav differ diff --git a/iwdification/dw_iwdspells_resource/cleric_wither/#ff_p113.wav b/iwdification/dw_iwdspells_resource/cleric_wither/#ff_p113.wav new file mode 100644 index 0000000..7dbd951 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_wither/#ff_p113.wav differ diff --git a/iwdification/dw_iwdspells_resource/cleric_wither/harmh.bam b/iwdification/dw_iwdspells_resource/cleric_wither/harmh.bam new file mode 100644 index 0000000..29bde9b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_wither/harmh.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_wither/harmh.vvc b/iwdification/dw_iwdspells_resource/cleric_wither/harmh.vvc new file mode 100644 index 0000000..b769f36 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_wither/harmh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/cleric_wither/sppr740.eff b/iwdification/dw_iwdspells_resource/cleric_wither/sppr740.eff new file mode 100644 index 0000000..cf4cfe2 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_wither/sppr740.eff differ diff --git a/iwdification/dw_iwdspells_resource/cleric_wither/sppr740.spl b/iwdification/dw_iwdspells_resource/cleric_wither/sppr740.spl new file mode 100644 index 0000000..5f08b89 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_wither/sppr740.spl differ diff --git a/iwdification/dw_iwdspells_resource/cleric_wither/sppr740a.bam b/iwdification/dw_iwdspells_resource/cleric_wither/sppr740a.bam new file mode 100644 index 0000000..b95f6dc Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_wither/sppr740a.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_wither/sppr740b.bam b/iwdification/dw_iwdspells_resource/cleric_wither/sppr740b.bam new file mode 100644 index 0000000..5ab11a8 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_wither/sppr740b.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_wither/sppr740c.bam b/iwdification/dw_iwdspells_resource/cleric_wither/sppr740c.bam new file mode 100644 index 0000000..ea060ad Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_wither/sppr740c.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_wither/witherh.bam b/iwdification/dw_iwdspells_resource/cleric_wither/witherh.bam new file mode 100644 index 0000000..915e6c1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_wither/witherh.bam differ diff --git a/iwdification/dw_iwdspells_resource/cleric_wither/witherh.vvc b/iwdification/dw_iwdspells_resource/cleric_wither/witherh.vvc new file mode 100644 index 0000000..c90cab8 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/cleric_wither/witherh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/divine_proj.txt b/iwdification/dw_iwdspells_resource/divine_proj.txt new file mode 100644 index 0000000..e5c6208 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/divine_proj.txt @@ -0,0 +1,30 @@ + +idpro237 356 +sunscoh 459 +idpro298 400 +ohvrpo 455 +ohvrnp 456 +SMLLARNC 215 +idpro300 402 +idpro301 403 +IDMOLD 60 +idpro230 350 +idpro215 346 +IDSTATIC 61 +idpro309 407 +idpro302 476 +swave 447 +idpro303 404 +WOMOON 98 +idpro266 378 +idpro213 345 +uward 458 +idpro241 360 +whirlw 435 +idpro312 452 +SWRATH 475 +idpro277 387 +INSEC3 229 +INSEC4 231 +idpro307 406 +idpro282 390 diff --git a/iwdification/dw_iwdspells_resource/divine_resrefs.txt b/iwdification/dw_iwdspells_resource/divine_resrefs.txt new file mode 100644 index 0000000..dd4b94d --- /dev/null +++ b/iwdification/dw_iwdspells_resource/divine_resrefs.txt @@ -0,0 +1,52 @@ + +CLERIC_CURSE SPPR112 +CLERIC_CAUSE_LIGHT_WOUNDS SPPR114 +CLERIC_SUNSCORCH SPPR115 +CLERIC_CURE_MODERATE_WOUNDS SPPR217 +CLERIC_ALICORN_LANCE SPPR218 +CLERIC_BEAST_CLAW SPPR219 +CLERIC_CAUSE_MODERATE_WOUNDS SPPR220 +CLERIC_PRAYER SPPR316 +CLERIC_CAUSE_DISEASE SPPR320 +CLERIC_EXALTATION SPPR321 +CLERIC_MOONBLADE SPPR322 +CLERIC_CIRCLE_OF_BONES SPPR323 +CLERIC_SPIKE_GROWTH SPPR324 +CLERIC_CLOUDBURST SPPR325 +CLERIC_MOLD_TOUCH SPPR326 +CLERIC_STORM_SHELL SPPR327 +CLERIC_CAUSE_MEDIUM_WOUNDS SPPR330 +CLERIC_FAVOR_OF_ILMATER SPPR331 +CLERIC_PRODUCE_FIRE SPPR419 +CLERIC_STATIC_CHARGE SPPR420 +CLERIC_RECITATION SPPR421 +CLERIC_BLOOD_RAGE SPPR422 +CLERIC_CLOUD_OF_PESTILENCE SPPR423 +CLERIC_UNFAILING_ENDURANCE SPPR424 +CLERIC_STAR_METAL_CUDGEL SPPR425 +CLERIC_SMASHING_WAVE SPPR426 +CLERIC_THORN_SPRAY SPPR427 +CLERIC_WALL_OF_MOONLIGHT SPPR428 +CLERIC_RIGHTEOUS_WRATH_OF_THE_FAITHFUL SPPR518 +CLERIC_SPIKE_STONES SPPR519 +CLERIC_SHIELD_OF_LATHANDER SPPR520 +CLERIC_UNDEAD_WARD SPPR521 +CLERIC_ANIMAL_RAGE SPPR522 +CLERIC_MASS_CAUSE_LIGHT_WOUNDS SPPR523 +CLERIC_ENTROPY_SHIELD SPPR615 +CLERIC_WHIRLWIND SPPR617 +CLERIC_SPIRITUAL_WRATH SPPR618 +CLERIC_SYMBOL_PAIN SPPR714 +CLERIC_SYMBOL_HOPELESSNESS SPPR716 +CLERIC_IMPERVIOUS_SANCTITY_OF_MIND SPPR733 +CLERIC_DESTRUCTION SPPR734 +CLERIC_GREATER_SHIELD_OF_LATHANDER SPPR735 +CLERIC_MIST_OF_ELDATH SPPR736 +CLERIC_STALKER SPPR737 +CLERIC_ENERGY_DRAIN SPPR739 +CLERIC_CAUSE_SERIOUS_WOUNDS_IWD SPPR414 +CLERIC_CAUSE_CRITICAL_WOUNDS_IWD SPPR510 +CLERIC_GIANT_INSECT SPPR418 +CLERIC_CHANT SPPR203 +CLERIC_WITHER SPPR740 +INNATE_BOMBARDIER_BEETLE_CLOUD SPIN191 diff --git a/iwdification/dw_iwdspells_resource/divine_smtable.txt b/iwdification/dw_iwdspells_resource/divine_smtable.txt new file mode 100644 index 0000000..9510d7a --- /dev/null +++ b/iwdification/dw_iwdspells_resource/divine_smtable.txt @@ -0,0 +1,18 @@ + +17 SShadow +3 MSUMMO4 +6 MSUMMO7 +5 MSUMMO6 +4 MSUMMO5 +0 MSUMMO1 +1 MSUMMO2 +2 MSUMMO3 +20 CEElemW +19 CFElemW +29 CAELEMW +21 CWElemW +26 SMONSTE +27 DSMONST +28 SHADES +47 SSHAMB +10 GINSECT diff --git a/iwdification/dw_iwdspells_resource/icon/statdesc.2da b/iwdification/dw_iwdspells_resource/icon/statdesc.2da new file mode 100644 index 0000000..e482644 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/icon/statdesc.2da @@ -0,0 +1,217 @@ +2DA V1.0 +-1 + DESCRIPTION BAM_FILE +0 37601 **** +1 37602 **** +2 37603 **** +3 37604 **** +4 37605 **** +5 37606 **** +6 37607 **** +7 35593 **** +8 37608 **** +9 37609 **** +10 37610 **** +11 37611 **** +12 37612 **** +13 35606 **** +14 37613 **** +15 37614 **** +16 37615 **** +17 37616 **** +18 37617 **** +19 37618 **** +20 37619 **** +21 37620 **** +22 37621 **** +23 37622 **** +24 37623 **** +25 37624 **** +26 37625 **** +27 37626 **** +28 37627 **** +29 37628 **** +30 37629 **** +31 37630 **** +32 37631 **** +33 37632 **** +34 37633 **** +35 37634 **** +36 35484 **** +37 35985 **** +38 37635 **** +39 37636 **** +40 37637 **** +41 37638 **** +42 37639 **** +43 37640 **** +44 37641 **** +45 37642 **** +46 37643 **** +47 37644 **** +48 37645 **** +49 37646 **** +50 37647 **** +51 37648 **** +52 37649 **** +53 37650 **** +54 37651 **** +55 35567 **** +56 37652 **** +57 37653 **** +58 37654 **** +59 37655 **** +60 37656 **** +61 37657 **** +62 37658 **** +63 37659 **** +64 37660 **** +65 37661 **** +66 37662 **** +67 37663 **** +68 37664 **** +69 37665 **** +70 37666 **** +71 37667 **** +72 37668 **** +73 36633 **** +74 37669 **** +75 37670 **** +76 37671 **** +77 37672 **** +78 36720 **** +79 37673 **** +80 37674 **** +81 37675 **** +82 37676 **** +83 37677 **** +84 37678 **** +85 37679 **** +86 37680 **** +87 37681 **** +88 37682 **** +89 37683 **** +90 37684 **** +91 37685 **** +92 37686 **** +93 37687 **** +94 37688 **** +95 37689 **** +96 37690 **** +97 37691 **** +98 37692 **** +99 36313 **** +100 36230 **** +101 37693 **** +102 37694 **** +103 36520 **** +104 37695 **** +105 37696 **** +106 36434 **** +107 37697 **** +108 37698 **** +109 37699 **** +110 37700 **** +111 37701 **** +112 35952 **** +113 36525 **** +114 36480 **** +115 36471 **** +116 35964 **** +117 36729 **** +118 36732 **** +119 36713 **** +120 36323 **** +121 36651 **** +122 36559 **** +123 37702 **** +124 37703 **** +125 36570 **** +126 37704 **** +127 36548 **** +128 36529 **** +129 37705 **** +130 37340 **** +131 37706 **** +132 36375 **** +133 36346 **** +134 36334 **** +135 36263 **** +136 36287 **** +137 37707 **** +138 35994 **** +139 36061 **** +140 36056 **** +141 37708 **** +142 36064 **** +143 36066 **** +144 37709 **** +145 36459 **** +146 36086 **** +147 36082 **** +148 36080 **** +149 36068 **** +150 36070 **** +151 40778 **** +152 36078 **** +153 36074 **** +154 36072 **** +155 36102 **** +156 36100 **** +157 36094 **** +158 36096 **** +159 36748 **** +160 36426 **** +161 36420 **** +162 36705 **** +163 36526 **** +164 36428 **** +165 36430 **** +166 14716 **** +167 14717 **** +168 14727 **** +169 14728 **** +170 14733 **** +171 38043 **** +172 24385 **** +173 24384 **** +174 24383 **** +175 14579 **** +176 24381 **** +177 26852 **** +178 26868 **** +179 26869 **** +180 26865 **** +181 26866 **** +182 26867 **** +183 14720 **** +184 14726 **** +185 19535 **** +186 14708 **** +187 14706 **** +188 -1 **** +189 40887 SPPR150D +190 40888 SPPR750D +191 40881 SPSH004D +192 36769 SPWM101D +193 40935 BOOT01D +194 36641 spwi510d +195 36642 spwi510d +196 36643 spwi510d +197 36644 spwi510d +198 36645 spwi510d +199 36646 spwi510d +200 36647 spwi510d +201 36648 spwi510d +202 25904 SPWI417D +203 1902 SPPR420D +204 2927 SPPR615D +205 21400 SPPR520D +206 21394 SPPR735D +207 1865 SPWI422D +208 1954 SPWI524D +209 2419 SPWI610D +210 36012 SPCL238D +211 36143 SPDM105D +212 21417 SPPR323D +213 35967 SPPR111D diff --git a/iwdification/dw_iwdspells_resource/icon/states.bam b/iwdification/dw_iwdspells_resource/icon/states.bam new file mode 100644 index 0000000..d9fa39d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/icon/states.bam differ diff --git a/iwdification/dw_iwdspells_resource/icon/states2.bam b/iwdification/dw_iwdspells_resource/icon/states2.bam new file mode 100644 index 0000000..dd6bdd8 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/icon/states2.bam differ diff --git a/iwdification/dw_iwdspells_resource/innate_bombardier_beetle_cloud/#eff_m47.wav b/iwdification/dw_iwdspells_resource/innate_bombardier_beetle_cloud/#eff_m47.wav new file mode 100644 index 0000000..f8cd27c Binary files /dev/null and b/iwdification/dw_iwdspells_resource/innate_bombardier_beetle_cloud/#eff_m47.wav differ diff --git a/iwdification/dw_iwdspells_resource/innate_bombardier_beetle_cloud/idpro282.pro b/iwdification/dw_iwdspells_resource/innate_bombardier_beetle_cloud/idpro282.pro new file mode 100644 index 0000000..d555f2e Binary files /dev/null and b/iwdification/dw_iwdspells_resource/innate_bombardier_beetle_cloud/idpro282.pro differ diff --git a/iwdification/dw_iwdspells_resource/innate_bombardier_beetle_cloud/sclouda.bam b/iwdification/dw_iwdspells_resource/innate_bombardier_beetle_cloud/sclouda.bam new file mode 100644 index 0000000..fffa71d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/innate_bombardier_beetle_cloud/sclouda.bam differ diff --git a/iwdification/dw_iwdspells_resource/innate_bombardier_beetle_cloud/scloudr.bam b/iwdification/dw_iwdspells_resource/innate_bombardier_beetle_cloud/scloudr.bam new file mode 100644 index 0000000..db9b344 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/innate_bombardier_beetle_cloud/scloudr.bam differ diff --git a/iwdification/dw_iwdspells_resource/innate_bombardier_beetle_cloud/spin191.spl b/iwdification/dw_iwdspells_resource/innate_bombardier_beetle_cloud/spin191.spl new file mode 100644 index 0000000..cc09cb0 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/innate_bombardier_beetle_cloud/spin191.spl differ diff --git a/iwdification/dw_iwdspells_resource/iwd_strref.txt b/iwdification/dw_iwdspells_resource/iwd_strref.txt new file mode 100644 index 0000000..69501fe --- /dev/null +++ b/iwdification/dw_iwdspells_resource/iwd_strref.txt @@ -0,0 +1,359 @@ +14706 359 +14708 358 +19535 357 +14726 356 +14720 355 +24381 354 +14579 353 +24383 352 +24384 351 +24385 350 +38043 349 +14733 348 +14728 347 +14727 346 +14717 345 +14716 344 +36430 343 +36428 342 +26262 341 +40011 340 +26867 339 +26429 338 +26263 337 +40010 336 +26866 335 +26264 334 +40009 333 +26865 332 +26265 331 +40008 330 +26869 329 +26266 328 +40007 327 +26868 326 +26268 325 +40006 324 +26852 323 +34527 322 +40835 321 +40834 320 +40833 319 +12217 318 +12090 317 +18617 316 +12 315 +768 314 +774 313 +771 312 +7912 311 +1901 310 +11194 309 +11193 308 +11185 307 +2624 306 +35497 305 +40832 304 +36741 303 +37709 302 +26538 301 +26539 300 +24913 299 +21621 298 +21474 297 +21396 296 +21476 295 +21394 294 +21477 293 +21393 292 +4742 291 +8101 290 +3071 289 +8100 288 +3070 287 +18628 286 +8099 285 +2938 284 +21473 283 +21397 282 +21472 281 +21398 280 +8056 279 +2927 278 +40831 277 +40830 276 +24251 275 +21402 274 +24247 273 +21401 272 +21475 271 +21400 270 +8040 269 +1412 268 +8020 267 +2812 266 +21462 265 +21410 264 +24253 263 +21409 262 +20438 261 +24252 260 +21407 259 +24301 258 +24300 257 +24254 256 +21406 255 +24248 254 +21405 253 +24250 252 +21404 251 +14043 250 +35473 249 +24810 248 +21403 247 +7916 246 +1914 245 +40255 244 +7914 243 +1902 242 +7913 241 +12064 240 +40772 239 +21415 238 +40254 237 +40253 236 +24255 235 +21422 234 +21458 233 +21420 232 +21459 231 +21419 230 +21460 229 +21418 228 +21467 227 +21417 226 +10224 225 +10223 224 +24256 223 +21416 222 +37613 221 +6621 220 +21414 219 +21478 218 +21413 217 +40257 216 +40256 215 +7910 214 +1417 213 +7533 212 +21424 211 +14465 210 +19610 209 +7560 208 +21423 207 +21646 206 +12139 205 +21421 204 +14022 203 +7896 202 +895 201 +37800 200 +21479 199 +21425 198 +25920 197 +21426 196 +14406 195 +7903 194 +757 193 +40329 192 +21443 191 +40327 190 +21446 189 +40328 188 +21444 187 +40326 186 +21447 185 +40324 184 +21449 183 +40325 182 +21448 181 +40323 180 +21450 179 +36022 178 +21466 177 +21429 176 +7576 175 +1416 174 +35592 173 +35591 172 +35600 171 +40195 170 +7554 169 +2814 168 +919 167 +2661 166 +7548 165 +2839 164 +35499 163 +7538 162 +2419 161 +30408 160 +832 159 +837 158 +7521 157 +2546 156 +77 155 +3010 154 +3008 153 +6515 152 +1866 151 +36035 150 +37638 149 +37787 148 +24243 147 +21441 146 +7850 145 +7849 144 +7832 143 +7831 142 +777 141 +783 140 +7536 139 +2693 138 +35046 137 +35045 136 +35782 135 +36674 134 +2874 133 +782 132 +24838 131 +15211 130 +2871 129 +784 128 +24842 127 +15180 126 +12158 125 +12038 124 +53 123 +34044 122 +12157 121 +12037 120 +15 119 +30783 118 +12156 117 +12035 116 +35461 115 +860 114 +840 113 +16170 112 +16158 111 +17366 110 +17365 109 +869 108 +850 107 +870 106 +851 105 +16358 104 +16159 103 +35441 102 +1206 101 +3020 100 +873 99 +854 98 +16359 97 +16160 96 +16165 95 +16156 94 +8777 93 +2320 92 +2332 91 +3081 90 +3080 89 +7518 88 +2647 87 +14444 86 +21608 85 +39752 84 +35593 83 +37607 82 +36317 81 +21471 80 +21428 79 +37340 78 +21470 77 +21427 76 +37801 75 +17392 74 +35544 73 +20568 72 +37606 71 +37604 70 +37603 69 +35606 68 +35542 67 +14102 66 +7585 65 +3072 64 +21469 63 +21430 62 +7578 61 +1208 60 +21464 59 +21433 58 +8766 57 +8765 56 +21461 55 +21432 54 +14443 53 +19339 52 +21465 51 +21431 50 +7552 49 +12130 48 +7516 47 +1954 46 +24245 45 +21438 44 +14073 43 +21468 42 +21437 41 +24246 40 +21435 39 +14980 38 +1280 37 +6502 36 +22173 35 +35484 34 +7512 33 +1863 32 +7514 31 +1864 30 +7510 29 +1848 28 +37605 27 +6513 26 +1865 25 +24812 24 +21439 23 +35568 22 +6399 21 +926 20 +14024 19 +24242 18 +21440 17 +10211 16 +12687 15 +6394 14 +11014 13 +0 12 +6393 11 +9999999 10 +12093 9 +21654 8 +21653 7 +21652 6 +21651 5 +21650 4 +21649 3 +21648 2 +19397 1 diff --git a/iwdification/dw_iwdspells_resource/seven_eyes_fortitude/spin112.spl b/iwdification/dw_iwdspells_resource/seven_eyes_fortitude/spin112.spl new file mode 100644 index 0000000..4a062d7 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/seven_eyes_fortitude/spin112.spl differ diff --git a/iwdification/bam/cdia725y.bam b/iwdification/dw_iwdspells_resource/seven_eyes_fortitude/spin112b.bam similarity index 100% rename from iwdification/bam/cdia725y.bam rename to iwdification/dw_iwdspells_resource/seven_eyes_fortitude/spin112b.bam diff --git a/iwdification/dw_iwdspells_resource/seven_eyes_mage/spin109.spl b/iwdification/dw_iwdspells_resource/seven_eyes_mage/spin109.spl new file mode 100644 index 0000000..7b3586d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/seven_eyes_mage/spin109.spl differ diff --git a/iwdification/bam/cdia725v.bam b/iwdification/dw_iwdspells_resource/seven_eyes_mage/spin109b.bam similarity index 100% rename from iwdification/bam/cdia725v.bam rename to iwdification/dw_iwdspells_resource/seven_eyes_mage/spin109b.bam diff --git a/iwdification/dw_iwdspells_resource/seven_eyes_mind/spin107.spl b/iwdification/dw_iwdspells_resource/seven_eyes_mind/spin107.spl new file mode 100644 index 0000000..6ff4141 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/seven_eyes_mind/spin107.spl differ diff --git a/iwdification/bam/cdia725t.bam b/iwdification/dw_iwdspells_resource/seven_eyes_mind/spin107b.bam similarity index 100% rename from iwdification/bam/cdia725t.bam rename to iwdification/dw_iwdspells_resource/seven_eyes_mind/spin107b.bam diff --git a/iwdification/dw_iwdspells_resource/seven_eyes_spirit/spin111.spl b/iwdification/dw_iwdspells_resource/seven_eyes_spirit/spin111.spl new file mode 100644 index 0000000..d1ab1e8 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/seven_eyes_spirit/spin111.spl differ diff --git a/iwdification/bam/cdia725x.bam b/iwdification/dw_iwdspells_resource/seven_eyes_spirit/spin111b.bam similarity index 100% rename from iwdification/bam/cdia725x.bam rename to iwdification/dw_iwdspells_resource/seven_eyes_spirit/spin111b.bam diff --git a/iwdification/dw_iwdspells_resource/seven_eyes_stone/spin113.spl b/iwdification/dw_iwdspells_resource/seven_eyes_stone/spin113.spl new file mode 100644 index 0000000..2b9a4c9 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/seven_eyes_stone/spin113.spl differ diff --git a/iwdification/bam/cdia725z.bam b/iwdification/dw_iwdspells_resource/seven_eyes_stone/spin113b.bam similarity index 100% rename from iwdification/bam/cdia725z.bam rename to iwdification/dw_iwdspells_resource/seven_eyes_stone/spin113b.bam diff --git a/iwdification/dw_iwdspells_resource/seven_eyes_sword/spin108.spl b/iwdification/dw_iwdspells_resource/seven_eyes_sword/spin108.spl new file mode 100644 index 0000000..18dd6eb Binary files /dev/null and b/iwdification/dw_iwdspells_resource/seven_eyes_sword/spin108.spl differ diff --git a/iwdification/bam/cdia725u.bam b/iwdification/dw_iwdspells_resource/seven_eyes_sword/spin108b.bam similarity index 100% rename from iwdification/bam/cdia725u.bam rename to iwdification/dw_iwdspells_resource/seven_eyes_sword/spin108b.bam diff --git a/iwdification/dw_iwdspells_resource/seven_eyes_venom/spin110.spl b/iwdification/dw_iwdspells_resource/seven_eyes_venom/spin110.spl new file mode 100644 index 0000000..9bb2378 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/seven_eyes_venom/spin110.spl differ diff --git a/iwdification/bam/cdia725w.bam b/iwdification/dw_iwdspells_resource/seven_eyes_venom/spin110b.bam similarity index 100% rename from iwdification/bam/cdia725w.bam rename to iwdification/dw_iwdspells_resource/seven_eyes_venom/spin110b.bam diff --git a/iwdification/dw_iwdspells_resource/spells_used.2da b/iwdification/dw_iwdspells_resource/spells_used.2da new file mode 100644 index 0000000..9c7159a --- /dev/null +++ b/iwdification/dw_iwdspells_resource/spells_used.2da @@ -0,0 +1,61 @@ + resref spellname parent parent_ext + +SPIN115 INNATE_MOURNFUL_WAIL WIZARD_EMOTION_HOPE SPL +SPPR716 CLERIC_SYMBOL_HOPELESSNESS WIZARD_EMOTION_HOPE SPL +SPWI904 WIZARD_MALAVONS_CORROSIVE_FOG WIZARD_IRON_BODY SPL +SPWI035 TRAP_FLESH_TO_STONE WIZARD_IRON_BODY SPL +SPIN143 INNATE_BEHOLDER_FLESH_TO_STONE WIZARD_IRON_BODY SPL +SPWI030 TRAP_DEATH_FOG WIZARD_IRON_BODY SPL +SPPR736 CLERIC_MIST_OF_ELDATH WIZARD_IRON_BODY SPL +SPPR424 CLERIC_UNFAILING_ENDURANCE WIZARD_IRON_BODY SPL +SPPR423 CLERIC_CLOUD_OF_PESTILENCE WIZARD_IRON_BODY SPL +SPPR326 CLERIC_MOLD_TOUCH WIZARD_IRON_BODY SPL +SPIN107 SEVEN_EYES_MIND WIZARD_SEVEN_EYES SPL +SPIN108 SEVEN_EYES_SWORD WIZARD_SEVEN_EYES SPL +SPIN109 SEVEN_EYES_MAGE WIZARD_SEVEN_EYES SPL +SPIN110 SEVEN_EYES_VENOM WIZARD_SEVEN_EYES SPL +SPIN111 SEVEN_EYES_SPIRIT WIZARD_SEVEN_EYES SPL +SPIN112 SEVEN_EYES_FORTITUDE WIZARD_SEVEN_EYES SPL +SPIN113 SEVEN_EYES_STONE WIZARD_SEVEN_EYES SPL +SPPR112 CLERIC_CURSE CLERIC_CURSE SPL +SPPR114 CLERIC_CAUSE_LIGHT_WOUNDS CLERIC_CAUSE_LIGHT_WOUNDS SPL +SPPR217 CLERIC_CURE_MODERATE_WOUNDS CLERIC_CURE_MODERATE_WOUNDS SPL +SPPR218 CLERIC_ALICORN_LANCE CLERIC_ALICORN_LANCE SPL +SPPR220 CLERIC_CAUSE_MODERATE_WOUNDS CLERIC_CAUSE_MODERATE_WOUNDS SPL +SPPR320 CLERIC_CAUSE_DISEASE CLERIC_CAUSE_DISEASE SPL +SPPR321 CLERIC_EXALTATION CLERIC_EXALTATION SPL +SPPR422 CLERIC_BLOOD_RAGE CLERIC_EXALTATION SPL +SPPR323 CLERIC_CIRCLE_OF_BONES CLERIC_CIRCLE_OF_BONES SPL +SPPR324 CLERIC_SPIKE_GROWTH CLERIC_SPIKE_GROWTH SPL +SPPR325 CLERIC_CLOUDBURST CLERIC_CLOUDBURST SPL +SPIN193 INNATE_SALAMANDER_AURA_FROST CLERIC_CLOUDBURST SPL +SPIN194 INNATE_SALAMANDER_AURA_FIRE CLERIC_CLOUDBURST SPL +SPIN187 INNATE_SALAMANDER_AURA_SHIKATA CLERIC_CLOUDBURST SPL +SPIN128 INNATE_FROST_AURA CLERIC_CLOUDBURST SPL +SPPR326 CLERIC_MOLD_TOUCH CLERIC_MOLD_TOUCH SPL +SPPR330 CLERIC_CAUSE_MEDIUM_WOUNDS CLERIC_CAUSE_MEDIUM_WOUNDS SPL +SPPR331 CLERIC_FAVOR_OF_ILMATER CLERIC_FAVOR_OF_ILMATER SPL +SPPR419 CLERIC_PRODUCE_FIRE CLERIC_PRODUCE_FIRE SPL +SPPR420 CLERIC_STATIC_CHARGE CLERIC_STATIC_CHARGE SPL +SPPR422 CLERIC_BLOOD_RAGE CLERIC_BLOOD_RAGE SPL +SPPR714 CLERIC_SYMBOL_PAIN CLERIC_BLOOD_RAGE SPL +SPPR716 CLERIC_SYMBOL_HOPELESSNESS CLERIC_BLOOD_RAGE SPL +SPPR423 CLERIC_CLOUD_OF_PESTILENCE CLERIC_CLOUD_OF_PESTILENCE SPL +SPPR426 CLERIC_SMASHING_WAVE CLERIC_SMASHING_WAVE SPL +SPPR427 CLERIC_THORN_SPRAY CLERIC_THORN_SPRAY SPL +SPPR519 CLERIC_SPIKE_STONES CLERIC_SPIKE_STONES SPL +SPPR520 CLERIC_SHIELD_OF_LATHANDER CLERIC_SHIELD_OF_LATHANDER SPL +SPPR521 CLERIC_UNDEAD_WARD CLERIC_UNDEAD_WARD SPL +SPPR522 CLERIC_ANIMAL_RAGE CLERIC_ANIMAL_RAGE SPL +SPPR523 CLERIC_MASS_CAUSE_LIGHT_WOUNDS CLERIC_MASS_CAUSE_LIGHT_WOUNDS SPL +SPPR615 CLERIC_ENTROPY_SHIELD CLERIC_ENTROPY_SHIELD SPL +SPWI033 TRAP_MAGIC_MISSILE_5 CLERIC_ENTROPY_SHIELD SPL +SPPR617 CLERIC_WHIRLWIND CLERIC_WHIRLWIND SPL +SPPR618 CLERIC_SPIRITUAL_WRATH CLERIC_SPIRITUAL_WRATH SPL +SPPR714 CLERIC_SYMBOL_PAIN CLERIC_SYMBOL_PAIN SPL +SPPR716 CLERIC_SYMBOL_HOPELESSNESS CLERIC_SYMBOL_HOPELESSNESS SPL +SPPR716 CLERIC_SYMBOL_HOPELESSNESS CLERIC_IMPERVIOUS_SANCTITY_OF_MIND SPL +SPPR734 CLERIC_DESTRUCTION CLERIC_DESTRUCTION SPL +SPPR735 CLERIC_GREATER_SHIELD_OF_LATHANDER CLERIC_GREATER_SHIELD_OF_LATHANDER SPL +SPIN191 INNATE_BOMBARDIER_BEETLE_CLOUD fartrng ITM +SPPR740 CLERIC_WITHER CLERIC_WITHER SPL diff --git a/iwdification/dw_iwdspells_resource/tra/cs_cz/iwdspells.tra b/iwdification/dw_iwdspells_resource/tra/cs_cz/iwdspells.tra new file mode 100644 index 0000000..642538f --- /dev/null +++ b/iwdification/dw_iwdspells_resource/tra/cs_cz/iwdspells.tra @@ -0,0 +1,1151 @@ +%atsymbol%359=~Odvaha~ +%atsymbol%358=~NadÄ›je.~ +%atsymbol%357=~KoÄiÄí mrÅ¡tnost~ +%atsymbol%356=~Spravedlivý hnÄ›v věřícího~ +%atsymbol%355=~Modlitba~ +%atsymbol%354=~KrvelaÄná zuÅ™ivost~ +%atsymbol%353=~Recitace~ +%atsymbol%352=~Euforie~ +%atsymbol%351=~Zvířecí bÄ›s~ +%atsymbol%350=~Ocelové tÄ›lo~ +%atsymbol%349=~ZkamenÄ›lý~ +%atsymbol%348=~Nepropustná svátost mysli~ +%atsymbol%347=~Bolest~ +%atsymbol%346=~DoÄasné zmizení~ +%atsymbol%345=~Pomoc~ +%atsymbol%344=~VyÄiÅ¡tÄ›ní mysli~ +%atsymbol%343=~PÅ™emÄ›na v elementála (ZemÄ›) ~ +%atsymbol%342=~PÅ™emÄ›na v elementála (Oheň)~ +%atsymbol%341=~Sithův váleÄný zpÄ›v - bonusy k brnÄ›ní a regenerace~ +%atsymbol%340=~“VáleÄná píseň Sithů.†+VÅ¡ichni spojenci do 9 metrů od barda obdrží: +2 k obrannému Äíslu, +10% k odolnosti vůÄi seÄným, bodným a drtivým útokům, stejnÄ› jako stÅ™elám. Navíc získají regeneraci 2 životy za kolo.~ +%atsymbol%339=~Sithův váleÄný zpÄ›v~ +%atsymbol%338=~OÄarován~ +%atsymbol%337=~Touha Sirény - okouzluje tvory~ +%atsymbol%336=~“Volání Sirény†+VÅ¡ichni nepřátelé do 9 metrů od barda musí uspÄ›t v záchranÄ› proti kouzlu, jinak budou okouzleni a nebudou schopni žádné akce, dokud neuplyne 1 kolo, nebo na nÄ› nÄ›kdo nezaútoÄí.~ +%atsymbol%335=~Sirénina touha~ +%atsymbol%334=~ZpÄ›v Kaudies - odolnost vůÄi zvukovým útokům~ +%atsymbol%333=~“Kaudiesova píseň.†+VÅ¡ichni spojenci do 9 metrů od barda omají 50% Å¡anci zbavit se úÄinků kouzel jako je ticho, výkÅ™ik, mocný výkÅ™ik, příkaz, mocnÄ›jší příkaz a dalších kouzel, které jsou založeny na zvuku.~ +%atsymbol%332=~ZpÄ›v Kaudies~ +%atsymbol%331=~TymoÅ™ina melodie - bonusy ke Å¡tÄ›stí a dovednostem~ +%atsymbol%330=~“TymoÅ™ina melodie.†+VÅ¡ichni spojenci do 9 metrů od barda obdrží: +1 ke Å¡tÄ›stí, +3 k záchraným hodům, +10 ke znalostem a +10 ke vÅ¡em jejich zlodÄ›jským schopnostem.~ +%atsymbol%329=~TymoÅ™ina melodie~ +%atsymbol%328=~PříbÄ›h Currana Silného srdce - imunita: strach~ +%atsymbol%327=~“PříbÄ›h Currana Stronghearta.†+VÅ¡ichni spojenci do 9 metrů od barda jsou zbaveni strachu a obdrží imunitu na strach po dobu, dokud bard zpívá píseň.~ +%atsymbol%326=~PříbÄ›h Currana Silného srdce~ +%atsymbol%325=~Balada o tÅ™ech hrdinech - bojové bonusy~ +%atsymbol%324=~“Balada o tÅ™ech hrdinech.†+VÅ¡ichni spojenci do 9 metrů od barda obdrží: +1 k Å¡anci na zásah, +1 ke zranÄ›ní a +1 ke vÅ¡em jejich záchraným hodům.~ +%atsymbol%323=~Balada o tÅ™ech hrdinech~ +%atsymbol%322=~VypouÅ¡tí kyselou páru~ +%atsymbol%321=~Withering~ +%atsymbol%320=~Wither +(Necromancy) +Level: 7 +Sphere: Healing +Range: Touch +Duration: 1 round/2 levels +Casting Time: 7 +Area of Effect: 1 creature +Saving Throw: Neg. +This powerful spell causes the organs of the touched creature to cease functioning and wither away unless a Save vs. Death at a penalty of -4 is made. The creature affected will lose 3 Hit Points per second. The effect lasts for 1 round per 2 levels of the caster or until dispelled. For example, a 14th-level priest would cause the targeted creature to lose 18 Hit Points per round for 7 rounds. This spell has no effect on undead, constructs, or extraplanar creatures. It can only be cast by evil-aligned characters.~ +%atsymbol%319=~Wither~ +%atsymbol%318=~Liturgický zpÄ›v +(Vyvolávání) +Úroveň: 2 +Sféra: boj +Dosah: dohled sesilatele +Trvání: 1 tah +Doba kouzlení: 1 kolo +Rozsah: okruh 9 metrů +Hod na záchranu: žádný +ProstÅ™ednictvím tohoto zaříkání pÅ™ivolá knÄ›z na sebe a svou družinu zvláštní přízeň a ohrozí své nepřátele. Když svůj zpÄ›v dokonÄí, vÅ¡ichni spojenci v oblasti úÄinku získají +1 na útok, zranÄ›ní a hody na záchranu, zatímco nepřátelé budou postiženi -1 na útok, zranÄ›ní a záchranu. Dále jsou vÅ¡echny nepřátelské hody kostkou (mimo základní zranÄ›ní zbranÄ›) sníženy o 1. Například ohnivá koule 6k6 udÄ›lí zranÄ›ní pouze 6k5 a ohnivý dlouhý meÄ zraňující za 1k8+2 (seÄné) a 1k3 (ohnivé) zraní pouze za 1k8+2 (seÄné) a 1k2 (ohnivé). +Více zpÄ›vů se nesÄítá. Toto kouzlo vyžaduje pÅ™iměřené soustÅ™edÄ›ní, takže sesilatel nemůže po dobu jeho trvání Äarovat a jeho pohyb se zpomalí na poloviÄní rychlost.~ +%atsymbol%317=~Liturgický zpÄ›v~ +%atsymbol%316=~Fart Repellent for Bombardier Beetles. +Do not translate~ +%atsymbol%315=~Obrovský Å¡váb~ +%atsymbol%314=~Obrovský Å¡váb~ +%atsymbol%313=~Brouk smraÄoch~ +%atsymbol%312=~Brouk smraÄoch~ +%atsymbol%311=~Obrovský hmyz (promÄ›na) +Úroveň: 4 +Sféra: zvířata +Dosah: dohled sesilatele +Trvání: 8 hodin +Doba kouzlení: 7 +Rozsah: 1-6 zástupců hmyzu +Hod na záchranu: žádný +Tímto zaklínadlem si knÄ›z pÅ™ivolá malou havěť, kterou pak zvÄ›tší do obrovských rozmÄ›rů a promÄ›ní ji na hrůzostraÅ¡né spojence. Síla a druh hmyzu se liší podle pokroÄilosti uživatele; Äím vyšší je jeho úroveň, tím silnÄ›jší bude i sesílaný hmyz.~ +%atsymbol%310=~Obrovský hmyz~ +%atsymbol%309=~Kritická zranÄ›ní (nekromancie) +Úroveň: 5 +Sféra: léÄba +Dosah: dotyk +Trvání: okamžité +Doba kouzlení: 8 +Rozsah: 1 bytost +Hod na záchranu: poloviÄní újma +Toto kouzlo je opakem léÄby kritických zranÄ›ní - namísto uzdravení dotyÄná bytost ztratí pÅ™i úspěšném dotyku 27 životů (pÅ™i úspěšném záchranném hodu polovic). Toto kouzlo neúÄinkuje na bytosti nemrtvé, vyrobené nebo tvory z jiných dimenzí. Kritická zranÄ›ní mohou působit pouze zlé postavy.~ +%atsymbol%308=~Kritická zranÄ›ní~ +%atsymbol%307=~Těžká zranÄ›ní (nekromancie) +Úroveň: 4 +Sféra: léÄba +Dosah: dotyk +Trvání: okamžité +Doba kouzlení: 5 +Rozsah: 1 bytost +Hod na záchranu: poloviÄní újma +Toto kouzlo je opakem léÄby těžkých zranÄ›ní - namísto vyhojení ztratí dotyÄná bytost pÅ™i úspěšném dotyku 17 životů (pÅ™i úspěšném záchranném hodu polovic). Toto kouzlo neúÄinkuje na bytosti nemrtvé, vyrobené nebo tvory z jiných dimenzí. Těžká zranÄ›ní nemohou působit postavy s dobrým pÅ™esvÄ›dÄením.~ +%atsymbol%306=~Těžká zranÄ›ní~ +%atsymbol%305=~Vysáty dvÄ› úrovnÄ›~ +%atsymbol%304=~Vysátí energie +(Nekromancie) +Úroveň: 9 +Dosah: dotyk +Trvání: trvale +Doba sesílání: 3 +Oblast působení: cílová bytost +Záchranný hod: žádný +ÄŒarodÄ›j tímto kouzlem otevÅ™e spojení mezi svou sférou a sférou negativní energie. Toto spojení vysaje životní sílu obÄ›ti a pÅ™enese ji do sféry negativní energie. ObÄ›ti jsou vysáty 2 úrovnÄ› zkuÅ¡eností. Cíl kouzla ztratí natrvalo úrovnÄ›, životy, životaschopnost a schopnosti. Tyto úrovnÄ› lze navrátit pouze kněžským kouzlem Slabší/SilnÄ›jší obnova. Nepůsobí na nemrtvé, stroje nebo mimosférické bytosti. Kouzlo může seslat pouze zlá postava.~ +%atsymbol%303=~Vysátí energie~ +%atsymbol%302=~Zapleten~ +%atsymbol%301=~Belhavá hromada~ +%atsymbol%300=~Belhavá hromada~ +%atsymbol%299=~StopaÅ™ (vyvolávání) +Úroveň: 7 +Sféra: rostliny +Dosah: dohled sesilatele +Trvání: 8 hodin +Doba kouzlení: 1 kolo +Rozsah: zvláštní +Hod na záchranu: žádný +Toto kouzlo stvoří dva kulhavce. Tyto bytosti pomáhají svému sesilateli v boji, mohou vÅ¡ak plnit i jiné svěřené úkoly, pro jejichž splnÄ›ní mají dostateÄné schopnosti.~ +%atsymbol%298=~StopaÅ™~ +%atsymbol%297=~Závoj Eldath +(Vzývání) +Úroveň: 7 +Sféra: živly +Dosah: dohled sesilatele +Trvání: 1 kolo +Doba kouzlení: 1 kolo +Rozsah: okruh 3 metry +Hod na záchranu: žádný +Toto kouzlo pÅ™ikryje zvolenou oblast stříbÅ™itÄ› modrou mlhou - každý, kdo se v této mlze octne, bude zbaven veÅ¡keré nákazy i otravy a vyléÄí si 25 životů.~ +%atsymbol%296=~Závoj Eldath~ +%atsymbol%295=~VÄ›tší Lathanderův Å¡tít (vyvolávání) +Úroveň: 7 +Sféra: obranná +Dosah: dotyk +Trvání: 3 kola +Doba kouzlení: 1 kolo +Rozsah: 1 bytost +Hod na záchranu: žádný +Toto kouzlo po urÄenou dobu Äiní dotyÄného imunním jak na zranÄ›ní, tak i na magii. Zlé bytosti vÅ¡ak tímto způsobem chránÄ›ny být nemohou. Lathanderův Å¡tít mohou seslat pouze postavy s dobrým pÅ™esvÄ›dÄením.~ +%atsymbol%294=~VÄ›tší Lathanderův Å¡tít~ +%atsymbol%293=~Zkáza (nekromancie) +Úroveň: 7 +Sféra: uzdravení +Dosah: dotyk +Trvání: okamžité +Doba kouzlení: 1 kolo +Rozsah: sesilatel +Hod na záchranu: zvláštní +Toto kouzlo cíl okamžitÄ› rozstÅ™elí na malé kousky. Oběť si může hodit na záchranu proti smrti s penalizací -4. Pokud se jí vrh zdaří, namísto zniÄení utrpí zranÄ›ní ve výši 8k6. Zkázu mohou sesílat pouze zlé postavy. Postava zniÄená tímto způsobem nemůže být nijak vzkříšena z mrtvých - ani kouzlem 'oživení mrtvého', ani 'vzkříšením'.~ +%atsymbol%292=~Zkáza~ +%atsymbol%291=~Kouzlo nepůsobí~ +%atsymbol%290=~Nepropustná svátost mysli (ochrana) +Úroveň: 7 +Sféra: ochrana +Dosah: sesilatel +Trvání: 1 tah/úroveň +Doba kouzlení: 1 kolo +Rozsah: sesilatel +Hod na záchranu: žádný +Po vyÅ™Äení magického zaklínadla se knÄ›zova mysl zatvrdí proti jakémukoliv vnÄ›jšímu vlivu. Dokud působí, selhávají vÅ¡echny psionické útoky a kouzla zmámení, příkaz, nadvláda, strach, slabomyslnost, znehybnÄ›ní a spánek, která na nÄ›j směřují.~ +%atsymbol%289=~Nepropustná svátost mysli~ +%atsymbol%288=~Symbol zoufalství +(Vyvolávání) +Úroveň: 7 +Sféra: ochranná +Dosah: dohled sesilatele +Trvání: 2 tahy +Doba kouzlení: 3 +Rozsah: okruh 18 metrů +Hod na záchranu: zruší kouzlo +VÅ¡echna stvoÅ™ení do 18 metrů od tohoto symbolu v okamžiku jeho seslání si musí hodit na záchranu pÅ™ed kouzlem s postihem -2. Pokud se jim vrh nezdaří, zůstanou na místÄ› a propadnou sklíÄenosti a beznadÄ›ji. PÅ™i útoku neprovedou žádný obranný pohyb.~ +%atsymbol%287=~Symbol zoufalství~ +%atsymbol%286=~Zkázné bolesti~ +%atsymbol%285=~Symbol, Bolest +(Vyvolávání) +Úroveň: 7 +Sféra: ochranná +Dosah: dohled sesilatele +Trvání: 11 tahů +Doba kouzlení: 3 +Rozsah: okruh 18 metrů +Hod na záchranu: zruší kouzlo +VÅ¡echna stvoÅ™ení do 18 metrů od tohoto symbolu v okamžiku jeho seslání si musí hodit na záchranu pÅ™ed kouzlem. Pokud se jim vrh nezdaří, utrpí postih -4 na hod na útok, -2 na obratnost a 2 na obranné Äíslo.~ +%atsymbol%284=~Symbol bolesti~ +%atsymbol%283=~Duchovní hnÄ›v (vzývání) +Úroveň: 6 +Sféra: boj +Dosah: dohled sesilatele +Trvání: okamžité +Doba kouzlení: 2 +Rozsah: zvláštní +Hod na záchranu: poloviÄní újma +Po dokonÄení zaklínadla soustÅ™edí knÄ›z duchovní energii, kterou pak může vyslat do ÄtyÅ™ stran jako blesky. Sesilatel urÄí smÄ›r jednoho z nich a ostatní blesky vyÅ¡lehnou naproti a kolmo na prvotní smÄ›r a vytvoří tak vzor ve tvaru kříže. Každý, kdo se jim pÅ™iplete do cesty, utrpí magická zranÄ›ní ve výši 6-42, pÅ™i úspěšné záchranÄ› proti kouzlu polovic. Na bytosti s morálním pÅ™esvÄ›dÄením stejným jako uživatel (dobro, neutrální, zlo) ale nebude mít toto kouzlo žádný vliv.~ +%atsymbol%282=~Duchovní hnÄ›v~ +%atsymbol%281=~SmrÅ¡Å¥ (vzývání) +Úroveň: 6 +Sféra: vzývání +Dosah: dohled sesilatele +Trvání: zvláštní +Doba kouzlení: 9 +Rozsah: zvláštní +Hod na záchranu: zvláštní +Tímto kouzlem stvoří knÄ›z malý cyklón, který může vyslat na jakékoliv místo v dohledu. Jakmile smrÅ¡Å¥ dorazí k cíli, uživatel nad ní ztratí kontrolu a živel bude náhodnÄ› poletovat po okolí a ubližovat jak nepřátelům, tak i spojencům. Sesilatel je imunní na své vlastní kouzlo a elementálové Äi jiné obrovské bytosti jím také nebudou postiženi. Jinak každý, kdo bude tornádem smeten, utrpí drtivá zranÄ›ní ve výši 2k8, seÄná zranÄ›ní 2k8 a musí uspÄ›t v záchranném hodu proti dechu, aby nebyl na 2 kola omráÄen. Tvorové s hodem na životy 2 a ménÄ› budou automaticky zabiti. SmrÅ¡Å¥ může zasáhnout maximálnÄ› 8 cílů a poté se rozptýlí.~ +%atsymbol%280=~SmrÅ¡Å¥~ +%atsymbol%279=~Vířivý Å¡tít (ochrana) +Úroveň: 6 +Sféra: ochrana +Dosah: sesilatel +Trvání: 1 kolo/úroveň +Doba kouzlení: 9 +Rozsah: sesilatel +Hod na záchranu: žádný +Po vyslovení této magické formule obklopí knÄ›ze energetický vír, který ho ochraňuje a zabraňuje mnohým napadením. To mu dává bonus +6 k obranÄ› a 50% odolnost vůÄi mnoha útokům vÄ›tÅ¡iny forem: elektrickým, ohnivým, mrazivým atd. Poskytuje také bonus +2 k hodům na záchranu a imunitu vůÄi vÅ¡em stÅ™elným útokům.~ +%atsymbol%278=~Vířivý Å¡tít~ +%atsymbol%277=~Hromadné léÄení +(Nekromancie) +Úroveň: 5 +Sféra: LéÄení +Dosah: dohled sesilatele +Trvání: trvale +Doba sesílání: 5 +Oblast působení: polomÄ›r 9 m +Záchranný hod: žádný +PÅ™i sesílání kouzla si musí knÄ›z jasnÄ› pÅ™edstavit tváře spolubojovníků a soustÅ™edit se na jednotu skupiny. VÅ¡em Älenům družiny v okruhu 9 m od sesilatele se vyléÄí 1k8 + 1/úroveň životů. VyléÄení je trvalé; tedy až do dalšího zranÄ›ní.~ +%atsymbol%276=~Hromadné způsobení lehkých zranÄ›ní~ +%atsymbol%275=~Zvířecí bÄ›s (zaříkávání) +Úroveň: 5 +Sféra: boj +Dosah: dotyk +Trvání: 15 kol +Doba kouzlení: 8 +Rozsah: 1 bytost +Hod na záchranu: žádný +Toto kouzlo obdaří dotyÄného zvířecí dravostí, dávajíc mu sílu 19, +20 životů, +20% k pohyblivosti a +2 ke vÅ¡em hodům na záchranu. AvÅ¡ak dokud je pod vlivem kouzla, ztrácí cíl schopnost Äarovat. Daná postava může být normálnÄ› ovládána, dokud se v dohledu neobjeví nepřátelé. V tom okamžiku se zuÅ™ivec neprodlenÄ› vrhne na protivníka a zaÄne do nÄ›j sekat vším, co zrovna drží v ruce. V každém kole vzniká 5% Å¡ance, že dotyÄný propadne bojovému šílenství a zaÄne útoÄit jak na soupeÅ™e, tak i na své spojence.~ +%atsymbol%274=~Zvířecí bÄ›s~ +%atsymbol%273=~Odrážení nemrtvých +(Nekromancie) +Úroveň: 5 +Sféra: odrážení +Dosah: sesilatel +Trvání: 1 tah +Doba kouzlení: 7 +Rozsah: okruh 6 metrů +Hod na záchranu: žádný +Toto kouzlo posílí knÄ›zovu moc, kterou vládne nad nemrtvými, i když je v tomto případÄ› svázán s okruhem, kde se právÄ› nachází, a nemůže se pohybovat. Jakýkoliv nemrtvý tvor, který do dané oblasti vstoupí, se obrátí na stranu knÄ›ze, jenž kouzlo seslal. Pokud se toto obrácení nezdaří, nemrtvý bude imunní vůÄi dalším pokusům, dokud neopustí a znovu nevkroÄí do dané oblasti.~ +%atsymbol%272=~Odrážení nemrtvých~ +%atsymbol%271=~Lathanderův Å¡tít (vyvolávání) +Úroveň: 5 +Sféra: obranná +Dosah: dotyk +Trvání: 3 kola +Doba kouzlení: 8 +Rozsah: 1 bytost +Hod na záchranu: žádný +Toto kouzlo po urÄenou dobu Äiní dotyÄného imunním na zranÄ›ní. Zlé bytosti vÅ¡ak tímto způsobem chránÄ›ny být nemohou. Lathanderův Å¡tít mohou seslat pouze ti, kteří nejsou zlí.~ +%atsymbol%270=~Lathanderův Å¡tít~ +%atsymbol%269=~Bodavé kameny +(PromÄ›na, Zaříkávání) +Úroveň: 5 +Sféra: živly (zemÄ›) +Dosah: dohled sesilatele +Trvání: 12 kol +Doba kouzlení: 6 +Rozsah: okruh 4,5 metru +Hod na záchranu: žádný +Toto kouzlo pÅ™etvoří okolní kameny, Äímž zmÄ›ní tvar terénu na ostré bodáky, které uplývají do ztracena. Každý, kdo vstoupí do kritické oblasti, utrpí v každém kole bodná zranÄ›ní ve výši 2k4 a musí uspÄ›t v záchranném hodu vůÄi kouzlu, jinak bude jeho pohyb o 30% zpomalen.~ +%atsymbol%268=~Bodavé kameny~ +%atsymbol%267=~Spravedlivý hnÄ›v věřícího +(Zaříkávání/OÄarování) +Úroveň: 5 +Sféra: boj +Dosah: sesilatel +Trvání: 1 kolo/úroveň +Doba kouzlení: 8 +Rozsah: okruh 9 metrů +Hod na záchranu: žádný +Toto kouzlo propůjÄí knÄ›zovým spojencům boží hnÄ›v, Äímž zlepší jejich bojové schopnosti. VÅ¡ichni přátelé v dané oblasti získávají po urÄenou dobu +1 k hodu na útok a na záchranu plus 1-8 bonusových životů (tyto body mohou pÅ™ekroÄit maximum životů cíle). VÅ¡echny bytosti stejného pÅ™esvÄ›dÄení získají v každém kole jeÅ¡tÄ› o útok navíc a +2 k hodům na útok, zranÄ›ní a záchranu.~ +%atsymbol%266=~Spravedlivý hnÄ›v věřícího~ +%atsymbol%265=~StÄ›na z mÄ›síÄního svÄ›tla +(Vzývání) +Úroveň: 4 +Sféra: ochrana, slunce +Dosah: dohled sesilatele +Trvání: 1 tah +Doba kouzlení: 7 +Rozsah: zeÄ 6 metrů dlouhá, 1,5 metru Å¡iroká +Hod na záchranu: žádný +Toto kouzlo vyvolá mihotavý závoj modravÄ› bílé síly. Tato stÄ›na je nadpozemská, nepodléhá žádným hmotným omezením a lze jí snadno projít. Zlí tvorové, kteří skrz ní proniknou, utrpí zranÄ›ní ve výši 2k10 životů, zlé nemrtvé bytosti pak 5k10. Každý může být pÅ™i průchodu zdí zranÄ›n pouze jedinkrát. Vyvolána smí být vždy pouze jediná 'stÄ›na z mÄ›síÄního svÄ›tla'.~ +%atsymbol%264=~StÄ›na z mÄ›síÄního svÄ›tla~ +%atsymbol%263=~Trnová sprÅ¡ka +(PromÄ›ny) +Úroveň: 4 +Sféra: rostliny +Dosah: zvláštní +Trvání: okamžité +Doba kouzlení: 3 +Rozsah: kužel 9 m dlouhý, 7,5 m Å¡iroký +Hod na záchranu: poloviÄní újma +Jak už název napovídá, vyvolá toto kouzlo sprÅ¡ku ostnů, hrotů, trnů, pichláků a bodlin, které vytrysknou přímo s uživatelovy ruky. SprÅ¡ku tvoří 9 metrů dlouhý a 7,5 metru Å¡iroký kužel, který způsobí bodná zranÄ›ní za 2k10 životů každému, kdo se v kritické oblasti nachází. Pokud se obÄ›ti zdaří hod na záchranu proti smrti, budou její zranÄ›ní poloviÄní, Äili 1k10.~ +%atsymbol%262=~Trnová sprÅ¡ka~ +%atsymbol%261=~V bezvÄ›domí.~ +%atsymbol%260=~Tříštivá vlna (vzývání) +Úroveň: 4 +Sféra: živly (voda) +Dosah: 40 stop +Trvání: okamžité +Doba kouzlení: 1 kolo +Rozsah: 1,5 metru Å¡iroká vlna +Hod na záchranu: poloviÄní újma +Toto kouzlo vyvolá vodní vlnu, která se bude pohybovat ve smÄ›ru daném uživatelem a strhne s sebou každého, kdo jí bude stát v cestÄ›. Způsobí drtivé zranÄ›ní ve výši 4k10, k Äemuž je jeÅ¡tÄ› 20% pravdÄ›podobnost, že bude dotyÄný tvor na 2 kola omráÄen, a 5% Å¡ance, že oběť upadne do bezvÄ›domí. Jestliže se zasaženému zdaří hod na záchranu proti dechu, budou jeho zranÄ›ní snížena na polovinu a vyhne se jak mdlobám, tak i bezvÄ›domí.~ +%atsymbol%259=~Tříštivá vlna~ +%atsymbol%258=~Palice z hvÄ›zdného kovu~ +%atsymbol%257=~Palice z hvÄ›zdného kovu~ +%atsymbol%256=~Palice z hvÄ›zdného kovu (vyvolávání) +Úroveň: 4 +Sféra: boj +Dosah: sesilatel +Trvání: 3 tahy +Doba kouzlení: 7 +Rozsah: sesilatel +Hod na záchranu: žádný +Toto kouzlo stvoří magický kyj z meteorického železa, který má bonus +2 k zásahu a zranÄ›ní a pÅ™i urÄování, na koho bude mít vliv, se chová se jako zbraň +4. Berou se v potaz též bonusy za sílu, odbornost i specializaci, stejnÄ› jako penalizace. NepÅ™irozeným bytostem (nemrtvým, elementálům, golemům, tvorům z jiných dimenzí apod.) způsobí další drtivé zranÄ›ní ve výši 2k6 životů.~ +%atsymbol%255=~Palice z hvÄ›zdného kovu~ +%atsymbol%254=~Neutuchající odolnost (nekromancie) +Úroveň: 4 +Sféra: nekromantská +Dosah: dotyk +Trvání: okamžité +Doba kouzlení: 1 kolo +Rozsah: 1 bytost +Hod na záchranu: žádný +Toto kouzlo navrátí dotyÄné bytosti životní sílu, kterou za den ztratila, jako by vynaložila jen poloviÄní námahu. Únavu vÅ¡ak odstranit nedokáže.~ +%atsymbol%253=~Neutuchající odolnost~ +%atsymbol%252=~Morové mraÄno +(PromÄ›ny) +Úroveň: 4 +Sféra: boj, živly (vzduch) +Dosah: dohled sesilatele +Trvání: 4 kola +Doba kouzlení: 7 +Rozsah: okruh 6 metrů +Hod na záchranu: zruší kouzlo +Toto kouzlo promÄ›ní vzduch v okruhu 6 metrů v odpornou naÅ¡edlou mlhu. Sesilatel a neživé bytosti budou z jeho úÄinků vylouÄeni. Ostatní v každém kole, kdy v mraku nákazy pobývají, ztratí 3 body ze síly a obratnosti, utrpí 3 body zranÄ›ní a oslepnou. Tyto úÄinky pÅ™etrvají po dobu 1 kola. Morové mraÄno mohou sesílat pouze zlé postavy.~ +%atsymbol%251=~Morové mraÄno~ +%atsymbol%250=~OmráÄení~ +%atsymbol%249=~VyléÄen~ +%atsymbol%248=~KrvelaÄná zuÅ™ivost (promÄ›na) +Úroveň: 3 +Sféra: boj +Dosah: dohled sesilatele +Trvání: 2 tahy +Doba kouzlení: 7 +Rozsah: 1 přátelská bytost +Hod na záchranu: žádný +Toto kouzlo úÄinkuje pouze na hráÄovy postavy nebo přátelské tvory. Postižená bytost propadne bojovému šílenství a bude útoÄit na nejbližšího tvora, dokud ho nezabije, a pak bude pokraÄovat k dalšímu cíli. Po dobu úÄinku bude dotyÄný imunní na zmámení, spánek, strach, znehybnÄ›ní, omráÄení, zmatení, emoce, kouzla symbolů a podobné úÄinky. K tomu jeÅ¡tÄ› obdrží +2 k zásahu, +3 ke způsobovanému zranÄ›ní, +2 k síle, +10 životů a bonus k pohyblivosti. Kouzlo má vÅ¡ak i své nevýhody: po Äas jeho trvání jsou životy zuÅ™ivce skryty a nemůže využívat nic, co pÅ™ináší uzdravení. Po vyprÅ¡ení stanovené doby bude osoba unavená a její síla na 2 kola klesne na 3. KrvelaÄná zuÅ™ivost nijak neovlivní (a ani ji nemohou sesílat) postavy se zákonným pÅ™esvÄ›dÄením.~ +%atsymbol%247=~KrvelaÄná zuÅ™ivost~ +%atsymbol%246=~Recitace +(Ochrana/Vzývání) +Úroveň: 4 +Sféra: boj +Dosah: sesilatel +Trvání: 1 kolo/úroveň +Doba kouzlení: 7 +Rozsah: okruh 18 metrů +Hod na záchranu: žádný +PÅ™ednesem posvátných pasáží knÄ›z vzývá své božstvo, aby jemu a jeho spojencům požehnalo a zároveň aby zaselo zmatek a slabost do Å™ad nepřátel. KnÄ›zovi spojenci dostávají bonus +2 k útoku a k hodům na záchranu, oproti tomu protivníci na útoky a záchranné hody utrpí postih -2. Recitace neanuluje moc modlitby - obÄ› mohou být použity souÄasnÄ› a jejich úÄinky se sÄítají.~ +%atsymbol%245=~Recitace~ +%atsymbol%244=~Discharge of static electricity~ +%atsymbol%243=~Statický výboj (promÄ›na) +Úroveň: 4 +Sféra: poÄasí +Dosah: sesilatel +Trvání: 1 tah/úroveň +Doba kouzlení: 1 kolo +Rozsah: dohled sesilatele +Hod na záchranu: poloviÄní újma +Toto kouzlo se podobá vyvolání blesku, avÅ¡ak na rozdíl od nÄ›j může být použito i v místnostech. Sestává ze statického výboje okolo libovolné bytosti v dosahu jeho úÄinků, který způsobí zranÄ›ní elektÅ™inou za 2k8 životů plus dalších 1-8 životů na každou úroveň knÄ›ze. Výboj v jednotlivých kolech postupnÄ› slábne.~ +%atsymbol%242=~Statický výboj~ +%atsymbol%241=~Vyvolání ohnÄ› +(PromÄ›na) +Úroveň: 4 +Sféra: živly (oheň) +Dosah: dohled sesilatele +Trvání: 1 kolo +Doba kouzlení: 7 +Rozsah: okruh 1,8 metru +Hod na záchranu: žádný +Díky tomuto kouzlu vyÅ¡lehnou na cílovém místÄ› plameny, které zraňují každou bytost v dané oblasti za 1-4 zásahové body + 1 bod na úroveň uživatele.~ +%atsymbol%240=~Vyvolání ohnÄ›~ +%atsymbol%239=~Favor of Ilmater +(Necromancy) +Level: 3 +Sphere: Necromantic, Protection +Range: 30 ft. +Duration: Instant +Casting Time: 6 +Area of Effect: 1 creature +Saving Throw: None +By invoking this spell, the caster switches own life force with that of the recipient, exchanging all physical injuries. The spell will only function if the caster has more Hit Points than the target before the switch is attempted. This switch is permanent until the caster uses normal methods to heal the damage. The exchange can be done from a distance so long as the spell range is not exceeded. Only the Hit Points are exchanged; the caster cannot take on other conditions from the target such as disease, poison, intoxication, and similar afflictions. +This spell cannot be cast by evil-aligned characters. It has no effect on undead, constructs, or extraplanar creatures.~ +%atsymbol%238=~Přízeň Ilmaterova~ +%atsymbol%237=~Způsob stÅ™ední zranÄ›ní +(Nekromancie) +Úroveň: 3 +Sféra: LéÄení +Dosah: dotyk +Trvání: trvalé +Doba sesílání: 5 +Oblast působení: dotknutá bytost +Záchranný hod: 1/2 +Sesláním kouzla a pÅ™iložením rukou na bytost knÄ›z způsobí 14 bodů zranÄ›ní. Kouzlo neovlivňuje bytost bez hmotného tÄ›la, ani bytosti nežijící Äi z jiné sféry. Toto kouzlo nemohou seslat postavy dobrého pÅ™esvÄ›dÄení.~ +%atsymbol%236=~Způsob stÅ™ední zranÄ›ní~ +%atsymbol%235=~BouÅ™ná schránka (ochrana) +Úroveň: 3 +Sféra: ochrana, poÄasí +Dosah: sesilatel +Trvání: 1 tah +Doba kouzlení: 6 +Oblast působení: sesilatel +Hod na záchranu: žádný +Toto kouzlo obklopí sesilatele temným okruhem ruÅ¡ivé energie, která se pohybuje spolu s ním. BouÅ™ná schránka snižuje veÅ¡keré zranÄ›ní ohnÄ›m, chladem a elektÅ™inou o 50%.~ +%atsymbol%234=~BouÅ™ná schránka~ +%atsymbol%233=~Dotyk plísnÄ› (promÄ›na) +Úroveň: 3 +Sféra: rostliny +Dosah: dotyk +Trvání: 3 nebo 4 kola (zvláštní) +Doba kouzlení: 6 +Rozsah: 1 bytost +Hod na záchranu: zvláštní +Po tomto dotyku se tÄ›lo dotyÄného potáhne rychle rostoucí zelenou plísní. Postižená bytost má k dispozici hod na záchranu proti kouzlu - pokud se nezdaří, nákaza je těžká a tvor utrpí následující újmu: +1. kolo: zranÄ›ní 4k6 +2. kolo: zranÄ›ní 3k6 +3. kolo: zranÄ›ní 2k6 +4. kolo: zranÄ›ní 1k6 +PÅ™i úspěšném záchranném hodu bude utrpÄ›né zranÄ›ní sníženo: +1. kolo: zranÄ›ní 2k6 +2. kolo: zranÄ›ní 1k6 +3. kolo: zranÄ›ní 1k6 +V každém kole krom prvního si musí bytost nejblíže k obÄ›ti v okruhu tří metrů hodit na záchranu proti kouzlu, nebo bude plísní infikována s plnou úÄinností. Tento proces pokraÄuje, dokud se plísni nepodaří vÄas zasáhnout dalšího nositele. StvoÅ™ení, která již jejímu působení podléhají, nemohou být znovu nakažena. Zelená plíseň rychle odumírá, když vyprší stanovená doba.~ +%atsymbol%232=~Dotyk plísnÄ›~ +%atsymbol%231=~Průtrž mraÄen +(Vzývání) +Úroveň: 3 +Sféra: živly (voda) +Dosah: dohled sesilatele +Trvání: 2 kola +Doba kouzlení: 6 +Rozsah: okruh 9 metrů +Hod na záchranu: žádný +Toto kouzlo postihne danou oblast magickým deÅ¡tÄ›m. VÅ¡echny bytosti chladu a používající Äi obývající oheň utrpí v každém kole zranÄ›ní ve výši 2k3 životů. K tomu mají vÅ¡ichni tvorové v kritickém okruhu 50% pravdÄ›podobnost, že budou zasažení elektrickými výboji, způsobujícími zranÄ›ní za 2k6 životů (pÅ™i úspěšném záchranném hodu polovic). Kouzla "ohnivý meÄ", "plamenný rubáš" a aury salamandrů budou průtrží mraÄen uhaÅ¡eny.~ +%atsymbol%230=~Průtrž mraÄen~ +%atsymbol%229=~Růst bodláků +(PromÄ›ny) +Úroveň: 3 +Sféra: živly (zemÄ›) +Dosah: dohled sesilatele +Trvání: 1 tah +Doba kouzlení: 6 +Rozsah: okruh 4,5 metru +Hod na záchranu: žádný +Po vyslovení tohoto zaklínadla obroste okolní terén ostnatými rostlinami. Každý, kdo na postižené území vkroÄí, utrpí v každém kole trvání kouzla bodná zranÄ›ní ve výši 1k4 a seÄná zranÄ›ní za 1k4 životů.~ +%atsymbol%228=~Růst bodláků~ +%atsymbol%227=~KostÄ›ný kruh (nekromancie) +Úroveň: 3 +Sféra: obrana/vytváření +Dosah: sesilatel +Trvání: 3 kola +Doba kouzlení: 3 +Rozsah: okruh 0,9 metru +Hod na záchranu: žádný +Toto kouzlo zformuje bariéru z pohybujících se kostí, která okamžitÄ› obklopí uživatele. Každý, kdo projde skrz, utrpí v každém kole drtivá zranÄ›ní ve výši 1k6 a seÄná zranÄ›ní 1k6. Sesilatel se po dobu trvání kouzla nemůže hýbat. KostÄ›ný kruh nesmí sesílat postavy s dobrým pÅ™esvÄ›dÄením.~ +%atsymbol%226=~KostÄ›ný kruh~ +%atsymbol%225=~MÄ›síÄní Äepel~ +%atsymbol%224=~MÄ›síÄní Äepel~ +%atsymbol%223=~MÄ›síÄní Äepel (vzývání) +Úroveň: 3 +Sféra: boj, slunce +Dosah: sesilatel +Trvání: 2 tahy +Doba kouzlení: 6 +Rozsah: sesilatel +Hod na záchranu: žádný +Toto kouzlo vyvolá tichou beztížnou zbraň podobnou meÄi, sestávající z mÄ›síÄního svÄ›tla a dlouhou 1,2 m. PÅ™i útoku se chová jako zbraň +4, což má vliv na to, jaké nepřátele zasáhne, ale tento bonus se neodráží v THAC0. Díky kÅ™ehké povaze tohoto bÅ™itu také nelze aplikovat bonusy za sílu. +Úder mÄ›síÄní Äepele vysává z cíle život a způsobuje tak újmu ve výši 1k12 +4 a dalších 1k12 zranÄ›ní nemrtvým, kteří její moci více podléhají. Úspěšný zásah také poÅ¡kozuje magii a způsobuje, že každé kouzlo, které se oběť pokusí v následujícím kole seslat, se nezdaří.~ +%atsymbol%222=~MÄ›síÄní Äepel~ +%atsymbol%221=~Spánek~ +%atsymbol%220=~Euforie (ochrana) +Úroveň: 3 +Sféra: uzdravování +Dosah: dotyk +Trvání: 1 tah +Doba kouzlení: 1 kolo +Oblast působení: 1 bytost +Hod na záchranu: žádný +Euforií může knÄ›z povzbudit a ochránit i nÄ›koho jiného. Pouhým dotykem odstraní úÄinky strachu, spánku, slabomyslnosti, bezvÄ›domí, omámení, stejnÄ› jako váleÄnou zuÅ™ivost Äi stavy zmatení mysli. K tomu bude dotyÄný po dobu trvání chránÄ›n proti kouzlům a ostatním útokům, které by tyto stavy mohly způsobit.~ +%atsymbol%219=~Euforie~ +%atsymbol%218=~Nakažení (nekromancie) +Úroveň: 3 +Sféra: uzdravení +Dosah: dotyk +Trvání: 8 hodin +Doba kouzlení: 1 kolo +Rozsah: 1 bytost +Hod na záchranu: zruší kouzlo +Tímto způsobem lze nakazit dotyÄnou bytost nemocí, která z obÄ›ti vysaje 5-20 bodů síly. Úspěšný hod na záchranu tyto úÄinky ruší. Nakažení nepůsobí na bytosti nemrtvé, vyrobené nebo stvoÅ™ení z jiných dimenzí. Kouzlo nemohou sesílat postavy s dobrým pÅ™esvÄ›dÄením.~ +%atsymbol%217=~Nakažení~ +%atsymbol%216=~Bojové postihy~ +%atsymbol%215=~Bojové bonusy~ +%atsymbol%214=~Modlitba +(Vyvolávání) +Úroveň: 3 +Sféra: boj +Dosah: sesilatel +Trvání: 1 kolo/úroveň +Doba kouzlení: 6 +Rozsah: okruh 18 metrů +Hod na záchranu: žádný +Modlitba seÅ¡le na knÄ›ze a jeho spojence boží přízeň a na jejich protivníky naopak kletbu. VÅ¡echny útoky, zranÄ›ní a vrhy na záchranu spřátelenými postavami získávají modifikátor +1, zatímco nepřátelské útoky, hody na zranÄ›ní a záchranu jsou postihovány -1. Každá bytost zastižená v okruhu úÄinku kouzla v okamžiku jeho vyvolání je jím ovlivnÄ›na, i když zmínÄ›nou oblast opustí, takže bojovníci mohou pronásledovat prchající skÅ™ety a úÄinky modlitby je budou stále provázet.~ +%atsymbol%213=~Modlitba~ +%atsymbol%212=~StÅ™ední zranÄ›ní (nekromancie) +Úroveň: 2 +Sféra: uzdravení +Dosah: dotyk +Trvání: okamžité +Doba kouzlení: 5 +Rozsah: 1 bytost +Hod na záchranu: poloviÄní újma +Toto kouzlo je opakem léÄby stÅ™edních zranÄ›ní - namísto vyhojení ztratí dotyÄná bytost pÅ™i úspěšném dotyku 11 životů (pÅ™i úspěšném záchranném hodu polovic). Toto kouzlo neúÄinkuje na bytosti nemrtvé, vyrobené nebo tvory z jiných dimenzí. StÅ™ední zranÄ›ní nemohou působit postavy s dobrým pÅ™esvÄ›dÄením.~ +%atsymbol%211=~StÅ™ední zranÄ›ní~ +%atsymbol%210=~Spár Å¡elmy~ +%atsymbol%209=~Spár Å¡elmy~ +%atsymbol%208=~Spár Å¡elmy (promÄ›na) +Úroveň: 2 +Sféra: boj +Dosah: sesilatel +Trvání: 1 tah +Doba kouzlení: 5 +Oblast působení: sesilatel +Hod na záchranu: žádný +Toto kouzlo promÄ›ní sesilatelovy ruce v pařáty mocné Å¡elmy, zvýší jeho sílu na 18/72 a dá mu možnost způsobit nepříteli seÄná zranÄ›ní ve výši 2k4 (+bonus za sílu). Uživatel smí svými spáry zaútoÄit dvakrát za kolo s bonusem +2 k zásahu.~ +%atsymbol%207=~Spár Å¡elmy~ +%atsymbol%206=~Obklopen/a stříbÅ™itým jasem (postih k obrannému Äíslu 2)~ +%atsymbol%205=~OÅ¡tÄ›p z rohu jednorožce (vzývání) +Úroveň: 2 +Sféra: boj +Dosah: dohled sesilatele +Trvání: okamžité +Doba kouzlení: 5 +Rozsah: 1 bytost +Hod na záchranu: poloviÄní újma +Toto kouzlo stvoří stříbroskvoucí, ÄásteÄnÄ› nehmotný oÅ¡tÄ›p ve tvaru rohu jednorožce. Sesilatel zvolí cíl, na nÄ›jž zbraň okamžitÄ› vystÅ™elí a způsobí bodné zranÄ›ní ve výši 3k6 životů (pÅ™i úspěšném záchranném hodu polovic). I když se roh po úspěšném zásahu rozptýlí, obklopí protivníka stříbÅ™itým jasem, který jej uÄiní lépe viditelným a zranitelnÄ›jším. Oběť tak bude na tÅ™i kola postižena penalizací -2 na obranné Äíslo.~ +%atsymbol%204=~OÅ¡tÄ›p z rohu jednorožce~ +%atsymbol%203=~VyléÄení~ +%atsymbol%202=~LéÄba stÅ™ednÄ› těžkých zranÄ›ní (nekromancie) +Úroveň: 2 +Sféra: léÄba +Dosah: dotyk +Trvání: stálé +Doba kouzlení: 5 +Rozsah: 1 bytost +Hod na záchranu: žádný +Tato o trochu silnÄ›jší modifikace léÄby lehkých zranÄ›ní navrátí každé živé bytosti 11 zásahových bodů. ÚÄinek tohoto kouzla se nevztahuje na nemrtvé a stvoÅ™ení z jiných dimenzí.~ +%atsymbol%201=~LéÄba stÅ™ednÄ› těžkých zranÄ›ní~ +%atsymbol%200=~Oslepen~ +%atsymbol%199=~Úžeh (vzývání) +Úroveň: 1 +Sféra: slunce +Dosah: dohled sesilatele +Trvání: okamžité +Doba kouzlení: 4 +Rozsah: 1 bytost +Hod na záchranu: poloviÄní újma +Po vyslovení ÄarodÄ›jné formule vyÅ¡lehne z nebes na zvolený cíl oslnivý paprsek spalujícího žáru. Oběť si může hodit na záchranu proti kouzlu a pokud se jí vrh podaří, utrpí pouze poloviÄní újmu. Každý, na koho paprsek dopadne, ztratí 1k6 +1 život za každou úroveň sesilatele. Nemrtvé bytosti a nestvůry zvlášť zranitelné jasným svÄ›tlem pÅ™ijdou o 1k6 životů +2 za každou knÄ›zovu úroveň. K tomu vÅ¡emu budou zasažení na 3 kola oslepeni.~ +%atsymbol%198=~Úžeh~ +%atsymbol%197=~Lehká zranÄ›ní (nekromancie) +Úroveň: 1 +Sféra: léÄba +Dosah: dotyk +Trvání: okamžité +Doba kouzlení: 5 +Rozsah: 1 bytost +Hod na záchranu: poloviÄní újma +Toto kouzlo je opakem léÄby lehkých zranÄ›ní - namísto vyhojení ztratí dotyÄná bytost pÅ™i úspěšném dotyku 8 životů (pÅ™i úspěšném záchranném hodu polovic). Toto kouzlo neúÄinkuje na bytosti nemrtvé, vyrobené nebo stvoÅ™ení z jiných dimenzí. Lehká zranÄ›ní nemohou působit postavy s dobrým pÅ™esvÄ›dÄením.~ +%atsymbol%196=~Lehká zranÄ›ní~ +%atsymbol%195=~Prokletý/á~ +%atsymbol%194=~Prokletí +(OÄarování/Vyvolávání) +Úroveň: 1 +Sféra: vÅ¡eobecná +Dosah: dohled sesilatele +Trvání: 6 kol +Doba kouzlení: 1 kolo +Rozsah: polomÄ›r 7,5 metru +Hod na záchranu: žádný +VyÅ™Äením tohoto zaklínání sníží sesilatel morálku nepřátelských bytostí a postihne jejich hody na záchranu a útok -1. V okamžiku dokonÄení jsou proklety vÅ¡echny bytosti v krychli 15 metrů se stÅ™edem v bodÄ› vybraném uživatelem (takže ovlivnÄ›ní tvorové, kteří oblast opustí, stále podléhají úÄinkům kouzla; na ty, kteří do ní vstoupí po dokonÄení magické formule, se již kouzlo nevztahuje).~ +%atsymbol%193=~Prokletí~ +%atsymbol%192=~Eye of Stone +This eye shields the caster from a single petrification attack. +It can also be used as the 3rd-level wizard spell Hold Person, rendering humanoids of man-size or smaller immobile for 1 round/level (Save vs. Spell negates).~ +%atsymbol%191=~Oko kamene~ +%atsymbol%190=~Eye of the Spirit +This eye blocks one instant-death magic attack (Death Spell; Finger of Death; Power Word, Kill; Slay Living; Destruction). +The wizard may instead choose to expend the eye's power as the 2nd-level wizard spell Ray of Enfeeblement, dropping a target's Strength to 5 (Save vs. Spell negates).~ +%atsymbol%189=~Oko ducha~ +%atsymbol%188=~Eye of Fortitude +This eye blocks one stunning, deafness, blindness, or silence effect. +It may alternatively be expended as the 4th-level wizard spell Shout, dealing 4d6 magic damage and deafening creatures within a 35-ft. cone (Save vs. Spell halves damage and negates deafness).~ +%atsymbol%187=~Oko stateÄnosti~ +%atsymbol%186=~Eye of Venom +This eye halts any one attack or effect that could poison the caster. +The eye can also be expended as the 4th-level priest spell Poison, dealing 20 points of damage to one creature over a period of 20 seconds (Save vs. Poison negates).~ +%atsymbol%185=~Oko jedu~ +%atsymbol%184=~Eye of the Sword +This eye deflects the first physical damaging attack that strikes the caster. +The eye may be expended as the 1st-level wizard spell Magic Missile, creating up to 5 missiles (one for every two levels of experience besides the first) that each strike a target for 1d4+1 magic damage.~ +%atsymbol%183=~Oko meÄe~ +%atsymbol%182=~Eye of the Mage +This eye absorbs one manifestation of fire, electrical, cold, or acid damage. +The eye can also be expended as the 3rd-level wizard spell Lightning Bolt, dealing 1d6 electrical damage per level (capped at 10d6) to all creatures in its path.~ +%atsymbol%181=~Oko mága~ +%atsymbol%180=~Eye of the Mind +This orb protects the caster against mental attacks such as charm, emotion, and fear. +The eye can be expended as the 1st-level wizard spell Charm Person, bringing a humanoid creature under the caster's control for 1 turn (Save vs. Spell negates).~ +%atsymbol%179=~Oko mysli~ +%atsymbol%178=~Toto kouzlo nemůžeÅ¡ seslat, dokud nevyprchá aktuální kouzlo.~ +%atsymbol%177=~Sedmero oÄí (ochrana) +Úroveň: 7 +Dosah: sesilatel +Trvání: 2 tahy +Doba kouzlení: 7 +Oblast působení: sesilatel +Hod na záchranu: žádný +Toto zaříkání povolá sedm magických oÄí, které se budou vznášet nad sesilatelovou hlavou. Každé z nich má obrannou i útoÄnou schopnost, kterou vÅ¡ak ihned po použití ztratí. Jakákoliv kouzla seslaná po vyvolání sedmera oÄí se nezdaří, dokud neuplyne stanovený Äas nebo dokud vÅ¡echny oÄi nezmizí. Moc každého z nich je popsána níže. +Oko mysli - chrání sesilatele pÅ™ed mentálními útoky jako je zmámení, emoce a strach. Může se také stát ÄarodÄ›jovým kouzlem první úrovnÄ› 'zmámení osoby'. +Oko meÄe - odrazí první fyzický útok, směřující na sesilatele. Může být také použito jako mágovo kouzlo první úrovnÄ› 'magická stÅ™ela'. +Oko mága - absorbuje první zranÄ›ní ohnÄ›m, elektÅ™inou, mrazem Äi kyselinou. Může též posloužit jako ÄarodÄ›jovo kouzlo tÅ™etí úrovnÄ› 'blesk' (zranÄ›ní 4k8). +Oko jedu - zastaví první útok, který by mohl uživatele otrávit. Lze je také použít k otrávení jedné bytosti, které způsobí zranÄ›ní 30 životů za 30 sekund. +Oko ducha - zablokuje první útok okamžité smrtící magie ('kouzlo smrti', 'prst smrti', 'mocné slovo: zabití', 'niÄení života', 'zkáza'). Jeho moc může ÄarodÄ›j využít i jako paprsek slabomyslnosti, který sílu cíle nastaví na 5, sníží jeho Å¡ance na zásah a působenou újmu. +Oko stateÄnosti - zabrání jednomu omráÄení, hluchotÄ›, slepotÄ› nebo úÄinkům ticha. Je možno je také zužitkovat jako ÄarodÄ›jovo kouzlo tÅ™etí úrovnÄ› 'znehybnÄ›ní osoby'. +Oko kamene - zaÅ¡títí mága pÅ™ed jedním zkameňovacím útokem. Může se stát též ÄarodÄ›jovým kouzlem 3. úrovnÄ› 'znehybnÄ›ní osoby'. +Sedmero oÄí lze znovu vyvolat teprve poté, co vyprší doba trvání kouzla prvního, aÅ¥ už nÄ›jaké oÄi zbývají nebo ne.~ +%atsymbol%176=~Sedmero oÄí~ +%atsymbol%175=~Malavonův bÄ›s +(Vzývání) +Úroveň: 7 +Dosah: uživatel +Trvání: okamžité +Doba kouzlení: 1 +Rozsah: okruh 4,5 metru +Hod na záchranu: poloviÄní újma +Toto zaklínadlo vytvoÅ™il temný elfí ÄarodÄ›j Malavon. SpoÄívá v tom, že z tÄ›la sesilatele vytrysknou do vÅ¡ech smÄ›rů ÄásteÄky Äisté energie, ubližujíce jak přátelům, tak i nepřátelům. Tyto malé magické body způsobí každému, kdo se jim pÅ™iplete do cesty, bodná zranÄ›ní za 20-80 životů. Toto kouzlo je obzvláštÄ› výhodné použít, pokud je kouzelník obklíÄen nepřáteli.~ +%atsymbol%174=~Malavonův bÄ›s~ +%atsymbol%173=~Vorpal Hit~ +%atsymbol%172=~Smrt~ +%atsymbol%171=~Nemrtvý zniÄen~ +%atsymbol%170=~Outer planar destroyed~ +%atsymbol%169=~Stíny (iluze) +Úroveň: 6 +Dosah: dohled sesilatele +Trvání: 1 kolo/úroveň +Doba kouzlení: 6 +Rozsah: krychle 6 metrů +Hod na záchranu: žádný +Stíny se podobají stínovým příšerám a nestvůrám polostínů - umožní uživateli utvářet hmotu z dimenze stínů a vyrábÄ›t z ní iluzorní tvory, kteří jsou tužší než přízraky vyvolané obÄ›ma výše zmínÄ›nými kouzly a plní příkazy svého sesilatele, dokud nevyprší stanovený Äas nebo dokud nebudou zabity.~ +%atsymbol%168=~Stíny~ +%atsymbol%167=~Dotyk licha~ +%atsymbol%166=~Dotyk licha~ +%atsymbol%165=~Dotyk licha (nekromancie) +Úroveň: 6 +Dosah: dotyk +Trvání: 1 kolo/úroveň +Doba kouzlení: 6 +Rozsah: sesilatel +Hod na záchranu: zvláštní +Toto zaklínadlo propůjÄuje uživateli sílu dotyku licha i jeho odolnost. BÄ›hem jeho působení je ÄarodÄ›j imunní vůÄi znehybnÄ›ní a strachu a jeho ruce září nadpozemským zelenkavým jasem, který zraňuje cíl za 1-10 životů a zcela ho paralyzuje, pokud si nehodí úspěšnÄ› na záchranu pÅ™ed znehybnÄ›ním. Na nemrtvé vÅ¡ak toto kouzlo nijak nepůsobí.~ +%atsymbol%164=~Dotyk licha~ +%atsymbol%163=~OdÄaruj efekty~ +%atsymbol%162=~Antimagická schránka (ochrana) +Úroveň: 6 +Dosah: sesilatel +Trvání: 1 tah/úroveň +Doba kouzlení: 1 +Rozsah: sesilatel +Hod na záchranu: žádný +Po seslání tohoto kouzla obklopí ÄarodÄ›je neviditelná pÅ™ehrada, která se pohybuje spolu s ním. Tato bariéra ho Äiní imunním vůÄi magickým útokům, ale zároveň mu zabraňuje vysílat mimo ni jakákoliv kouzla.~ +%atsymbol%161=~Antimagická schránka~ +%atsymbol%160=~Elitní jeÅ¡tÄ›ran~ +%atsymbol%159=~Elitní skÅ™et~ +%atsymbol%158=~Elitní skÅ™et~ +%atsymbol%157=~Nestvůry polostínů (iluze) +Úroveň: 5 +Dosah: dohled sesilatele +Trvání: 1 kolo/úroveň +Doba kouzlení: 5 +Rozsah: krychle 6 metrů +Hod na záchranu: žádný +Toto kouzlo se podobá kouzlu 4. úrovnÄ› 'stínové příšery', ovÅ¡em vyvolané bytosti jsou mnohem silnÄ›jší, se 40% životů svých skuteÄných protÄ›jÅ¡ků.~ +%atsymbol%156=~Nestvůry polostínů~ +%atsymbol%155=~Trolí zbraň~ +%atsymbol%154=~Trol~ +%atsymbol%153=~Trol~ +%atsymbol%152=~Stínové příšery (iluze) +Úroveň: 4 +Dosah: dohled sesilatele +Trvání: 1 kolo/úroveň +Doba kouzlení: 4 +Rozsah: krychle 6 metrů +Hod na záchranu: zvláštní +Toto kouzlo pÅ™etvoří materiál z dimenze stínů na iluzorní nestvůry. Tyto příšery jsou vyvolávány náhodnÄ› jedna za druhou, s hody na životy mezi 1 a úrovní ÄarodÄ›je, dokud tento vrh u povolávané bytosti nedosáhne sesilatelovy úrovnÄ›. (Například mág 15. úrovnÄ› může vyvolat v jednom kole bytost 10 úrovnÄ›; tvor, který se pak objeví v dalším kole, bude mít hod na životy 1 až 5 atd.) Tato stínová stvoÅ™ení mají pouze 20% životů svých skuteÄných protÄ›jÅ¡ků, aÄkoliv jejich útoky jsou vedeny bez postihu.~ +%atsymbol%151=~Stínové příšery~ +%atsymbol%150=~Zrychlen~ +%atsymbol%149=~Zpomalení~ +%atsymbol%148=~Zpomalil~ +%atsymbol%147=~Rychlý únik (promÄ›na) +Úroveň: 1 +Dosah: sesilatel +Trvání: 3 kola +Doba kouzlení: 1 +Rozsah: sesilatel +Hod na záchranu: žádný +Toto kouzlo zdvojnásobí sesilatelovu normální rychlost na dobu, která obvykle postaÄí k tomu, aby mohl uniknout z nebezpeÄí. Po dobu trvání tohoto kouzla nemá na ÄarodÄ›je vliv žádná jiná magie, týkající se rychlosti, jako 'zrychlení' nebo 'zpomalení¨.~ +%atsymbol%146=~Expeditious Retreat~ +%atsymbol%145=~Mordenkainenův meÄ~ +%atsymbol%144=~Mordenkainenův meÄ~ +%atsymbol%143=~Mordenkainenův meÄ (vzývání) +Úroveň: 7 +Dosah: dohled sesilatele +Trvání: 1 kolo/úroveň +Doba kouzlení: 7 +Rozsah: zvláštní +Hod na záchranu: žádný +Toto kouzlo vyvolá blyÅ¡tivý silový meÄ, který ÄarodÄ›j mentálnÄ› ovládá. Zbraň se chová, jako by byla v rukou bojovníka poloviÄní úrovnÄ› než má uživatel, a navzdory tomu, že ji mág pevnÄ› třímá v rukou, dokáže útoÄit na bytosti kdekoliv v jeho zorném poli. AÄkoliv meÄ nemá žádný bonus na útok, dokáže zasahovat i tvory, kteří by normálnÄ› byli zranitelní pouze zbranÄ›mi +2 a vyššími a každým úderem působit ztrátu 5-30 životů.~ +%atsymbol%142=~Mordenkainenův meÄ~ +%atsymbol%141=~Vodní elementál~ +%atsymbol%140=~Vodní elementál~ +%atsymbol%139=~Vyvolání elementála vody (vyvolávání) +Úroveň: 5 +Dosah: dohled sesilatele +Trvání: 1 tah/úroveň +Doba kouzlení: 1 kolo +Rozsah: zvláštní +Hod na záchranu: žádný +Toto kouzlo umožní uživateli vyvolat elementála z dimenze elementálů vody a ovládnout ho svou vůlí. Tento tvor bude bojovat ve prospÄ›ch kouzelníka, dokud neuplyne urÄená doba nebo dokud nebude elementál zniÄen.~ +%atsymbol%138=~Vyvolání elementála vody~ +%atsymbol%137=~VzduÅ¡ný elementál~ +%atsymbol%136=~VzduÅ¡ný elementál~ +%atsymbol%135=~Conjure Air Elemental +(Conjuration/Summoning) +Level: 5 +Range: Visual range of the caster +Duration: 1 turn/level +Casting Time: 9 +Area of Effect: Special +Saving Throw: None +This spell allows the caster to summon an 8-HD elemental from the Elemental Plane of Air and bind it to will. This elemental will fight on behalf of the caster until the spell duration expires or the elemental is destroyed.~ +%atsymbol%134=~Vyvolej vzduÅ¡ného elementála~ +%atsymbol%133=~Ohnivý elementál~ +%atsymbol%132=~Ohnivý elementál~ +%atsymbol%131=~Vyvolání elementála ohnÄ› (vyvolávání) +Úroveň: 5 +Dosah: dohled sesilatele +Trvání: 1 tah/úroveň +Doba kouzlení: 1 kolo +Rozsah: zvláštní +Hod na záchranu: žádný +Toto kouzlo umožní uživateli vyvolat elementála z dimenze elementálů ohnÄ› a ovládnout ho svou vůlí. Tento tvor bude bojovat ve prospÄ›ch mága, dokud nevyprší stanovená doba nebo dokud nebude elementál zniÄen.~ +%atsymbol%130=~Vyvolání elementála ohnÄ›~ +%atsymbol%129=~Elementál zemÄ›~ +%atsymbol%128=~Elementál zemÄ›~ +%atsymbol%127=~Vyvolání elementála zemÄ› (vyvolávání) +Úroveň: 5 +Dosah: dohled sesilatele +Trvání: 1 tah/úroveň +Doba kouzlení: 1 kolo +Rozsah: zvláštní +Hod na záchranu: žádný +Toto kouzlo ÄarodÄ›jovi umožní vyvolat elementála z dimenze elementálů zemÄ› a ovládat ho svou vůlí. Tento tvor bude bojovat v jeho prospÄ›ch, dokud nevyprší doba trvání kouzla nebo dokud nebude elementál zniÄen.~ +%atsymbol%126=~Vyvolání elementála zemÄ›~ +%atsymbol%125=~Vyvolání nestvůr III (vyvolávání) +Úroveň: 5 +Dosah: 36 metrů +Trvání: 4 kola + 1 kolo/úroveň +Doba kouzlení: 5 +Rozsah: zvláštní +Hod na záchranu: žádný +V kole, kdy je toto kouzlo sesláno, se v dosahu kouzla objeví 1-4 nestvůry 3. úrovnÄ›, které budou útoÄit na ÄarodÄ›jovy protivníky, dokud neuplyne uvedená doba nebo dokud příšery nebudou zabity.~ +%atsymbol%124=~Vyvolání nestvůr III~ +%atsymbol%123=~JeÅ¡tÄ›ran~ +%atsymbol%122=~JeÅ¡tÄ›ran~ +%atsymbol%121=~Vyvolání nestvůr II (vyvolávání) +Úroveň: 4 +Dosah: 36 metrů +Trvání: 3 kola + 1 kolo/úroveň +Doba kouzlení: 4 +Rozsah: zvláštní +Hod na záchranu: žádný +V kole, kdy je toto kouzlo sesláno, se v jeho dosahu objeví 1-6 nestvůr 2. úrovnÄ›, které budou útoÄit na ÄarodÄ›jovy protivníky, dokud neuplyne stanovená doba nebo dokud příšery nebudou zabity.~ +%atsymbol%120=~Vyvolání nestvůr II~ +%atsymbol%119=~SkÅ™et~ +%atsymbol%118=~SkÅ™et~ +%atsymbol%117=~Vyvolání nestvůr I (vyvolávání) +Úroveň: 3 +Dosah: 36 metrů +Trvání: 2 kola + 1 kolo/úroveň +Doba kouzlení: 4 +Rozsah: zvláštní +Hod na záchranu: žádný +V kole, kdy je toto kouzlo sesláno, se v jeho dosahu objeví 2-8 nestvůr 1. úrovnÄ›, které budou útoÄit na ÄarodÄ›jovy protivníky, dokud neuplyne urÄená doba nebo dokud příšery nebudou zabity.~ +%atsymbol%116=~Vyvolání nestvůr I~ +%atsymbol%115=~Útok~ +%atsymbol%114=~Minotaur~ +%atsymbol%113=~Minotaur~ +%atsymbol%112=~Vyvolání nestvůr V (vyvolávání) +Úroveň: 7 +Dosah: 36 metrů +Trvání: 6 kol + 1 kolo/úroveň +Doba kouzlení: 6 +Rozsah: zvláštní +Hod na záchranu: žádný +V kole, kdy je toto kouzlo sesláno, se v jeho dosahu objeví 1-3 nestvůry 5. úrovnÄ›, které mohou útoÄit na ÄarodÄ›jovy protivníky, dokud nevyprší urÄený Äas nebo dokud příšery nebudou zabity.~ +%atsymbol%111=~Vyvolání nestvůr V~ +%atsymbol%110=~Salamander spear +1d8 piercing +1d6 fire damage +do not translate~ +%atsymbol%109=~Frost salamander spear +1d8 piercing ++1d6 cold +do not trans~ +%atsymbol%108=~Salamandr~ +%atsymbol%107=~Salamandr~ +%atsymbol%106=~Ledový salamandr~ +%atsymbol%105=~Ledový salamandr~ +%atsymbol%104=~Vyvolání nestvůr VI (vyvolávání) +Úroveň: 8 +Dosah: 36 metrů +Trvání: 7 kol + 1 kolo/úroveň +Doba kouzlení: 8 +Rozsah: zvláštní +Hod na záchranu: žádný +Jakmile je toto kouzlo sesláno, objeví se v jeho dosahu 1-3 nestvůry 6. úrovnÄ›, které mohou zaútoÄit na ÄarodÄ›jovy protivníky, dokud nevyprší stanovená doba nebo dokud příšery nebudou zabity.~ +%atsymbol%103=~Vyvolání nestvůr VI~ +%atsymbol%102=~Útok~ +%atsymbol%101=~Klepetnatec okrový~ +%atsymbol%100=~Klepetnatec okrový~ +%atsymbol%99=~Kostlivý strážce~ +%atsymbol%98=~Kostlivý strážce~ +%atsymbol%97=~Vyvolání nestvůr VII (vyvolávání) +Úroveň: 9 +Dosah: zvláštní +Trvání: 7 kol + 1 kolo/úroveň +Doba kouzlení: 9 +Rozsah: okruh 72 metrů +Hod na záchranu: žádný +Po vyslovení této magické formule se v dosahu kouzla objeví 1-2 nestvůry 7. nebo 8. úrovnÄ›, které mohou napadnout ÄarodÄ›jovy protivníky, dokud kouzlo nevyprší nebo dokud příšery nebudou zabity.~ +%atsymbol%96=~Vyvolání nestvůr VII~ +%atsymbol%95=~Vyvolání nestvůr IV (vyvolávání) +Úroveň: 6 +Dosah: 36 metrů +Trvání: 5 kol + 1 kolo/úroveň +Doba kouzlení: 6 +Rozsah: zvláštní +Hod na záchranu: žádný +V kole, kdy je toto kouzlo sesláno, se v jeho dosahu objeví 1-3 nestvůry 4. úrovnÄ›, které budou útoÄit na ÄarodÄ›jovy protivníky, dokud nevyprší stanovený Äas nebo dokud příšery nebudou zabity.~ +%atsymbol%94=~Vyvolání nestvůr IV~ +%atsymbol%93=~Lebka~ +%atsymbol%92=~Monster Transparency +Do not translate~ +%atsymbol%91=~Monster Transparancy Item~ +%atsymbol%90=~Stín~ +%atsymbol%89=~Stín~ +%atsymbol%88=~Vyvolání stínu (vyvolávání, nekromancie) +Úroveň: 5 +Dosah: dohled sesilatele +Trvání: 1 kolo + 1 kolo/úroveň +Doba kouzlení: 5 +Rozsah: krychle 3 metry +Hod na záchranu: žádný +Za každé tÅ™i úrovnÄ› ÄarodÄ›je vyvolá toto kouzlo jeden stín, který bude plnit rozkazy svého sesilatele, útoÄit na jeho nepřátele a vykonávat úkoly, dokud nepomine doba úÄinnosti nebo dokud nebude zabit.~ +%atsymbol%87=~Vyvolání stínu~ +%atsymbol%86=~Železná pÄ›st~ +%atsymbol%85=~Železná pÄ›st~ +%atsymbol%84=~Zasažen odpornou chorobou~ +%atsymbol%83=~Nemocný~ +%atsymbol%82=~Otrávený~ +%atsymbol%81=~Jed~ +%atsymbol%80=~Ocelové tÄ›lo (promÄ›na) +Úroveň: 8 +Dosah: sesilatel +Trvání: 2 tahy +Doba kouzlení: 8 +Rozsah: sesilatel +Hod na záchranu: žádný +Toto kouzlo promÄ›ní mágovo tÄ›lo v živoucí ocel a pÅ™idá mu mocné odolnosti a schopnosti drtivého zranÄ›ní. Po dobu jeho trvání získává uživatel 100% odolnost vůÄi elektÅ™inÄ›, 50% odolnost vůÄi ohni a 25% odolnost vůÄi drtivému zranÄ›ní. Kouzla, napadající sesilatelovo dýchání nebo fyziologii, budou zcela ignorována. Nadto bude ÄarodÄ›jova síla zvýšena na 25 a bude moci útoÄit dvakrát za kolo ocelovými pÄ›stmi, které budou působit zranÄ›ní ve výši 2k4 životů + patÅ™iÄné bonusy za sílu. Oproti tomu sesilatelova pohyblivost bude znaÄnÄ› neobratná a pomalá, rychlost chůze klesne na 25% normálního stavu a mág nebude moci po dobu trvání 'ocelového tÄ›la' sesílat žádná kouzla.~ +%atsymbol%79=~Ocelové tÄ›lo~ +%atsymbol%78=~BezvÄ›domí~ +%atsymbol%77=~Mocný výkÅ™ik +(Vzývání) +Úroveň: 8 +Dosah: sesilatel +Trvání: okamžité +Doba kouzlení: 1 +Rozsah: elipsa 9 metrů dlouhá a 3 metry Å¡iroká +Hod na záchranu: poloviÄní újma +Mocným výkÅ™ikem uvolní mág omraÄující sílu v kuželu 9 metrů dlouhém a 3 metry Å¡irokém. Toto kouzlo je pro uživatele mimořádnÄ› namáhavé a nebezpeÄné - odebírá mu 2k4 životů a musí si hodit na záchranu pÅ™ed kouzlem, jinak na jedno kolo upadne do bezvÄ›domí. Bytosti s vrhem na životy 5 a ménÄ› okamžitÄ› umírají. VÅ¡ichni ostatní v dané oblasti si musí hodit na záchranu pÅ™ed kouzlem. Ti, jimž se to nepodaří, budou na dvÄ› kola omráÄeni, na ÄtyÅ™i kola ohluÅ¡eni a utrpí zranÄ›ní ve výši 4k12 životů. Ti, kdož v záchranném vrhu uspÄ›jí, budou omráÄeni na 1 kolo, ohluÅ¡eni na 2 kola a pÅ™ijdou o 2k12 životů.~ +%atsymbol%76=~Mocný výkÅ™ik~ +%atsymbol%75=~Okouzlený~ +%atsymbol%74=~Pod vlivem straÅ¡livého oÄarování~ +%atsymbol%73=~Ovládnut~ +%atsymbol%72=~Selhání morálky: panika~ +%atsymbol%71=~Opilý~ +%atsymbol%70=~Zmatený~ +%atsymbol%69=~OtupÄ›lá mysl~ +%atsymbol%68=~Držený~ +%atsymbol%67=~Ochromen~ +%atsymbol%66=~ZnehybnÄ›ní~ +%atsymbol%65=~VyÄiÅ¡tÄ›ní mysli (ochrana) +Úroveň: 8 +Dosah: sesilatel +Trvání: 1 den +Doba kouzlení: 1 +Rozsah: sesilatel +Hod na záchranu: žádný +V zájmu sebekontroly a soukromí zaÅ¡títí 'vyÄiÅ¡tÄ›ní mysli' mágovu duÅ¡i téměř pÅ™ed každým úÄinkem mentálního působení - zmámení, ovládání, nadvlády, strachu, slabomyslnosti a jakéhokoli působení kÅ™išťálových koulí nebo jiných věšteckých metod.~ +%atsymbol%64=~VyÄiÅ¡tÄ›ní mysli~ +%atsymbol%63=~UduÅ¡ení +(PromÄ›na) +Úroveň: 7 +Dosah: dohled sesilatele +Trvání: 4 kola +Doba kouzlení: 7 +Rozsah: okruh 3 metry +Hod na záchranu: poloviÄní újma +Toto kouzlo pÅ™ipraví vÅ¡echny v dané oblasti o dech. StvoÅ™ení, která nedýchají, jím nebudou nijak postižena. DuÅ¡ení tvorové utrpí postih -4 vůÄi obrannému Äíslu, -4 vůÄi hodu na zásah, -6 vůÄi obratnosti, budou mít o jeden útok za kolo ménÄ›, poloviÄní schopnost pohybu a v každém kole ztratí 4k8 životů. Úspěšný záchranný hod vÅ¡echny úÄinky zruší, až na zranÄ›ní 2k8 v každém kole. Následky se zaÄnou vytrácet poté, co se oběť dostane z kritického území, i když potÅ™ebuje celé kolo k tomu, aby chytla druhý dech.~ +%atsymbol%62=~UduÅ¡ení~ +%atsymbol%61=~Kyselinová bouÅ™e +(Vzývání) +Úroveň: 7 +Dosah: dohled sesilatele +Trvání: 1 kolo/úroveň +Doba kouzlení: 7 +Rozsah: okruh 6 metrů +Hod na záchranu: poloviÄní újma +Toto kouzlo rozpoutá v oblasti svého působení prudký kyselinový liják, který v každém z prvních tří kol ubírá 1-4 životy, v dalších tÅ™ech 1-6 a v každém kole následujícím 1-8 životů. PÅ™emístÄ›ní z oblasti působení neuchrání postiženou bytost od dalších ztrát, neboÅ¥ kyselina pÅ™ilne ke kůži a každý, kdo se nacházel v okruhu deÅ¡tÄ›, je zraňován po celou dobu trvání kouzla. ObÄ›ti si po svém zasažení v každém kole hází na záchranu pÅ™ed kouzlem - jsou-li vrhy úspěšné, utrpí v daném koule pouze poloviÄní újmu.~ +%atsymbol%60=~Kyselinová bouÅ™e~ +%atsymbol%59=~Trolí odolnost (nekromancie) +Úroveň: 6 +Dosah: sesilatel +Trvání: 2 tahy +Doba kouzlení: 6 +Rozsah: sesilatel +Hod na záchranu: žádný +Toto kouzlo obdaří sesilatele odolností trola, která mu umožní regenerovat 5 životů za kolo až do výše jeho normálního maxima.~ +%atsymbol%58=~Trolí odolnost~ +%atsymbol%57=~Kostlivec~ +%atsymbol%56=~Kostlivec~ +%atsymbol%55=~PožíraÄ duší +(Nekromancie) +Úroveň: 6 +Dosah: dohled sesilatele +Trvání: okamžité +Doba kouzlení: 5 +Rozsah: polomÄ›r 3 metry +Hod na záchranu: žádný +PožíraÄ duší způsobí vÅ¡em živým bytostem v okruhu tří metrů zranÄ›ní ve výši 3k8 životů. Každý, kdo v jeho důsledku zahyne, bude zniÄen a jeho podstata se promÄ›ní v kostlivce s hodem na životy 3, kterého může mág ovládat. VÅ¡echny takto zemÅ™elé obÄ›ti také sesilateli na 1 tah pÅ™idají bonus +1 k síle, obratnosti a odolnosti. PožíraÄ duší neúÄinkuje na nemrtvé, postavené nebo elementární bytosti.~ +%atsymbol%54=~PožíraÄ duší~ +%atsymbol%53=~KostÄ›ná Å¡ipka~ +%atsymbol%52=~KostÄ›ná Å¡ipka~ +%atsymbol%51=~KostÄ›né Å¡ipky (nekromancie) +Úroveň: 6 +Dosah: sesilatel +Trvání: 5 kol +Doba kouzlení: 5 +Rozsah: sesilatel +Hod na záchranu: žádný +Po vyslovení zaklínadla se vytvoří devÄ›t Å¡ipek, které může sesilatel použít, avÅ¡ak po dobu trvání kouzla nemá možnost je odložit. Å ipky mají útoÄnou sílu +3 a zraňují za 1k4 životů. Zasažený si musí hodit na záchranu proti smrti, jinak ztratí jeÅ¡tÄ› 2k6 životů a jeho síla bude na 5 kol snížena o 3 body. Uživatelova odbornost na Å¡ipky (nebo její absence) nemá na pravdÄ›podobnost zásahu žádný vliv.~ +%atsymbol%50=~KostÄ›né Å¡ipky~ +%atsymbol%49=~Otilukova zmrazující koule (promÄ›na, vzývání) +Úroveň: 6 +Dosah: dohled sesilatele +Trvání: okamžité +Doba kouzlení: 6 +Rozsah: 1 bytost +Hod na záchranu: zruší kouzlo +Toto kouzlo vypálí na protivníka paprsek chladu, jenž má dosah v okruhu dohledu ÄarodÄ›je a způsobuje zranÄ›ní chladem za 3-6 životů/úroveň sesilatele. Pokud se cíli zdaří hod na záchranu, vyhne se paprsku, a tím i veÅ¡kerým zranÄ›ním.~ +%atsymbol%48=~Otilukova zmrazující koule~ +%atsymbol%47=~Plamenný rubáš +(Vzývání) +Úroveň: 5 +Dosah: dohled sesilatele +Trvání: 1 kolo/za každé 2 úroveň sesilatele +Doba kouzlení: 5 +Rozsah: 1 bytost +Hod na záchranu: zruší kouzlo +Toto kouzlo zapříÄiní vzplanutí bytosti, pokud se jí nepodaří záchranný hod proti kouzlu. StvoÅ™ení je v každém kole spalováno za 2-12 životů (aÄkoliv je mu v každém následujícím kole umožnÄ›n nový záchranný hod, jímž se může vyhnout dalším zranÄ›ním) a dokud je magie aktivní, způsobuje proud plamenů vycházející z hořícího cíle každému do tří metrů od nÄ›j zranÄ›ní ohnÄ›m za 1-4 životy. Plamenný rubáš se zvlášť vyplatí používat na rozptýlené skupinky trolů Äi ledových salamandrů.~ +%atsymbol%46=~Plamenný rubáš~ +%atsymbol%45=~Žíravá koule +(Vyvolávání) +Úroveň: 4 +Dosah: dohled sesilatele +Trvání: zvláštní +Doba kouzlení: 4 +Rozsah: zvláštní +Hod na záchranu: zvláštní +Jedná se o zářivou smaragdovou kouli kyseliny, kterou může sesilatel nasmÄ›rovat na zvolené místo v dohledu. Když koule dorazí k cíli, vybuchne a smáÄí nepřítele mocnou žíravinou. DotyÄný tak utrpí 1k4 zranÄ›ní kyselinou na úroveň sesilatele, až do maxima 12k4. Po prvotním zasažení si musí oběť hodit na záchranu, aby se vyhnula dalšímu zranÄ›ní. Pokud se vrh nezdaří, bude v následujících kolech opÄ›t zraňována kyselinou, v každém kole vždy o dva hody ménÄ›. Například ÄarodÄ›j na 8. úrovni způsobí tímto kouzlem v prvním kole zranÄ›ní 8k4, ve druhém kole 6k4, ve tÅ™etím 4k4, ve Ätvrtém 2k4 a v kole pátém kouzlo vyprší. V každém kole má protivník k dispozici hod na záchranu proti kouzlu, Äímž se může další újmÄ› vyhnout. +Žíravá koule svou kyselinu rozstříkne též v polomÄ›ru 1,5 metru kolem primárního cíle. Každá bytost v dané oblasti si musí hodit na záchranu proti pÅ™emÄ›nÄ›/znehybnÄ›ní, nebo utrpí zranÄ›ní 1k4 na každých pÄ›t úrovní sesilatele. Tyto "stříkance" vÅ¡ak již žádnou následnou újmu nepůsobí.~ +%atsymbol%44=~Žíravá koule~ +%atsymbol%43=~Hluchota~ +%atsymbol%42=~VýkÅ™ik +(Vzývání) +Úroveň: 4 +Dosah: sesilatel +Trvání: okamžité +Doba kouzlení: 1 +Rozsah: elipsa 9 metrů dlouhá a 3 metry Å¡iroká +Hod na záchranu: poloviÄní újma +Toto kouzlo mága obdaří straÅ¡livými hlasovými schopnostmi, díky nimž může vydat ohluÅ¡ující výkÅ™ik, který se rozlehne v oblasti o délce 9 metrů, s průmÄ›rem 3 metry ve svém nejzazším bodÄ›. Každý, kdo se nachází na kritickém území, bude na 2k6 kol ohluÅ¡en a utrpí zranÄ›ní 4k6 životů. Úspěšný hod na záchranu proti kouzlu hluchotu zruší a omezí veÅ¡kerou újmu na polovinu.~ +%atsymbol%41=~VýkÅ™ik~ +%atsymbol%40=~Mordenkainenovy silové stÅ™ely +(Vzývání) +Úroveň: 4 +Dosah: dohled uživatele +Trvání: okamžité +Doba kouzlení: 4 +Rozsah: zvláštní +Hod na záchranu: zvláštní +Toto kouzlo vytvoří blyÅ¡tivou kouli magické energie, která vytryskne z uživatelovy ruky a okamžitÄ› zasáhne cíl, podobnÄ› jako kouzlo 'magická stÅ™ela'. Mág na 7. úrovni vytvoří jednu stÅ™elu, k níž se pÅ™idávají další na každé tÅ™i úrovnÄ› uživatele - takže dvÄ› stÅ™ely na 10. úrovni, tÅ™i na 13., ÄtyÅ™i na 16. atd., až do maxima sedmi stÅ™el na 25. úrovni. Každá z nich způsobí zranÄ›ní 2k4 a posléze vybuchne do okruhu 1,5 metru, pÅ™iÄemž způsobí další bod zranÄ›ní na úroveň sesilatele - například ÄarodÄ›j na 12. úrovni může vyvolat dvÄ› silové stÅ™ely, z nichž každá způsobí újmu 2k4 +12. Zasažení tvorové si mohou hodit na záchranu proti kouzlu a vyhnout se tak zranÄ›ní od výbuchu, ale úÄinek stÅ™ely samotné nelze nijak zvrátit. Mágovo kouzlo 1. úrovnÄ› "Å¡tít" vÅ¡ak tyto stÅ™ely zcela zneÅ¡kodňuje, vÄetnÄ› následné újmy od exploze.~ +%atsymbol%39=~Mordenkainenovy silové stÅ™ely~ +%atsymbol%38=~BeznadÄ›j~ +%atsymbol%37=~OmráÄení~ +%atsymbol%36=~Emoce: BeznadÄ›j +(Zaříkávání) +Úroveň: 4 +Dosah: dohled sesilatele +Trvání: 1 tah +Doba kouzlení: 4 +Rozsah: okruh 3 metry +Hod na záchranu: zruší kouzlo +Toto kouzlo vzbudí u vÅ¡ech tvorů v dané oblasti pocit beznadÄ›je. VÅ¡echny jím ovlivnÄ›né bytosti zůstanou po dobu trvání neÄinnÄ› stát a nebudou se nijak projevovat.~ +%atsymbol%35=~Emoce: BeznadÄ›j~ +%atsymbol%34=~Panika~ +%atsymbol%33=~Emoce: Strach +(Zaříkávání) +Úroveň: 4 +Dosah: dohled uživatele +Trvání: 5 kol +Doba kouzlení: 4 +Rozsah: okruh 3 metry +Hod na záchranu: zruší kouzlo +Toto kouzlo vzbudí u vÅ¡ech tvorů v dané oblasti pocit strachu. VÅ¡echna jím ovlivnÄ›ná stvoÅ™ení prchají po dobu 5 kol. Toto kouzlo odstraní úÄinky kouzla "Odvaha".~ +%atsymbol%32=~Emoce: Strach~ +%atsymbol%31=~Emoce: NadÄ›je +(Zaříkávání/OÄarování) +Úroveň: 4 +Dosah: dohled sesilatele +Trvání: 5 tahů +Doba kouzlení: 4 +Rozsah: polomÄ›r 3 metry +Hod na záchranu: zruší kouzlo +Toto kouzlo probudí v oblasti svého působení pocit nadÄ›je. VÅ¡ichni jím ovlivnÄ›ní tvorové získají posílenou morálku a +2 k hodu na záchranu, hodu na útok a hodu na působené zranÄ›ní.~ +%atsymbol%30=~Emoce: NadÄ›je~ +%atsymbol%29=~Emoce: odvaha +(Zaříkávání/OÄarování) +Úroveň: 4 +Dosah: dohled sesilatele +Trvání: 5 tahů +Doba kouzlení: 4 +Rozsah: polomÄ›r 3 metry +Hod na záchranu: zruší kouzlo +Toto kouzlo dodá vÅ¡em tvorům v dané oblasti velkou odvahu. VÅ¡echny jím ovlivnÄ›né bytosti získávají +1 na útok, +3 k hodu na zranÄ›ní a +5 doÄasných životů (které mohou pÅ™esahovat maximální zdraví osoby). Toto kouzlo anuluje vÅ¡echny úÄinky strachu, které snad byly pÅ™i jeho seslání v oblasti působení přítomny.~ +%atsymbol%28=~Emoce: Odvaha~ +%atsymbol%27=~Berserk~ +%atsymbol%26=~Beltynova žhavá krev (nekromancie) +Úroveň: 4 +Dosah: dohled sesilatele +Trvání: 2 kola +Doba kouzlení: 4 +Rozsah: 1 bytost +Hod na záchranu: zruší kouzlo +Beltynova žhavá krev zmÄ›ní krev cíle v oheň a v každém kole mu způsobí zranÄ›ní za 3-12 životů. Nepřítel má v každém kole k dispozici hod na záchranu pÅ™ed kouzlem s penalizací -3; je-li úspěšný, kouzlo se ruší. Toto zaklínadlo nemá vliv na nemrtvé nebo astrální bytosti (jako jsou elementálové), které krev nemají. Je-li zasažený tvor odolný vůÄi ohni, úÄinky kouzla tuto odolnost snižují nebo úplnÄ› anulují.~ +%atsymbol%25=~Beltynova žhavá krev~ +%atsymbol%24=~NiÄivý oÅ¡tÄ›p (vzývání) +Úroveň: 3 +Dosah: 18 metrů +Trvání: okamžité +Doba kouzlení: 3 +Rozsah: zvláštní +Hod na záchranu: poloviÄní újma +Tímto kouzlem vyÅ¡le sesilatel na zvolený cíl do vzdálenosti 18 metrů silový oÅ¡tÄ›p. Každý v dráze jeho letu utrpí drtivá zranÄ›ní ve výši 5k4 +2 na úroveň sesilatele (maximum +30). ObÄ›ti si mohou hodit na záchranu proti kouzlu a pokud uspÄ›jí, pÅ™ijdou jen o polovinu životů.~ +%atsymbol%23=~NiÄivý oÅ¡tÄ›p~ +%atsymbol%22=~OmráÄen~ +%atsymbol%21=~Ledový oÅ¡tÄ›p (vzývání) +Úroveň: 3 +Dosah: dohled sesilatele +Trvání: okamžité +Doba kouzlení: 3 +Rozsah: 1 bytost +Hod na záchranu: zvláštní +Toto kouzlo vrhne na urÄený cíl magický ledový oÅ¡tÄ›p, který zasahuje automaticky, působí zranÄ›ní za 5-30 životů a donutí oběť k hodu na záchranu, jinak bude na 1-4 kola omráÄena.~ +%atsymbol%20=~Ledový oÅ¡tÄ›p~ +%atsymbol%19=~Úprava obratnosti~ +%atsymbol%18=~KoÄiÄí mrÅ¡tnost (promÄ›na) +Úroveň: 2 +Dosah: dotyk +Trvání: 1 hodina/úroveň +Doba kouzlení: 2 +Rozsah: 1 bytost +Hod na záchranu: žádný +Toto kouzlo magicky zvýší obratnost zvoleného tvora. Výše závisí na povolání dotyÄného: zlodÄ›ji obdrží 1k8 bodů, bojovníci a mágové 1k6 a kněží 1k4 bodů. KoÄiÄí mrÅ¡tnost nemůže zvýšit obratnost na více než 20 bodů.~ +%atsymbol%17=~KoÄiÄí mrÅ¡tnost~ +%atsymbol%16=~Dekahůl~ +%atsymbol%15=~Dekahůl~ +%atsymbol%14=~Dekahůl (vzývání) +Úroveň: 2 +Dosah: sesilatel +Trvání: 1 kolo/úroveň +Doba kouzlení: 2 +Rozsah: sesilatel +Hod na záchranu: žádný +Toto kouzlo vytvoří v rukou ÄarodÄ›je silovou hůl. Je považována za magickou zbraň, která pÅ™i úspěšném zásahu své obÄ›ti ubere 1-6 životů a působí i na bytosti imunní vůÄi normálním zbraním. Je to vÅ¡ak hůl, takže pokud mág nemá odbornost na hole, používá Dekahůl s postihem. Tato hůl má také moc pÅ™i prvním úderu vysát z cíle 1-2 životy, které se pÅ™idají k uživatelovým. Ten si jimi vÅ¡ak může pouze uzdravit zranÄ›ní, která utrpÄ›l; poÄet jeho životů nemůže v tomto případÄ› pÅ™evýšit normální maximum.~ +%atsymbol%13=~Dekahůl~ +%atsymbol%12=~~ +%atsymbol%11=~Snillocův roj snÄ›hových koulí +(Vzývání) +Úroveň: 2 +Dosah: dohled sesilatele +Trvání: okamžité +Doba kouzlení: 2 +Rozsah: okruh 7,5 metru +Hod na záchranu: poloviÄní újma +Toto kouzlo vyvolá sprÅ¡ku snÄ›hových koulí, které vypadávají z místa v dosahu ÄarodÄ›je a zasáhnou vÅ¡e v oblasti úÄinku; působí ztrátu 1-3 životů/úroveň až do maximálních 8-24 životů na 8. úrovni. Ohnivé nebo oheň obývající bytosti pak pÅ™ipraví dokonce o 1-6 životů/úroveň.~ +%atsymbol%10=~~ +%atsymbol%9=~Snillocův roj snÄ›hových koulí~ +%atsymbol%8=~Oko mysli blokuje úÄinek a mizí.~ +%atsymbol%7=~Oko meÄe blokuje úÄinek a mizí.~ +%atsymbol%6=~Oko mága blokuje úÄinek a mizí.~ +%atsymbol%5=~Oko jedu blokuje úÄinek a mizí.~ +%atsymbol%4=~Oko ducha blokuje úÄinek a mizí.~ +%atsymbol%3=~Oko stateÄnosti blokuje úÄinek a mizí.~ +%atsymbol%2=~Oko kamene blokuje úÄinek a mizí.~ +%atsymbol%1=~Toto kouzlo vyléÄí zvolenou postavu a doplní jí jedenáct životů.~ diff --git a/iwdification/dw_iwdspells_resource/tra/de_de/iwdspells.tra b/iwdification/dw_iwdspells_resource/tra/de_de/iwdspells.tra new file mode 100644 index 0000000..c160555 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/tra/de_de/iwdspells.tra @@ -0,0 +1,1161 @@ +%atsymbol%359=~Mut~ +%atsymbol%358=~Hoffnung~ +%atsymbol%357=~Katzenanmut~ +%atsymbol%356=~Gerechter Zorn der Treuen~ +%atsymbol%355=~Gebet~ +%atsymbol%354=~Blutrausch~ +%atsymbol%353=~Rezitation~ +%atsymbol%352=~Begeisterung~ +%atsymbol%351=~Tierwut~ +%atsymbol%350=~Eisenkörper~ +%atsymbol%349=~wurde versteinert~ +%atsymbol%348=~Unantastbarkeit des Geistes~ +%atsymbol%347=~Schmerz~ +%atsymbol%346=~Mit Teilungszauber belegt~ +%atsymbol%345=~Stärkung~ +%atsymbol%344=~Gedankenleere~ +%atsymbol%343=~Verwandlung in einen Erdelementar~ +%atsymbol%342=~Verwandlung in einen Feuerelementar~ +%atsymbol%341=~Kriegsgesang von Sith - Rüstungsbonus und Regeneration~ +%atsymbol%340=~"Der Kriegsgesang von Sith" +Alle Verbündeten im Umkreis von 10 Metern erhalten einen +2 Bonus zur Rüstungsklasse, +10% Resistenz gegen Klingen-, Stich-, Wucht- und Geschoßschäden, und die Fähigkeit 2 Trefferpunkte pro Runde zu regenerieren.~ +%atsymbol%339=~Kriegsgesang von Sith~ +%atsymbol%338=~Verzaubert~ +%atsymbol%337=~Das Verlangen der Sirene - verzaubert Wesen~ +%atsymbol%336=~"Die Sehnsucht der Sirene" +Alle Verbündeten im Umkreis von 10 Metern müssen einen Rettungswurf gegen Zauber bestehen, sonst werden sie verzaubert und sind für die Dauer einer Runde oder bis sie Schaden erleiden unfähig eine Aktion zu vollführen.~ +%atsymbol%335=~Das Verlangen der Sirene~ +%atsymbol%334=~Das Lied von Kaudies - widersteht Geräuschangriffen~ +%atsymbol%333=~"Das Lied von Kaudies" +Alle Verbündeten im Umkreis von 10 Metern erhalten eine 50% Chance, die Effekte von Zaubern wie Stille, Brüllen, Mächtiges Brüllen, Befehl, Höherer Befehl, oder sonstige auf Akkustik basierende Zauber abzuwenden.~ +%atsymbol%332=~Das Lied von Kaudies~ +%atsymbol%331=~Tymoras Melodie - Glücksbonus und Geschicklichkeitsbonus~ +%atsymbol%330=~"Tymoras Melodie" +Alle Verbündeten im Umkreis von 10 Metern erhalten +1 zu Glück, +3 zu Rettungswürfen, +10 zu Sagenkunde, und einen 10% Bonus zu allen Diebesfähigkeiten.~ +%atsymbol%329=~Tymoras Melodie~ +%atsymbol%328=~Die Geschichte von Curran Starkherz - Immunität gegen Angst~ +%atsymbol%327=~"Die Geschichte des Curran Starkherz" +Alle Verbündeten im Umkreis von 10 Metern erhalten Immunität gegen Furcht für die Dauer des Liedes, und alle bereits bestehenden auferlegten Furcht-Zauber werden augenblicklich unwirksam.~ +%atsymbol%326=~Die Geschichte von Curran Starkherz~ +%atsymbol%325=~Die Ballade von den drei Helden - Kampfbonus~ +%atsymbol%324=~"Die Ballade der drei Helden" +Alle Verbündeten im Umkreis von 10 Metern erhalten +1 auf Ihre Angriffs-, Schadens- und Rettungswürfe.~ +%atsymbol%323=~Die Ballade von den drei Helden~ +%atsymbol%322=~Setzt Säuredampf frei~ +%atsymbol%321=~Verdorren~ +%atsymbol%320=~Verdorren +(Nekromantie) +Stufe: 7 +Schule: Nekromantie +Reichweite: Berührung +Wirkungsdauer: 1 Runde je 2 Stufen des Anwenders +Zeitaufwand: 7 +Wirkungsbereich: 1 Wesen +Rettungswurf: Neg. +Dieser mächtige Zauber lässt die Organe der berührten Kreatur aufhören zu funktionieren, verdorren und zu Staub zerfallen. Die betroffene Kreatur verliert 3 Trefferpunkte pro Sekunde. Die Wirkung hält je 2 Stufen des Anwenders 1 Runde lang an, oder bis der Zauber gebannt wird. Zum Beispiel würde ein Priester der Stufe 14 das Ziel 7 Runden lang 18 Trefferpunkte pro Runde verlieren lassen. Dieser Zauber hat keine Wirkung auf Untote, Konstrukte oder Kreaturen von anderen Ebenen. Verdorren kann nur von bösen Charakteren angewendet werden.~ +%atsymbol%319=~Verdorren~ +%atsymbol%318=~Gesang (Herbeirufung/Beschwörung) +Grad: 2 +Kampfzyklus +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: 1 Phase +Zeitaufwand: 1 Runde +Wirkungsbereich: Radius von 9 Metern +Rettungswurf: Nein +Mit Hilfe dieses Zaubers erwirkt der Priester für sich und seine Gefährten besondere himmlische Gunst und fügt seinen Gegnern gleichzeitig Schaden zu. Sobald der Priester den Zauber vollständig ausgesprochen hat, erhalten alle seine Verbündeten innerhalb des Wirkungsbereichs +1 auf ihre Angriffs-, Schadens- und Rettungswürfe, während alle Gegner in diesem Bereich einen entsprechenden Abzug von -1 erleiden. Bei mehrfacher Anwendung dieses Zaubers summieren sich die Zuschläge bzw. Abzüge nicht auf. Dieser Zauber erfordert seitens des Anwenders ein mittleres Maß an Konzentration, sodass der Priester während des Wirkens dieses Zaubergesangs keine weiteren Zauber wirken kann. Zudem wird sein Bewegungstempo halbiert.~ +%atsymbol%317=~Gesang~ +%atsymbol%316=~Furzschutzmittel für Bombardierkäfer +Do not translate~ +%atsymbol%315=~Bohrkäfer~ +%atsymbol%314=~Bohrkäfer~ +%atsymbol%313=~Bombardierkäfer~ +%atsymbol%312=~Bombardierkäfer~ +%atsymbol%311=~Rieseninsekt (Veränderung) +Grad: 4 +Tierzyklus +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: 8 Stunden +Zeitaufwand: 7 +Wirkungsbereich: 1-6 Insekten +Rettungswurf: Nein +Mit diesem Zauber ruft der Anwender kleine Insekten herbei, die dann auf gigantische Ausmaße vergrößert und zu furchterregenden Verbündeten werden. Die Stärke und Art der Insekten hängt von der Stufe des Anwenders ab. Generell gilt: Je höher die Stufe, desto stärker die herbeigerufenen Insekten.~ +%atsymbol%310=~Rieseninsekt~ +%atsymbol%309=~Kritische Wunden verursachen (Nekromantie) +Grad: 5 +Heilzyklus +Reichweite: Berührung +Wirkungsdauer: Permanent +Zeitaufwand: 8 +Wirkungsbereich: Das berührte Wesen +Rettungswurf: Nein +DieserZauber ist der entgegengesetzte Zauber von "Kritische Wunden heilen". Anstatt das berührte Wesen zu heilen, verletzt es dieses. Wenn die Berührung des Priesters erfolgreich ist, werden dem Ziel 27 Schadenspunkte zugefügt. Diese Wirkung tritt beim nächsten Angriff des Priesters ein, allerdings hat er dazu nur 2 Runden Zeit, danach erlischt der Zauber. Auch wenn der Priester das Ziel nicht trifft, ist der Zauber verbraucht. Ein Rettungswurf ist nicht möglich.~ +%atsymbol%308=~Kritische Wunden verursachen~ +%atsymbol%307=~Schwere Wunden verursachen (Nekromantie) +Grad: 4 +Heilzyklus +Reichweite: Berührung +Wirkungsdauer: Permanent +Zeitaufwand: 7 +Wirkungsbereich: Das berührte Wesen +Rettungswurf: Nein +Dieser Zauber ist der entgegengesetzte Zauber von "Schwere Wunden heilen". Anstatt das berührte Wesen zu heilen, verletzt es dieses. Wenn die Berührung des Priesters erfolgreich ist, werden dem Ziel 17 Schadenspunkte zugefügt. Diese Wirkung tritt beim nächsten Angriff des Priesters ein; allerdings hat er dazu nur 2 Runden Zeit, danach erlischt der Zauber. Auch wenn der Priester das Ziel nicht trifft, ist der Zauber verbraucht. Ein Rettungswurf ist nicht möglich.~ +%atsymbol%306=~Schwere Wunden verursachen~ +%atsymbol%305=~2 Stufen verloren~ +%atsymbol%304=~Entzug von Lebensenergie +(Nekromantie) +Stufe: 7 +Schule: Bannzauber +Reichweite: Berührung +Wirkungsdauer: permanent +Zeitaufwand: 3 +Wirkungsbereich: 1 Wesen +Rettungswurf: keiner +Die Anwendung dieses Zaubers eröffnet eine Verbindung zwischen der Ebene des Anwenders und der negativen Energieebene. Der Anwender wirkt dabei als Verbindungsleitung zwischen den beiden Ebenen, entzieht dem Opfer Lebensenergie und überträgt sie in die negative Energieebene, wodurch dem Opfer zwei Stufen entzogen werden. Das Ziel dieses Zaubers verliert die Stufen, Trefferwürfel, Trefferpunkte und Fähigkeiten dauerhaft. Diese Stufen können nur durch den Priesterzauber "Genesung" wiederhergestellt werden. Dieser Zauber hat keine Wirkung auf Untote, Konstrukte oder Wesen von anderen Ebenen. Er kann nur von bösen Charakteren angewendet werden.~ +%atsymbol%303=~Entzug von Lebensenergie~ +%atsymbol%302=~Verstrickt~ +%atsymbol%301=~Schwankender Hügel~ +%atsymbol%300=~Schwankender Hügel~ +%atsymbol%299=~Pirscher (Herbeirufung) +Grad: 7 +Pflanzenzyklus +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: 8 Stunden +Zeitaufwand: 1 Runde +Wirkungsbereich: Speziell +Rettungswurf: Nein +Mit diesem Zauber werden zwei schwankende Haufen geschaffen. Diese Wesen helfen dem Anwender bereitwillig im Kampf oder bei allen anderen Aufgaben, die ihnen zugewiesen werden und die sie ausführen können.~ +%atsymbol%298=~Pirscher~ +%atsymbol%297=~Nebel von Eldath (Anrufung) +Grad: 7 +Elementarzyklus +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: 1 Runde +Zeitaufwand: 1 Runde +Wirkungsbereich: Radius von 3 Metern +Rettungswurf: Keiner +Dieser Zauber legt eine silberblaue Nebeldecke über den Wirkungsbereich - jedes Wesen in diesem Nebel wird von Krankheit und Gift geheilt und erhält außerdem Heilung für 25 Schadenspunkte.~ +%atsymbol%296=~Nebel von Eldath~ +%atsymbol%295=~Höherer Schild des Lathander +(Herbeirufung) +Grad: 7 +Sicherungszyklus +Reichweite: Berührung +Wirkungsdauer: 3 Runden +Zeitaufwand: 1 Runde +Wirkungsbereich: 1 Wesen +Rettungswurf: Nein +Dieser Zauber verleiht dem Ziel während der Wirkungsdauer des Zaubers 100 % Resistenz gegen Magie und Immunität gegen Schaden. Böse Wesen können vom Höheren Schild des Lathander nicht geschützt werden. Dieser Zauber kann nur von guten Charakteren angewendet werden.~ +%atsymbol%294=~Höherer Schild des Lathander~ +%atsymbol%293=~Zerstörung (Nekromantie) +Grad: 7 +Heilzyklus +Reichweite: Berührung +Wirkungsdauer: Augenblicklich +Zeitaufwand: 1 Runde +Wirkungsbereich: Anwender +Rettungswurf: Speziell +Dieser Zauber zerstört ein Ziel mit sofortiger Wirkung, indem er das Opfer in Stücke reißt. Dem Opfer steht ein Rettungswurf gegen Tod -4 zu, durch den es den Schaden auf 8-48 Punkte reduzieren und überleben kann. Der Zauber "Zerstörung" kann nur von bösen Charakteren angewendet werden. Außerdem kann ein Charakter, der durch den Zauber "Zerstörung" getötet wurde, nicht mit dem Zauber "Tote erwecken" oder "Wiedererweckung" ins Leben zurückgeholt werden.~ +%atsymbol%292=~Zerstörung~ +%atsymbol%291=~Zauber wirkungslos~ +%atsymbol%290=~Unantastbarkeit des Geistes +(Bannzauber) +Grad: 7 +Schutzzyklus +Reichweite: Anwender +Wirkungsdauer: 1 Phase pro Stufe +Zeitaufwand: 1 Runde +Wirkungsbereich: Anwender +Rettungswurf: Nein +Mit diesem Zauber wird der Geist des Anwenders gegen jegliche äußeren Einflüsse gestählt. "Bezaubern", "Befehl", "Verwirrung", "Beherrschung", "Furcht", "Schwacher Geist", "Festhalten", "Schlaf" sowie alle psionischen Angriffe auf den Anwender scheitern, während dieser Zauber wirkt.~ +%atsymbol%289=~Unantastbarkeit des Geistes~ +%atsymbol%288=~Symbol der Hoffnungslosigkeit +(Herbeirufung/Beschwörung) +Grad: 7 +Sicherungszyklus +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: 2 Phasen +Zeitaufwand: 3 +Wirkungsbereich: Radius von 18 m +Rettungswurf: Keine Wirkung +Alle Wesen, die sich im Umkreis von 18 Metern um das Symbol der Hoffnungslosigkeit befinden, wenn dieses beschworen wird, müssen einen Rettungswurf gegen Zauber mit -2 Strafpunktabzügen ausführen. Wenn dieser fehlschlägt, bleiben sie wie angewurzelt stehen und werden von einem Gefühl der Depression und Kapitulation übermannt, und werden nichts tun, um sich im Angriffsfall zu verteidigen.~ +%atsymbol%287=~Symbol der Hoffnungslosigkeit~ +%atsymbol%286=~Quälende Schmerzen~ +%atsymbol%285=~Symbol des Schmerzes +(Herbeirufung/Beschwörung) +Grad: 7 +Sicherungszyklus +Reichweite: Berührung +Wirkungsdauer: 2-20 Phasen +Zeitaufwand: 3 +Wirkungsbereich: Radius von 20 Metern +Rettungswurf: Keine Wirkung +Alle Wesen, die sich im Umkreis von 20 Metern um das Symbol des Schmerzes befinden, wenn dieses angerufen wird, müssen einen Rettungswurf gegen Zauber ausführen. Wenn dieser fehlschlägt, werden sie von Schmerzen überwältigt, und ihnen werden bei Angriffswürfen 4 Punkte, bei der Geschicklichkeit 2 Punkte und bei ihrer Rüstungsklasse 2 Punkte abgezogen.~ +%atsymbol%284=~Symbol des Schmerzes~ +%atsymbol%283=~Spiritueller Zorn (Anrufung) +Grad: 6 +Kampfzyklus +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: Augenblicklich +Zeitaufwand: 2 +Wirkungsbereich: Speziell +Rettungswurf: 1/2 +Wenn dieser Zauber ausgesprochen wird, wird der Priester zum Mittelpunkt spiritueller Energie, die daraufhin wie Blitze in vier Richtungen aus dem Anwender hervorschießt. Der Anwender gibt das Ziel für einen dieser Blitze an, und die anderen schießen in die entgegengesetzte Richtung sowie im rechten Winkel zu dieser Richtung los, wodurch ein kreuzförmiges Muster entsteht. Alle Wesen, die von den Blitzen getroffen werden, erleiden 6-42 magische Schadenspunkte, die durch einen Rettungswurf halbiert werden können. Wesen mit der gleichen moralischen Gesinnung wie der Anwender (gut, neutral oder böse) bleiben von der Wirkung dieses Zaubers verschont.~ +%atsymbol%282=~Spiritueller Zorn~ +%atsymbol%281=~Wirbelwind (Anrufung) +Grad: 6 +Anrufungszyklus +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: Speziell +Zeitaufwand: 9 +Wirkungsbereich: Speziell +Rettungswurf: Speziell +Durch diesen Zauber wird ein kleiner Wirbelwind in der Nähe des Anwenders erzeugt, den der Anwender auf einen Punkt in seiner Sichtweite richten kann. Wenn der Wirbelwind sein Ziel erreicht, verliert der Anwender die Kontrolle über ihn, und der Wirbelwind fliegt nach dem Zufallsprinzip umher, wobei er sowohl Feinden als auch Freunden Schaden zufügen kann. Der Anwender ist immun gegen seinen eigenen Zauber, und alle elementaren oder riesengroßen Wesen entgehen der Wirkung ebenfalls. Wenn ein Wesen in den Weg des Wirbelwinds gerät, erleidet es 2-16 Schadenspunkte durch Wucht und 2-16 Schadenspunkte durch Klinge. Außerdem muss es einen Rettungswurf gegen Odemwaffen durchführen, sonst wird es 2 Runden lang betäubt. Wesen mit 2 oder weniger Trefferwürfeln werden durch diesen Zauber automatisch getötet. Es können maximal 8 Opfer Schaden nehmen, danach löst der Wirbelwind sich auf.~ +%atsymbol%280=~Wirbelwind~ +%atsymbol%279=~Chaosschild (Bannzauber) +Grad: 6 +Schutzzyklus +Reichweite: Anwender +Dauer: 1 Runde pro Stufe +Zeitaufwand: 9 +Wirkungsbereich: Anwender +Rettungswurf: Nein +Dieser Zauber umgibt den Anwender mit einem schützenden Energiestrudel, der viele Angriffe abwehrt oder ablenkt. Er verleiht dem Priester einen Bonus von +6 auf die Rüstungsklasse und 50 % Widerstandskraft gegen die meisten Angriffe, wie z. B. Elektrizität, Feuer und Kälte. Zudem erhält der Anwender +2 auf alle seine Rettungswürfe sowie Immunität gegen alle Angriffe, die mit Geschosswaffen verübt werden.~ +%atsymbol%278=~Chaosschild~ +%atsymbol%277=~Massenverwundung +(Nekromantie) +Stufe: 5 +Schule: Nekromantie +Reichweite: 0 +Wirkungsdauer: Sofort +Zeitaufwand: 5 +Wirkungsbereich: Radius von 4,5 Metern +Rettungswurf: halber Schaden +Mit diesem Zauber verursacht der Priester 1W8 + (1 Punkt pro Stufe) Schaden bei nahen Feinden; ein erfolgreicher Rettungswurf gegen Zauber halbiert den Schaden. Dieser Zauber hat keine Wirkung auf Untote, Konstrukte oder Kreaturen von anderen Ebenen. Massenverwundung kann nur von bösen Charakteren angewendet werden.~ +%atsymbol%276=~Massenverwundung~ +%atsymbol%275=~Tierwut (Verzauberung) +Grad: 5 +Kampfzyklus +Reichweite: Berührung +Wirkungsdauer: 15 Runden +Zeitaufwand: 8 +Wirkungsbereich: 1 Wesen +Rettungswurf: Nein +Dieser Zauber verleiht dem Zielwesen die Wildheit eines Tieres. Das Zielwesen gewinnt eine Stärke von 19, +20 auf die Trefferpunkte, +20 % auf die Beweglichkeit und +2 auf alle Rettungswürfe. Das Ziel verliert die Fähigkeit, Zauber anzuwenden, solange die Wirkung von "Tierwut" anhält. Das betroffene Wesen kann gewöhnlich unter Kontrolle gehalten werden, solange keine Feinde in Sicht sind. Dann jedoch geht das Wesen zum Nahkampf über und nimmt dabei alles zu Hilfe, was ihm in die Hände fällt. Es besteht eine Wahrscheinlichkeit von 5 % pro Runde, dass das Ziel zum Berserker wird und sowohl Feinde als auch Freunde angreift.~ +%atsymbol%274=~Tierwut~ +%atsymbol%273=~Schutz vor Untoten (Nekromantie) +Grad: 5 +Schutzzyklus +Reichweite: Anwender +Wirkungsdauer: 1 Phase +Zeitaufwand: 7 +Wirkungsbereich: Radius von 7 Metern +Rettungswurf: Nein +Dieser Zauber verstärkt den Einfluss eines Priesters auf Untote, wobei seine Wirkung auf den Bereich um den Priester herum begrenzt und nicht beweglich ist. Jedes untote Wesen, das den Wirkungsbereich betritt, reagiert so, als wäre es von dem Priester vertrieben worden. Wenn das Vertreiben fehlschlägt, ist das untote Wesen immun gegen den Zauber, solange es den Wirkungsbereich nicht verlässt und neu betritt.~ +%atsymbol%272=~Schutz vor Untoten~ +%atsymbol%271=~Schild des Lathander +(Herbeirufung) +Grad: 5 +Sicherungszyklus +Reichweite: Berührung +Wirkungsdauer: 2 Runden +Zeitaufwand: 8 +Wirkungsbereich: 1 Wesen +Rettungswurf: Nein +Dieser Zauber verleiht einem Ziel während der Wirkungsdauer des Zaubers Immunität gegen Schaden. Böse Wesen können nicht vom Schild des Lathander geschützt werden. Nur Charakter, die nicht böse sind, können den Zauber "Schild des Lathander" anwenden.~ +%atsymbol%270=~Schild des Lathander~ +%atsymbol%269=~Spitze Steine +(Veränderung, Verzauberung) +Grad: 5 +Elementarzyklus (Erde) +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: 12 Runden +Zeitaufwand: 6 +Wirkungsbereich: Radius von 4,5 Metern +Rettungswurf: Nein +Dieser Zauber verformt den umliegenden Felsgrund in herausragende Spitzen, die sich perfekt an den Hintergrund anpassen. Alle Wesen, die den Wirkungsbereich betreten, erhalten 2-8 Schadenspunkte pro Runde.~ +%atsymbol%268=~Spitze Steine~ +%atsymbol%267=~Gerechter Zorn der Gläubigen +(Verzauberung/Bezauberung) +Grad: 5 +Kampfschule +Reichweite: Anwender +Wirkungsdauer: 1 Runde pro Stufe +Zeitaufwand: 8 +Wirkungsbereich: Radius von 10 Metern +Rettungswurf: Nein +Dieser Zauber haucht den Verbündeten des Priesters eine Art göttlichen Wahnsinn ein und verbessert damit ihre kämpferischen Fähigkeiten. Alle Verbündeten des Priesters, die sich im Wirkungsbereich aufhalten, erhalten +1 auf ihre Angriffs- und Rettungswürfe sowie einen Bonus von 1-8 Trefferpunkten für die Wirkungsdauer des Zaubers (diese Trefferpunkte können die maximale Trefferzahl des Ziels überschreiten). Alle Wesen derselben Gesinnung erhalten einen zusätzlichen Angriff pro Runde sowie +2 auf ihre Angriffe, Schadens- und Rettungswürfe.~ +%atsymbol%266=~Gerechter Zorn der Gläubigen~ +%atsymbol%265=~Wand aus Mondlicht (Anrufung) +Grad: 4 +Schutzzyklus, Sonnenzyklus +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: 1 Phase +Zeitaufwand: 7 +Wirkungsbereich: Wand von 7 Metern Länge und 1,5 Metern Breite +Rettungswurf: Nein +Dieser Zauber ruft einen schimmernden Wandteppich aus blauweißer Kraft hervor. Diese Wand ist unberührbar, erfordert keinen physischen Anker und kann leicht durchschritten werden. Böse Wesen, die sie durchschreiten, erhalten 2-20 Schadenspunkte, böse untote Wesen 5-50. Ein Wesen, das durch die Wand geschritten ist, kann nur einmal Schaden durch sie nehmen. Nur eine Wand aus Mondlicht kann jeweils wirksam sein.~ +%atsymbol%264=~Wand aus Mondlicht~ +%atsymbol%263=~Sprühende Dornen (Veränderung) +Grad: 4 +Pflanzenzyklus +Reichweite: Speziell +Wirkungsdauer: Augenblicklich +Zeitaufwand: 3 +Wirkungsbereich: Kegel von 10 Metern Länge und 8 Metern Breite +Rettungswurf: 1/2 +Mit diesem Zauber kann der Anwender Stacheln, Spitzen und Dornen aus seiner Hand hervorspringen lassen. "Sprühende Dornen" hat einen kegelförmigen Wirkungsbereich von 10 Metern Länge und 20 Metern Breite und fügt allen Wesen in diesem Bereich einen Schaden durch Spitze von 2-20 Punkten bzw. von 1-10 Punkten bei erfolgreichem Rettungswurf gegen Tod zu.~ +%atsymbol%262=~Sprühende Dornen~ +%atsymbol%261=~Ohnmächtig~ +%atsymbol%260=~Zerschmetternde Welle (Anrufung) +Grad: 4 +Elementarzyklus (Wasser) +Reichweite: 13 Meter +Wirkungsdauer: Augenblicklich +Zeitaufwand: 1 Runde +Wirkungsbereich: Welle von 1,5 Metern Breite +Rettungswurf: 1/2 +Dieser Zauber ruft eine Wasserwelle herbei, die sich in die vom Anwender gewünschte Richtung bewegt und dabei alles in ihrem Weg mit massiver Kraft trifft. Die Welle fügt allen Opfern 4-40 Schadenspunkte durch Wucht zu. Zusätzlich besteht eine Möglichkeit von 25 %, dass ein getroffenes Wesen 2 Runden lang betäubt wird, sowie eine Möglichkeit von 5 %, dass das betroffene Wesen das Bewusstsein verliert. Wenn das getroffene Wesen einen erfolgreichen Rettungswurf gegen Odemwaffen durchführt wird der Schaden halbiert, und das Wesen kann nicht betäubt oder bewusstlos werden.~ +%atsymbol%259=~Zerschmetternde Welle~ +%atsymbol%258=~Sternmetallkeule~ +%atsymbol%257=~Sternmetallkeule~ +%atsymbol%256=~Sternmetallkeule (Herbeirufung) +Grad: 4 +Kampfzyklus +Reichweite: Anwender +Wirkungsdauer: 3 Phasen +Zeitaufwand: 7 +Wirkungsbereich: Anwender +Rettungswurf: Nein +Durch diesen Zauber wird eine magische Keule aus Meteoreisen erzeugt, die einen Bonus von +2 auf ETW0 und Schaden gibt. Die Waffe kann außerdem auch Wesen verwunden, die normalerweise nur von +4 oder besseren Waffen getroffen werden können. Bonuspunkte bzw. Abzüge auf Waffenfertigkeit, Stärke und Spezialisierung werden normal angewandt. Unnatürliche Wesen (Untote, Elementare, Golems, außerplanare Wesen etc.) erleiden 2-12 zusätzliche Schadenspunkte durch Wucht.~ +%atsymbol%255=~Sternmetallkeule~ +%atsymbol%254=~Unerschöpfliches Durchhaltevermögen (Nekromantie) +Grad: 4 +Nekromantiezyklus +Reichweite: Berührung +Wirkungsdauer: Augenblicklich +Zeitaufwand: 1 Runde +Wirkungsbereich: 1 Wesen +Rettungswurf: Nein +Dieser Zauber stellt das Durchhaltevermögen des berührten Wesens wieder her und gibt ihm die Energie, die in anderthalb Tagen Anstrengung verloren wurde, zurück. Dies reicht möglicherweise jedoch nicht aus, um einen Charakter aus seinem "erschöpften" Zustand herauszuholen.~ +%atsymbol%253=~Unerschöpfliches Durchhaltevermögen~ +%atsymbol%252=~Pestilenzwolke (Veränderung) +Grad: 4 +Kampf- und Elementarzyklus (Luft) +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: 4 Runden +Zeitaufwand: 7 +Wirkungsbereich: Radius von 8 Metern +Rettungswurf: keine Wirkung +Dieser Zauber verwandelt die Luft in einem Radius von 8 Metern in Ekel erregende, gräuliche Nebel. Der Anwender und nicht lebende Wesen sind immun gegen die Wirkung der Wolke. In jeder Runde, in der andere Wesen der unheilvollen Luft ausgesetzt sind, verlieren sie 3 Punkte Stärke und Geschicklichkeit, erleiden 3 Schadenspunkte und erblinden (Rettungswurf gegen Odemwaffe schützt). Diese Wirkung hält 1 Phase lang an. Die "Pestilenzwolke" kann nur von bösen Charakteren angewendet werden.~ +%atsymbol%251=~Pestilenzwolke~ +%atsymbol%250=~Betäuben~ +%atsymbol%249=~Geheilt~ +%atsymbol%248=~Blutrausch (Veränderung) +Grad: 4 +Kampfzyklus +Wirkungsbereich: Sichtweite des Anwenders +Duration: 2 turns +Zeitaufwand: 7 +Wirkungsbereich: 1 verbündetes Wesen +Saving Throw: None +Dieser Zauber funktioniert nur bei Spielercharakteren oder verbündeten Wesen. Wenn er angewandt wird, wird das Ziel dieses Zaubers zum Berserker und greift das nächststehende Wesen an, bis es tot ist; danach geht er zum nächsten Ziel über. Unter dem Einfluss des Blutrausches ist das Ziel immun gegen Bezauberung, Schlaf, Furcht, Festhalten, Betäubung, Verwirrung, Gefühle, Symbolzauber und ähnliche Zauber. Außerdem gewinnt das Ziel +2 auf seine Trefferpunkte, +3 auf seine Schadenspunkte, +2 auf seine Stärke, 10 zusätzliche Trefferpunkte sowie einen Bonus auf seine Beweglichkeitsrate. Der Zauber hat allerdings auch einige Nachteile. Die Trefferpunkte des Ziels sind für die Wirkungsdauer des Zaubers verdeckt, und das Ziel kann keinen Nutzen aus Wirkungen ziehen, die Trefferpunkte heilen. Am Ende der Wirkungsdauer des Zaubers ermüdet das Ziel, und seine Stärke fällt 2 Phasen lang auf 3 zurück. Der Blutrausch kann nicht auf Wesen mit rechtschaffener Gesinnung angewandt werden oder von diesen gewirkt werden.~ +%atsymbol%247=~Blutrausch~ +%atsymbol%246=~Rezitation +(Bannzauber, Anrufung/Hervorrufung) +Grad: 4 +Kampfzyklus +Reichweite: Wirkungsbereich des Anwenders: Radius von 20 Metern +Dauer: 1 Runde/Stufe Rettungswurf: Nein +Zeitaufwand: 7 +Durch das Aufsagen einer heiligen Textstelle oder eines Gebets bittet der Priester seine Göttin um ihren Segen für sich und seine Verbündeten. Unter seinen Feinden verbreitet er dadurch gleichzeitig Verwirrung und Schwäche. Die Verbündeten des Priesters erhalten einen Bonus von +2 auf ihre Angriffs- und Rettungswürfe. Gebetszauber wirken bei diesem Zauber weiter. Bei gleichzeitiger Verwendung dieses Zaubers mit einem Gebetszauber wird die Wirkung der Zauber entsprechend erhöht.~ +%atsymbol%245=~Rezitation~ +%atsymbol%244=~Entladung von statischer Elektrizität~ +%atsymbol%243=~Statische Ladung (Veränderung) +Grad: 4 +Wetterzyklus +Reichweite: Anwender +Wirkungsdauer: 1 Phase pro Stufe +Zeitaufwand: 1 Runde +Wirkungsbereich: Sichtweite des Anwenders +Rettungswurf: 1/2 +"Statische Ladung" funktioniert ähnlich wie "Blitze herbeirufen", kann aber auch in Räumen verwendet werden. Mit diesem Zauber kann der Anwender eine statische Ladung um jedes beliebige Wesen im Wirkungsbereich erzeugen und ihm damit 2-16 Schadenspunkte durch Elektrizität sowie zusätzlich 1-8 Punkte für jede Erfahrungsstufe des Anwenders zufügen. Die Ladung wird einmal pro Runde abgegeben, solange der Zauber wirkt.~ +%atsymbol%242=~Statische Ladung~ +%atsymbol%241=~Feuer erzeugen (Veränderung) +Grad: 4 +Elementarzyklus (Feuer) +Reichweite: Sichtweite des Anwenders +Dauer: 1 Runde +Zeitaufwand: 7 +Wirkungsbereich: 4 Quadratmeter +Rettungswurf: Nein +Bei diesem Zauber steigen Flammen vom Zielpunkt empor und richten bei allen Wesen, die sich im Wirkungsbereich aufhalten, 1-4 Schadenspunkte durch Feuer sowie 1 Punkt pro Stufe des Anwenders an.~ +%atsymbol%240=~Feuer erzeugen~ +%atsymbol%239=~Gunst des Ilmater +(Nekromantie) +Stufe: 3 +Sphäre: Nekromantie, Schutzzauber +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: Sofort +Zeitaufwand: 6 +Wirkungsbereich: 1 Wesen +Rettungswurf: Keiner +Durch die Anwendung dieses Zaubers tauscht der Anwender seine eigene Lebenskraft mit der des Empfängers, wodurch auch alle körperlichen Verwundungen getauscht werden. +Der Zauber wird nur wirken, wenn der Anwender vor dem Versuch mehr Schadenspunkte besitzt als das Ziel. +Der Tausch ist dauerhaft, bis der Anwender normale Methoden einsetzt, um Schaden zu heilen. Der Tausch kann aus der Entfernung durchgeführt werden, solange die Reichweite nicht überschritten ist. +Nur die Schadenspunkte werden getauscht, der Anwender kann keine anderen Zustände des Ziels übernehmen, etwa Krankheit, Gift, Rausch und ähnliche Gebrechen. +Der Zauber hat keine Wirkung auf Untote, Konstruktionen oder Wesen von anderen Ebenen; er kann nicht von bösen Charakteren angewendet werden.~ +%atsymbol%238=~Gefallen des Ilmater~ +%atsymbol%237=~Mittlere Wunden verursachen +(Nekromantie) +Level: 3 +Sphäre: Heilung +Reichweite: Berührung +Wirkungsdauer: Augenblicklich +Zeitaufwand: 5 +Wirkungsbereich: 1 Wesen +Rettungswurf: 1/2 +Dieser Zauberspruch verursacht beim Aussprechen und gleichzeitigem Berühren eines Wesens 14 Schadenspunkte (Rettungswurf vs. Zauber für halben Schaden) beim Ziel. Er wirkt nicht bei Untoten, Konstrukten oder extraplanaren Kreaturen. Mittlere Wunden verursachen kann nicht von Charakteren gewirkt werden, die guter Gesinnung sind.~ +%atsymbol%236=~Mittlere Wunden verursachen~ +%atsymbol%235=~Sturm-Schutzhülle (Bannzauber) +Grad: 3 +Schutzzyklus (Wetter) +Reichweite: Anwender +Wirkungsdauer: 1 Phase +Zeitaufwand: 6 +Wirkungsbereich: Anwender +Rettungswurf: Nein +Dieser Zauber umgibt den Anwender mit einer dunklen Sphäre zerschmetternder Energie, die sich mit ihm bewegt. Die Sturm-Schutzhülle reduziert jeglichen Schaden durch Feuer, Kälte oder Elektrizität für den Anwender um 50 %.~ +%atsymbol%234=~Sturm-Schutzhülle~ +%atsymbol%233=~Schimmelberührung (Veränderung) +Stufe: 3 +Pflanzenzyklus +Reichweite: Berührung +Wirkungsdauer: 3 oder 4 Runden (speziell) +Zeitaufwand: 6 +Wirkungsbereich: 1 Wesen +Rettungswurf: Speziell +Dieser Zauber infiziert ein Wesen, das der Anwender berührt, mit einem sich rasch ausbreitenden braunen Schimmelbefall. Das infizierte Wesen erhält einen Rettungswurf gegen den Zauber. Schlägt dieser fehl, ist die Infektion sehr schwer, und das Wesen erleidet den folgenden Schaden: +1. Runde: 4-24 Schadenspunkte +2. Runde: 3-18 Schadenspunkte +3. Runde: 2-12 Schadenspunkte +4. Runde: 1-6 Schadenspunkte +Bei einem erfolgreichen Rettungswurf wird der Schaden folgendermaßen reduziert: +1. Runde: 2-12 Schadenspunkte +2. Runde: 1-6 Schadenspunkte +3. Runde: 1-6 Schadenspunkte +Ab der 2. Runde muss jedes Wesen, das sich nicht weiter als 3 Meter vom Opfer entfernt befindet, pro Runde einen Rettungswurf gegen Zauber ausführen, wenn es nicht selbst von der Schimmelberührung angegriffen werden will. Wesen, die befallen sind, können nicht noch einmal infiziert werden. Der braune Schimmel stirbt schnell ab, wenn der Zauber seine Wirkung verliert.~ +%atsymbol%232=~Schimmelberührung~ +%atsymbol%231=~Wolkenbruch (Anrufung) +Grad: 3 +Elementarzyklus (Wasser) +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: 2 Runden +Zeitaufwand: 6 +Wirkungsbereich: Radius von 10 Metern +Rettungswurf: Nein +Dieser Zauber ruft einen magischen Regen hervor, der den Wirkungsbereich tränkt. Jegliche Wesen, die in Kälte oder Feuer leben bzw. diese verwenden, erhalten 2-6 Schadenspunkte pro Runde. Zusätzlich haben alle Wesen im Wirkungsbereich eine 50-prozentige Chance, von Blitzschlägen getroffen werden, die den Wesen einen Schaden von 2-12 Punkten zufügen; dieser Schaden kann durch einen Rettungswurf halbiert werden. Die Wirkung der Zauber "Flammenklinge" und "Flammenschleier" sowie Salamander-Auras werden durch den Zauber "Wolkenbruch" unwirksam.~ +%atsymbol%230=~Wolkenbruch~ +%atsymbol%229=~Dornenwachstum (Veränderung) +Grad: 3 +Elementarzyklus (Erde) +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: 1 Phase +Zeitaufwand: 6 +Wirkungsbereich: Radius von 5 Metern +Rettungswurf: Nein +Durch diesen Zauber wird das umgebende Terrain mit dornigen Pflanzen überwuchert. Jedes Wesen, das den Wirkungsbereich betritt, erleidet jede Runde bis zum Erlöschen des Zaubers 1-4 Schadenspunkte durch Spitze und 1-4 Schadenspunkte durch Klinge.~ +%atsymbol%228=~Dornenwachstum~ +%atsymbol%227=~Knochenkreis (Nekromantie) +Grad: 3 +Sicherungs- und Erschaffungszyklus +Reichweite: Anwender +Wirkungsdauer: 3 Runden +Zeitaufwand: 1 Runde +Wirkungsbereich: Radius von 1 Meter +Rettungswurf: Nein +Dieser Zauber ruft eine Schutzbarriere aus schwebenden Knochen hervor, die schnell um den Anwender herumwirbeln. Jeder, der ihnen in den Weg kommt, erleidet 1-6 Schadenspunkte durch Wucht und 1-6 Schadenspunkte durch Klinge pro Runde. Der Anwender kann sich während der Wirkungsdauer des Zaubers nicht bewegen. Der Zauber "Knochenkreis" kann nicht von guten Charakteren angewendet werden.~ +%atsymbol%226=~Knochenkreis~ +%atsymbol%225=~Mondklinge~ +%atsymbol%224=~Mondklinge~ +%atsymbol%223=~Mondklinge (Anrufung) +Grad: 3 +Kampfzyklus (Sonne) +Reichweite: Anwender +Wirkungsdauer: 2 Phasen +Zeitaufwand: 6 +Wirkungsbereich: Anwender +Rettungswurf: Nein +Dieser Zauber beschwört eine laut- und gewichtslose, schwertähnliche Waffe aus Mondlicht, die von der Hand des Anwenders aus 1,2 Meter misst. Was die Wesen angeht, die von der Mondklinge getroffen werden können, so zählt sie wie eine +4-Waffe, wobei der Bonus nicht für den ETW0 gilt. Außerdem wird wegen der Substanzlosigkeit der Mondklinge kein Bonus für die Stärke im Nahkampf angerechnet. +Beim Treffer durch die Mondklinge wird dem Opfer Lebenskraft entzogen, und es erleidet 1-12+4 Punkte Schaden, wobei Untote, die besonders anfällig sind, zusätzliche 1-12 Punkte erleiden. Ein erfolgreicher Treffer bringt auch zeitweilig Zauber durcheinander, sodass jeder Zauber, den das Opfer in der nächsten Runde anwendet, fehlschlägt.~ +%atsymbol%222=~Mondklinge~ +%atsymbol%221=~Schlafen~ +%atsymbol%220=~Begeisterung +(Bannzauber) +Grad: 3 +Heilzyklus +Reichweite: Berührung +Wirkungsdauer: 1 Phase +Zeitaufwand: 9 +Wirkungsbereich: 1 Wesen +Rettungswurf: Nein +Durch diesen Zauber kann ein Priester jedem anderen Wesen außer sich selbst beistehen und es schützen. Durch eine Berührung beseitigt der Anwender die Wirkung von Furcht, Schlaf, Schwachsinn, Bewusstlosigkeit und Rausch sowie Berserkerwut und Verwirrung. Außerdem ist der Empfänger während der Wirkungsdauer dieses Zaubers geschützt vor Zaubern und anderen Angriffen, die diese Wirkungen hervorrufen.~ +%atsymbol%219=~Begeisterung~ +%atsymbol%218=~Krankheit verursachen (Nekromantie) +Grad: 3 +Heilzyklus +Reichweite: Berührung +Wirkungsdauer: 8 Stunden +Zeitaufwand: 1 Runde +Wirkungsbereich: 1 Wesen +Rettungswurf: keine Wirkung +Dieser Zauber schlägt ein Wesen, das der Priester berührt, mit einer Krankheit, die dem Opfer 5-20 Punkte Stärke entzieht. Durch einen Rettungswurf wird der Zauber unwirksam. Dieser Zauber hat keine Auswirkungen auf Untote, Konstrukte oder außerplanare Wesen. Der Zauber "Krankheit verursachen" kann nicht von guten Charakteren angewendet werden.~ +%atsymbol%217=~Krankheit verursachen~ +%atsymbol%216=~Kampfhandikaps~ +%atsymbol%215=~Kampfboni~ +%atsymbol%214=~Gebet (Beschwörung/Herbeirufung) +Grad: 3 +Kampfzyklus +Reichweite: Anwender +Wirkungsdauer: 1 Runde pro Stufe +Zeitaufwand: 6 +Wirkungsbereich: Radius von 20 Metern +Rettungswurf: Nein +Das Gebet begünstigt Priester und wohlgesinnte Charaktere, belegt aber Feinde mit einem Fluch. Alle Angriffe, Schadens- und Rettungswürfe wohlgesinnter Charaktere werden mit +1 belohnt, während Angriffe, Schadens- und Rettungswürfe aller Feinde mit -1 bestraft werden. Allen Wesen, die sich bei der Wirkung des Zaubers im Wirkungsbereich aufhalten, werden betroffen, auch wenn sie danach den Bereich verlassen. Wenn Kämpfer also diesem fliehenden Goblin folgen wollen, folgt ihnen auch die Wirkung des Gebets.~ +%atsymbol%213=~Gebet~ +%atsymbol%212=~Mittlere Wunden verursachen (Nekromantie) +Grad: 2 +Heilzyklus +Reichweite: Berührung +Wirkungsdauer: Permanent +Zeitaufwand: 5 +Wirkungsbereich: 1 Wesen +Rettungswurf: 1/2 +Wenn ein Priester diesen Zauber durch Berührung eines Wesens anwendet, fügt er dem Körper des Wesens 11 Schadenspunkte zu (der Schaden wird durch einen gelungenen Rettungswurf halbiert). Dieser Zauber hat keine Auswirkungen auf Untote, Konstrukte oder außerplanare Wesen. Der Zauber "Mittlere Wunden verursachen" kann nicht von guten Charakteren angewendet werden.~ +%atsymbol%211=~Mittlere Wunden verursachen~ +%atsymbol%210=~Bestienklaue~ +%atsymbol%209=~Bestienklaue~ +%atsymbol%208=~Bestienklaue +(Veränderung) +Grad: 2 +Kampfzyklus +Reichweite: Anwender +Wirkungsdauer: 1 Phase +Zeitaufwand: 5 +Wirkungsbereich: Anwender +Rettungswurf: Nein +Durch diesen Zauber wird der Arm des Anwenders in die Klauen einer mächtigen Bestie verwandelt, was dem Anwender eine Stärke von 18/72 sowie die Fähigkeit verleiht, einem Gegner durch Kratzen 2-8 (+Stärkebonus) Punkte Klingenschaden zuzufügen. Der Anwender kann pro Runde zwei Angriffe mit den Bestienklauen durchführen, wobei er einen Bonus von 2 Punkten auf seinen Angriff erhält.~ +%atsymbol%207=~Bestienklaue~ +%atsymbol%206=~Von einem silbrigen Schimmer umgeben (RK verschlechtert sich um 2)~ +%atsymbol%205=~Einhornlanze +(Anrufung) +Grad: 2 +Kampfzyklus +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: Augenblicklich +Zeitaufwand: 5 +Wirkungsbereich: 1 Wesen +Rettungswurf: 1/2 +Durch diesen Zauber wird eine silberfarbene, teilweise ätherale Lanze erzeugt, die dem Horn eines Einhorns ähnelt. Der Anwender wählt ein Ziel, und die Einhornlanze wird augenblicklich darauf abgefeuert und fügt ihm 3-18 Schadenspunkte (Spitze) zu. Durch einen Rettungswurf kann der Schaden halbiert werden. Obwohl sich die Einhornlanze nach dem Treffer auflöst, hinterlässt sie ein silbriges Leuchten um das Ziel, wodurch dieses leichter gesehen und getroffen werden kann, sodass es 3 Runden lang 2 Punkte Abzug auf seine Rüstungsklasse erhält.~ +%atsymbol%204=~Einhornlanze~ +%atsymbol%203=~Geheilt~ +%atsymbol%202=~Mittelschwere Wunden heilen +(Nekromantie) +Heilzyklus +Grad: 2 +Reichweite: Berührung +Wirkungsdauer: Augenblicklich +Zeitaufwand: 5 +Wirkungsbereich: 1 Wesen +Rettungswurf: Nein +Der Zauber "Mittlere Wunden heilen" ist eine stärkere Version des Zaubers für Priester der 1. Stufe "Leichte Wunden heilen". Mit diesem Zauber werden 11 Schadenspunkte eines Lebewesens geheilt.~ +%atsymbol%201=~Mittelschwere Wunden heilen~ +%atsymbol%200=~Geblendet~ +%atsymbol%199=~Sengende Sonne (Anrufung) +Grad: 1 +Sonnenzyklus +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: Augenblicklich +Zeitaufwand: 4 +Wirkungsbereich: 1 Wesen +Rettungswurf: 1/2 +Wenn dieser Zauber angewendet wird, fährt ein gleißender Strahl brennender Hitze vom Himmel hernieder und trifft ein vom Anwender ausgewähltes Opfer. Dem Opfer steht ein Rettungswurf gegen Zauber zu, mit dem der Schaden halbiert werden kann. Wenn ein Wesen von dem Strahl getroffen wird, erleidet es 1-6 Schadenspunkte plus 1 Punkt pro Stufe des Anwenders. Untote Wesen und Monster, die empfindlich gegen helles Licht sind, erhalten 1-6 Schadenspunkte plus 2 Punkte pro Stufe des Anwenders. Zusätzlich zu diesem Schaden wird das Opfer 3 Runden lang durch den Zauber geblendet.~ +%atsymbol%198=~Sengende Sonne~ +%atsymbol%197=~Leichte Wunden verursachen (Nekromantie) +Grad: 1 +Heilzyklus +Reichweite: Berührung +Wirkungsdauer: Permanent +Zeitaufwand: 5 +Wirkungsbereich: 1 Wesen +Rettungswurf: 1/2 +Wenn der Priester den Zauber ausspricht und dabei ein Wesen berührt, fügt er dem Körper des Opfers 8 Schadenspunkte zu (halber Schaden bei Rettungswurf). Dieser Zauber hat keine Auswirkung auf Untote, Konstrukte oder außerplanare Wesen. "Leichte Wunden verursachen" kann nicht von guten Charakteren angewandt werden.~ +%atsymbol%196=~Leichte Wunden verursachen~ +%atsymbol%195=~Verflucht~ +%atsymbol%194=~Fluch (Herbeirufung/Beschwörung) +Grad: 1 +Allgemeiner Zyklus +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: 6 Runden +Zeitaufwand: 1 Runde +Wirkungsbereich: Ein Würfel mit 15 m Kantenlänge +Rettungswurf: Nein +Wenn der Anwender den Fluch ausspricht, senkt er die Moral feindlicher Wesen und zieht -1 von ihren Rettungs- und Angriffswürfen ab. Sobald der Zauber wirkt, werden alle Wesen innerhalb eines Würfels mit 15 m Kantenlänge um einen vom Anwender gewählten Punkt getroffen (Wesen, die den Bereich verlassen, nachdem sie getroffen wurden, spüren die Wirkung des Zaubers trotzdem. Der Fluch wirkt aber nicht auf Wesen, die den Bereich erst später betreten).~ +%atsymbol%193=~Fluch~ +%atsymbol%192=~Auge des Steins +Dieses Auge absorbiert einen Versteinerungs-Angriff, der auf den Magier gewirkt wurde. +Es kann auch einen Zauber 3. Grades *Person festhalten* wirken und humanoide Wesen, die so groß wie Menschen (oder kleiner) sind, für 1 Runde/Stufe lähmen. (Rettungswurf gegen Zauber für Abwehr).~ +%atsymbol%191=~Steinauge~ +%atsymbol%190=~Auge des Geistes +Dieses Auge absorbiert einen Todeszauber-Angriff, der auf den Magier gewirkt wurde. (Todeszauber, Finger des Todes, Wort der Macht: Tod, Schneller Tod, Zerstörung). +Statt dessen kann der Magier mit dem Auge auch den Zauber 2. Grades *Schwächestrahl* wirken, welcher die Stärke des Gegners auf 5 dezimiert. (Rettungswurf gegen Zauber für Abwehr).~ +%atsymbol%189=~Auge des Geistes~ +%atsymbol%188=~Auge der Standhaftigkeit +Dieses Auge blockt einen Effekt der Kategorie Benommenheit, Taubheit, Blindheit, Stille ab. +Alternativ kann das Auge auch einen Zauber des 4. Grades *Schrei* wirken. Dieser richtet in einem Radius von 10 Metern magischen Schaden in Höhe von 4W6 an und führt zu Taubheit der Gegner (Rettungswurf gegen Zauber für halben Schaden und Abwehr von Taubheit).~ +%atsymbol%187=~Auge der Stärke~ +%atsymbol%186=~Auge des Giftes +Dieses Auge absorbiert einen Angriff, der den Magier vergiften könnte. +Das Auge kann auch als Priesterzauber des 4. Grades *Vergiften* benutzt werden. Der Schaden dabei beträgt 20 Punkte Giftschaden über eine Dauer von 20 Sekunden (Rettungswurf gegen Gift für Abwehr).~ +%atsymbol%185=~Auge des Giftes~ +%atsymbol%184=~Auge des Schwertes +Dieses Auge wehrt den ersten physikalischen Angriff auf den Magier ab. +Das Auge kann auch als Zauber des 1. Grades *Magisches Geschoss* (ein Geschoss und alle zwei Stufen des Anwenders ein weiterer, jedoch nicht mehr als 5 Geschosse maximal) benutzt werden. Die Geschosse richten 1d4+1 Punkte magischen Schaden an.~ +%atsymbol%183=~Auge des Schwertes~ +%atsymbol%182=~Auge des Magiers +Dieses Auge absorbiert einen Angriff durch Feuer, Blitz, Kälte oder Säureschaden. +Das Auge kann auch als Zauber des 3. Grades *Blitzschlag* benutzt werden. Er richtet 1W6 elektrischen Schaden pro Stufe (max. 10W6) bei allen Kreaturen auf seiner Bahn an.~ +%atsymbol%181=~Auge des Magiers~ +%atsymbol%180=~Auge des Geistes +Diese Kugel schützt den Magier gegen mentale Angriffe wie Bezauberung, Gefühl und Furcht. +Das Auge kann auch als Zauber des 1. Grades *Person Bezaubern* genutzt werden, und bringt bei Erfolg eine humanoide Kreatur unter der Kontrolle des Magiers für eine Runde.~ +%atsymbol%179=~Auge der Gedanken~ +%atsymbol%178=~Ihr könnt diesen Zauber nicht auslösen, bevor die Wirkung des aktuellen Zaubers aufgehört hat.~ +%atsymbol%177=~Sieben Augen (Bannzauber) +Grad: 7 +Reichweite: Anwender +Wirkungsdauer: 2 Phasen +Zeitaufwand: 7 +Wirkungsbereich: Anwender +Rettungswurf: Nein +Dieser Zauber ruft sieben magische Augäpfel hervor, die in einem Kreis über dem Kopf des Anwenders schweben. Jedes Auge hat eine defensive und eine offensive Fähigkeit, es kann jedoch jeweils nur eine dieser beiden Fähigkeiten verwendet werden, bevor es seine Wirkung verliert. Wenn der Zauber "Sieben Augen" vor Ablauf der Wirkungsdauer nochmals angewendet wird, bleibt er unwirksam, unabhängig davon, ob noch Augen übrig sind. Die Kräfte der einzelnen Augen sind im Folgenden beschrieben. +Auge der Gedanken - dieses Auge beschützt den Anwender vor mentalen Angriffen, wie beispielsweise Bezauberung, Gefühl oder Furcht. Das Auge kann als Magier-Zauber des ersten Grades "Personen bezaubern" angewendet werden. +Auge des Schwertes - dieses Auge wehrt den ersten körperlichen Angriff ab, der den Anwender trifft. Das Auge kann als Magier-Zauber des ersten Grades "Magisches Geschoss" (5 Geschosse) verwendet werden. +Auge des Magiers - dieses Auge absorbiert einen Angriff mit Feuer-, Kälte- oder Säureschaden. Das Auge kann als Magier-Zauber des dritten Grades "Blitzstrahl" (4-32 Schadenspunkte) verwendet werden. +Auge des Giftes - dieses Auge stoppt einen Angriff mit Gift oder macht ihn unwirksam. Außerdem kann das Auge zum Vergiften eines Wesens verwendet werden, wobei es dem Opfer in 30 Sekunden insgesamt 30 Schadenspunkte zufügt. +Auge des Geistes - dieses Auge blockiert einen Angriff, der sofort zum Tode führen würde (Todeszauber, Finger des Todes, Wort der Macht "Tod", Lebende töten, Zerstörung). Stattdessen kann der Zauberer die Kraft des Auges auch als "Strahl der Schwächung" verwenden, wodurch die Stärke des Opfers um 5 Punkte abnimmt, seine Treffsicherheit herabgesetzt wird und die vom Opfer zugefügten Schadenspunkte reduziert werden. +Auge der Stärke - dieses Auge blockiert eine Wirkung von Betäubung, Taubheit, Blindheit oder Stille. Alternativ kann es als der Magier-Zauber des vierten Grades "Brüllen" verwendet werden. +Auge des Steines - dieses Auge schirmt den Anwender von einem einzelnen Versteinerungsangriff ab. Es kann auch als der Magier-Zauber des dritten Grades "Personen festhalten" verwendet werden. +Weitere Anwendungen des Zaubers "Sieben Augen" schlagen fehl, bevor der ursprüngliche Zauber unwirksam wird, unabhängig davon, ob noch Augen übrig sind.~ +%atsymbol%176=~Sieben Augen~ +%atsymbol%175=~Malavons Wut +(Hervorrufung) +Grad: 7 +Reichweite: Speziell +Wirkungsdauer: Augenblicklich +Zeitaufwand: 1 +Wirkungsbereich: 5 Meter Radius um den Anwender +Rettungswurf: Rettungswurf gegen Zauber zur Halbierung des Schadens +Malavons Wut wurde von dem Dunkelelfen-Zauberer Malavon geschaffen. Sie feuert Wurfpfeile aus reiner Energie aus dem Körper des Anwenders ab; diese fliegen in alle Richtungen und treffen Freunde und Feinde zugleich. Die kleinen magischen Keile verursachen 20-80 Schadenspunkte durch Spitze an allem, was sie treffen. Dieser Zauberspruch ist besonders nützlich, wenn ein Magier von Feinden umzingelt ist.~ +%atsymbol%174=~Malavons Wut~ +%atsymbol%173=~Scharfer Schnitt~ +%atsymbol%172=~Tod~ +%atsymbol%171=~Untoter zerstört~ +%atsymbol%170=~Äußere Ebene zerstört~ +%atsymbol%169=~Schatten (Illusion/Hirngespinst) +Grad: 6 +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: 1 Runde pro Stufe +Zeitaufwand: 6 +Wirkungsbereich: Ein Würfel mit 6 m Kantenlänge +Rettungswurf: Speziell +Dies ist ein Zauberspruch, der ähnlich funktioniert wie Schattenmonster und Halbschattenmonster. Er ermöglicht es dem Anwender, illusionäre Wesen aus dem Material der Halbebene zu erschaffen. Diese sind stärker als die Schatten, die durch Schattenmonster und Halbschattenmonster beschworen werden; sie gehorchen dem Anwender so lange, bis der Zauber erlischt oder die Schatten getötet werden.~ +%atsymbol%168=~Schatten~ +%atsymbol%167=~Leichnamsberührung~ +%atsymbol%166=~Leichnamsberührung~ +%atsymbol%165=~Leichnamsberührung +(Nekromantie) +Grad: 6 +Reichweite: Berührung +Wirkungsdauer: 1 Runde pro Stufe +Zeitaufwand: 6 +Wirkungsbereich: Anwender +Rettungswurf: Speziell +Dieser Zauberspruch verleiht dem Anwender die Kräfte der Leichnamsberührung und die Immunität eines Leichnams. Der Zauberer wird immun gegen Lähmung und Angst, während der Zauber wirkt, und seine Hände strahlen ein unheimliches, grünes Licht ab, das einem Ziel einen Schaden von 1-10 Punkten zufügen und es lähmen kann, es sei denn, das Ziel führt einen Rettungswurf gegen Lähmung aus. Dieser Zauber wirkt nicht auf Untote.~ +%atsymbol%164=~Leichnamsberührung~ +%atsymbol%163=~Magie bannen~ +%atsymbol%162=~Antimagische Schutzhülle +(Bannzauber) +Grad: 6 +Reichweite: Anwender +Wirkungsdauer: 1 Phase pro Stufe (Rettungswurf) +Zeitaufwand: 1 +Wirkungsbereich: Anwender +Rettungswurf: Nein +Dieser Zauber umgibt den Anwender mit einer unsichtbaren Barriere, die sich mit ihm bewegt. Diese Barriere macht den Zauberer immun gegen jegliche magischen Angriffe, verhindert allerdings auch, dass Zauber durch die Hülle nach außen dringen.~ +%atsymbol%161=~Antimagische Schutzhülle~ +%atsymbol%160=~Zäher Echsenmensch~ +%atsymbol%159=~Goblin-Elitekämpfer~ +%atsymbol%158=~Goblin-Elitekämpfer~ +%atsymbol%157=~Halbschattenmonster +(Illusion/Hirngespinst) +Grad: 5 +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: 1 Runde pro Stufe +Zeitaufwand: 5 +Wirkungsbereich: Ein Würfel mit 6 m Kantenlänge +Rettungswurf: Halbierung +Dieser Zauberspruch funktioniert ähnlich wie Schattenmonster, der Spruch für Zauberer der 4. Stufe. Allerdings sind die beschworenen Wesen hier sehr viel stärker: Sie besitzen 40 % der Trefferpunkte ihrer realen Gegenspieler.~ +%atsymbol%156=~Halbschattenmonster~ +%atsymbol%155=~Trollwaffe~ +%atsymbol%154=~Troll~ +%atsymbol%153=~Troll~ +%atsymbol%152=~Schattenmonster +(Illusion/Hirngespinst) +Grad: 4 +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: 1 Runde pro Stufe +Zeitaufwand: 4 +Wirkungsbereich: Ein Würfel mit 6 m Kantenlänge +Rettungswurf: Speziell +Dieser Zauberspruch verformt Material aus der Halbebene des Schattens in illusionäre Monster. Diese Monster werden durch Trefferwürfel mit einer Augenzahl zwischen 1 und der Stufe des Anwenders solange eines nach dem anderen beschworen, bis die gesamte Augenzahl für die beschworenen Wesen der Stufe des Anwenders entspricht. (Zum Beispiel könnte ein Zauberer der 15. Stufe in einer Runde ein Wesen der 10. Stufe beschwören; in der nächsten Runde könnte als nächstes eine Wesen auftreten, das durch eine Augenzahl zwischen 1 und 5 beschworen wird, und so weiter.) Diese Schattenwesen haben nur 20 % der Trefferpunkte ihrer realen Gegenspieler, obwohl ihre Angriffe denselben Schaden verursachen.~ +%atsymbol%151=~Schattenmonster~ +%atsymbol%150=~Beschleunigt~ +%atsymbol%149=~Verlangsamen~ +%atsymbol%148=~Verlangsamt~ +%atsymbol%147=~Schneller Rückzug (Veränderung) +Grad: 1 +Reichweite: Anwender +Wirkungsdauer: 3 Runden +Zeitaufwand: 1 +Wirkungsbereich: Anwender +Rettungswurf: Nein +Dieser Zauber verdoppelt die normale Geschwindigkeit des Anwenders für kurze Zeit - in der Regel lange genug, um zu entkommen. Andere geschwindigkeitsverändernde Zauber, wie beispielsweise "Hast" und "Verlangsamen", haben keine Auswirkungen auf den Anwender, solange dieser Zauber noch wirksam ist. Während der Wirkungsdauer kann der Anwender weder angreifen, noch zaubern oder Gegenstände und besondere Fähigkeiten einsetzen ... nur weglaufen.~ +%atsymbol%146=~Schneller Rückzug~ +%atsymbol%145=~Mordenkainens Schwert~ +%atsymbol%144=~Mordenkainens Schwert~ +%atsymbol%143=~Mordenkainens Schwert +(Hervorrufung) +Grad: 7 +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: 1 Runde pro Stufe +Zeitaufwand: 7 +Wirkungsbereich: Speziell +Rettungswurf: Nein +Dieser Zauber beschwört ein glänzendes Schwert herauf, das der Anwender mit der Kraft seiner Gedanken führen kann. Es trifft wie bei einem Kämpfer, der die halbe Stufe des Anwenders besitzt, und trotz der Tatsache, dass es mit der Hand geführt wird, kann es alle Wesen in Sichtweite des Anwenders treffen. Es gibt zwar keinen Bonus auf Angriffe, doch das Schwert kann Wesen treffen, die normalerweise nur mit Waffen ab +2 bezwungen werden können. Jeder Treffer fügt 5-30 Schadenspunkte zu.~ +%atsymbol%142=~Mordenkainens Schwert~ +%atsymbol%141=~Wasserelementar~ +%atsymbol%140=~Wasserelementar~ +%atsymbol%139=~Wasserelementare beschwören +(Herbeirufung/Beschwörung) +Grad: 5 +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: 1 Phase/Stufe +Zeitaufwand: 1 Runde +Wirkungsbereich: Speziell +Rettungswurf: Nein +Mit diesem Zauberspruch kann der Anwender einen Elementar aus der Wasserebene herbeirufen und seinem Willen unterwerfen. Dieser Elementar kämpft dann so lange im Auftrag des Anwenders, bis die Wirkung erlischt oder der Elementar vernichtet wird.~ +%atsymbol%138=~Wasserelementar beschwören~ +%atsymbol%137=~Luftelementar~ +%atsymbol%136=~Luftelementar~ +%atsymbol%135=~Luftelementar beschwören +Grad: 6 +Schule: Beschwörung +Reichweite: Lang +Dauer: 1 Phase/Stufe +Zeitaufwand: 9 +Bereich: Speziell +Rettungswurf: Nein +Der Zauber öffnet ein Tor zur Luftebene, durch das ein Luftelementar in der Nähe des Anwenders erscheint. Zu 60% verfügt der Elementar über 12 Trefferwürfel, zu 35% über 18 Trefferwürfel und zu 5% über 24 Trefferwürfel. Sobald der Elementar erschienen ist, muss der Anwender ihn unter seinen Willen zwingen. Der mentale Zweikampf dauert drei Runden. Zu 15% scheitert die Unterwerfung und der Elementar greift den Anwender an. Gelingt die Unterwerfung, befolgt der Elementar alle Befehle, bis die Wirkungsdauer endet oder er getötet wird. Da die Kommunikation mit dem Elementar auf telepathischem Weg erfolgt, besteht keine Gefahr, dass ein Befehl missverstanden wird, und es ist auch nicht nötig, dass der Anwender die Sprache des Elementars beherrscht.~ +%atsymbol%134=~Luftelementar beschwören~ +%atsymbol%133=~Feuerelementar~ +%atsymbol%132=~Feuerelementar~ +%atsymbol%131=~Feuerelementar beschwören +(Herbeirufung/Beschwörung) +Grad: 5 +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: 1 Phase/Stufe +Zeitaufwand: 1 Runde +Wirkungsbereich: Speziell +Rettungswurf: Nein +Mit diesem Zauber kann der Anwender einen Elementar der Feuerebene herbeirufen und seinem Willen unterwerfen. Der Elementar kämpft auf der Seite des Anwenders bis er zerstört wird oder bis der Zauber erlischt.~ +%atsymbol%130=~Feuerelementare beschwören~ +%atsymbol%129=~Erdelementar~ +%atsymbol%128=~Erdelementar~ +%atsymbol%127=~Erdelementar beschwören +(Herbeirufung/Beschwörung) +Grad: 5 +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: 1 Phase pro Stufe +Zeitaufwand: 1 Runde +Wirkungsbereich: Speziell +Rettungswurf: Nein +Mit diesem Zauber kann der Anwender einen Elementar der Erdebene herbeirufen und seinem Willen unterwerfen. Der Elementar kämpft auf der Seite des Anwenders bis er zerstört wird oder bis der Zauber erlischt.~ +%atsymbol%126=~Erdelementare beschwören~ +%atsymbol%125=~Monster herbeirufen III +(Herbeirufung/Beschwörung) +Grad: 5 +Reichweite: 40 Meter +Wirkungsdauer: 4 Runden +1 Runde/Stufe +Zeitaufwand: 5 +Wirkungsbereich: Speziell +Rettungswurf: Nein +Dieser Zauberspruch beschwört 1-4 Monster der 3. Stufe, die innerhalb der Reichweite des Zaubers erscheinen. Ihnen kann befohlen werden, die Gegner des Anwenders anzugreifen, und zwar solange, bis die Wirkung erlischt oder die Monster getötet werden.~ +%atsymbol%124=~Monster herbeirufen 3~ +%atsymbol%123=~Echsenmensch~ +%atsymbol%122=~Echsenmensch~ +%atsymbol%121=~Monster herbeirufen II +(Herbeirufung/Beschwörung) +Grad: 4 +Reichweite: 40 Meter +Wirkungsdauer: 3 Runden + 1 Runde pro Stufe +Zeitaufwand: 4 +Wirkungsbereich: Speziell +Rettungswurf: Nein +Dieser Zauberspruch beschwört 1-6 Monster der 2. Stufe, die innerhalb der Reichweite des Zaubers erscheinen. Ihnen kann befohlen werden, die Gegner des Anwenders anzugreifen, und zwar solange, bis die Wirkung erlischt oder die Monster getötet werden.~ +%atsymbol%120=~Monster herbeirufen 2~ +%atsymbol%119=~Goblin~ +%atsymbol%118=~Goblin~ +%atsymbol%117=~Monster herbeirufen I +(Herbeirufung/Beschwörung) +Grad: 3 +Reichweite: 6 Meter +Wirkungsdauer: 2 Runden +1 Runde/Stufe +Zeitaufwand: 3 +Wirkungsbereich: Speziell +Rettungswurf: Nein +Dieser Zauberspruch beschwört 2W3 Monster der 1. Stufe, die innerhalb der Reichweite des Zaubers erscheinen. Ihnen kann befohlen werden, die Gegner des Anwenders anzugreifen, und zwar solange, bis die Wirkung erlischt oder die Monster getötet werden.~ +%atsymbol%116=~Monster herbeirufen 1~ +%atsymbol%115=~Angreifen~ +%atsymbol%114=~Minotaurus~ +%atsymbol%113=~Minotaurus~ +%atsymbol%112=~Monster herbeirufen V +(Herbeirufung/Beschwörung) +Grad: 7 +Reichweite: 6 Meter +Wirkungsdauer: 6 Runden + 1 Runde/Stufe +Zeitaufwand: 7 +Wirkungsbereich: Speziell +Rettungswurf: Nein +Durch Anwendung dieses Zaubers ruft der Zauberer 1W3 Monster der 5. Stufe hervor, die innerhalb der Reichweite des Zaubers erscheinen. Ihnen kann befohlen werden, die Gegner des Anwenders solange anzugreifen, bis der Zauber erlischt oder die Monster getötet werden.~ +%atsymbol%111=~Monster herbeirufen V~ +%atsymbol%110=~Salamander spear +1d8 piercing +1d6 fire damage +do not translate~ +%atsymbol%109=~Frost salamander spear +1d8 piercing ++1d6 cold +do not trans~ +%atsymbol%108=~Salamander~ +%atsymbol%107=~Salamander~ +%atsymbol%106=~Frostsalamander~ +%atsymbol%105=~Frostsalamander~ +%atsymbol%104=~Monster herbeirufen VI +(Herbeirufung/Beschwörung) +Grad: 8 +Reichweite: 40 Meter +Wirkungsdauer: 7 Runden + 1 Runde/Stufe +Zeitaufwand: 8 +Wirkungsbereich: Besonderer Bereich +Rettungswurf: Nein +Mit dem Ausspruch dieses Zaubers werden 1-3 Monster der Stufe 6 heraufbeschworen. Diese erscheinen in einem Bereich innerhalb der Reichweite des Zaubers und greifen die Gegner des Anwenders solange an, bis der Zauber gebrochen ist oder die Monster getötet wurden.~ +%atsymbol%103=~Monster herbeirufen VI~ +%atsymbol%102=~Angreifen~ +%atsymbol%101=~Erdkoloss~ +%atsymbol%100=~Erdkoloss~ +%atsymbol%99=~Knochenwachen-Skelett~ +%atsymbol%98=~Knochenwachen-Skelett~ +%atsymbol%97=~Monster herbeirufen VII +(Herbeirufung/Beschwörung) +Grad: 9 +Reichweite: 6 Meter +Wirkungsdauer: 8 Runden + 1 Runde/Stufe +Zeitaufwand: 9 +Wirkungsbereich: Speziell +Rettungswurf: Nein +Mit dem Ausspruch dieses Zaubers werden 1W2 Monster der Stufen 7 oder 8 heraufbeschworen. Diese erscheinen in einem Bereich innerhalb der Reichweite des Zaubers und können die Gegner des Anwenders solange angreifen, bis die Wirkungsdauer zu Ende ist oder die Monster getötet wurden.~ +%atsymbol%96=~Monster herbeirufen VII~ +%atsymbol%95=~Monster herbeirufen IV +(Herbeirufung/Beschwörung) +Grad: 6 +Reichweite: 40 Meter +Wirkungsdauer: 5 Runden + 1 Runde/Stufe +Zeitaufwand: 6 + Wirkungsbereich: Speziell +Rettungswurf: Nein +Durch Anwendung dieses Zaubers ruft der Zauberer 1-3 Monster der 4. Stufe hervor, die innerhalb der Reichweite des Zaubers erscheinen. Ihnen kann befohlen werden, die Gegner des Anwenders solange anzugreifen, bis der Zauber erlischt oder die Monster getötet werden.~ +%atsymbol%94=~Monster herbeirufen IV~ +%atsymbol%93=~Schädel~ +%atsymbol%92=~Monstertransparenz +Do not translate~ +%atsymbol%91=~Monstertransparenz-Gegenstand~ +%atsymbol%90=~Schatten~ +%atsymbol%89=~Schatten~ +%atsymbol%88=~Schatten beschwören +(Herbeirufung/Beschwörung, Nekromantie) +Grad: 5 +Reichweite: 10 Meter +Wirkungsdauer: 1 Runde + 1 Runde pro Stufe +Zeitaufwand: 5 +Wirkungsbereich: Ein Würfel mit 3 m Kantenlänge +Rettungswurf: Nein +Dieser Zauberspruch beschwört einen Schatten je drei Stufen des Anwenders. Dieser Schatten gehorcht den Befehlen des Anwenders: Er greift dessen Feinde an oder führt irgendwelche Aufgaben aus, bis die Wirkung erlischt oder die Schatten getötet werden.~ +%atsymbol%87=~Schatten beschwören~ +%atsymbol%86=~Eisenfaust~ +%atsymbol%85=~Eisenfaust~ +%atsymbol%84=~Von einer üblen Krankheit befallen~ +%atsymbol%83=~Krank~ +%atsymbol%82=~Vergiftet~ +%atsymbol%81=~Vergiften~ +%atsymbol%80=~Eisenkörper (Veränderung) +Grad: 8 +Reichweite: Anwender +Wirkungsdauer: 2 Phasen +Zeitaufwand: 8 +Wirkungsbereich: Anwender +Rettungswurf: Keiner +Dieser Zauber verwandelt den Körper des Anwenders in lebendes Eisen, sodass er eine Reihe mächtiger Abwehrkräfte und Fähigkeiten gewinnt. Während der Wirkungsdauer des Zaubers ist der Anwender 100 % resistent gegen Elektrizität, 50 % resistent gegen Feuer und 25 % resistent gegen Schaden durch Wucht. Alle Zauber, die die Atmung oder die physische Kondition des Anwenders beeinträchtigen würden, bleiben ohne Wirkung. Außerdem wird die Stärke des Anwenders auf 25 erhöht, und er kann zweimal pro Runde mit Eisenfäusten angreifen, die 2-8 Schadenspunkte anrichten; zusätzlich erhält der Anwender den entsprechenden Stärkebonus. Unglücklicherweise werden die Bewegungen des Anwenders jedoch verlangsamt und leicht unkoordiniert, sodass seine Geschwindigkeit auf 25 % seiner normalen Geschwindigkeit herabgesetzt wird und er keinen anderen Zauber anwenden kann, solange der Eisenkörper noch wirkt.~ +%atsymbol%79=~Eisenkörper~ +%atsymbol%78=~ist ohnmächtig~ +%atsymbol%77=~Lautes Brüllen (Anrufung) +Grad: 8 +Reichweite: Anwender +Wirkungsdauer: Augenblicklich +Zeitaufwand: 1 +Wirkungsbereich: 10 Meter lang, Umkreis von 3 Metern +Rettungswurf: 1/2 +Wenn der Anwender das "Laute Brüllen" ausstößt, setzt er eine betäubende Kraft aus seinem Mund frei, die kegelförmig 10 Meter lang und mit einem Durchmesser von 3 Metern ausströmt. Das "Laute Brüllen" beansprucht den Anwender stark und ist daher für ihn nicht ganz ungefährlich. Er verliert 2-8 Trefferpunkte und muss einen Rettungswurf gegen Zauber durchführen, um nicht eine Phase lang das Bewusstsein zu verlieren. Wesen mit 5 oder weniger Trefferwürfeln, die vom Lauten Brüllen erfasst werden, sterben augenblicklich. Alle anderen Wesen im Wirkungsbereich müssen einen Rettungswurf gegen Zauber durchführen. Schlägt dieser fehl, werden sie 2 Runden lang betäubt, 4 Runden lang taub und erleiden 4-48 Schadenspunkte. Wesen, denen der Rettungswurf gelingt, werden 1 Runde lang betäubt, 2 Runden lang taub und erleiden 2-24 Schadenspunkte.~ +%atsymbol%76=~Lautes Brüllen~ +%atsymbol%75=~Bezaubert~ +%atsymbol%74=~Mit schreckenszauber bezaubert~ +%atsymbol%73=~Beherrscht~ +%atsymbol%72=~Moralisches Versagen: Panik~ +%atsymbol%71=~Berauscht~ +%atsymbol%70=~ist verwirrt~ +%atsymbol%69=~Striktes Denken~ +%atsymbol%68=~Festgehalten~ +%atsymbol%67=~ist gelähmt~ +%atsymbol%66=~Festgehalten~ +%atsymbol%65=~Gedankenleere (Bannzauber) +Grad: 8 +Reichweite: Anwender +Wirkungsdauer: 1 Tag +Zeitaufwand: 1 +Wirkungsbereich: Anwender +Rettungswurf: Nein +Bei Gedankenleere werden die Gedanken eines Wesens zur besseren Selbstbeherrschung und zur Wahrung der Privatsphäre von nahezu allen mentalen Effekten abgeschirmt. Dies sind zum Beispiel: Bezauberung, Befehl, Beherrschung, Angst, Schwachsinn sowie Ausspähungszauber mithilfe von Kristallkugeln und anderen wahrsagerischen Methoden.~ +%atsymbol%64=~Gedankenleere~ +%atsymbol%63=~Ersticken (Veränderung) +Grad: 7 +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: 4 Runden +Zeitaufwand: 7 +Wirkungsbereich: Radius von 3 Metern +Rettungswurf: 1/2 +Dieser Zauber entzieht allen Wesen im Wirkungsbereich den Atem. Wesen, die nicht atmen, werden durch den Zauber nicht betroffen. Erstickende Wesen erleiden einen Abzug von -4 auf ihre Rüstungsklasse, -4 auf ihre Trefferpunkte und -6 auf ihre Geschicklichkeit; sie haben pro Runde einen Angriff weniger, bewegen sich mit halber Geschwindigkeit und erleiden pro Runde 4-32 Schadenspunkte. Bei einem erfolgreichen Rettungswurf erleidet das Opfer lediglich einen Schaden von 2-16 Schadenspunkten; alle anderen Wirkungen werden negiert. Die Wirkung beginnt nachzulassen, wenn das Wesen sich aus dem Wirkungsbereich entfernt, wobei ein Charakter jedoch eine Runde brauchen kann, um wieder zu Atem zu kommen.~ +%atsymbol%62=~Ersticken~ +%atsymbol%61=~Säuresturm +(Hervorrufung) +Grad: 7 +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: 1 Runde pro Stufe +Zeitaufwand: 7 +Wirkungsbereich: 7 Meter Radius +Rettungswurf: Halbierung +Dieser Zauberspruch lässt einen Säureregen auf den Wirkungsbereich niedergehen. Dabei verursacht er 1-4 Schadenspunkte in den ersten drei Runden, 1-6 Trefferpunkte in den nächsten drei Runden und 1-8 Trefferpunkte in jeder darauffolgenden Runde. Das Verlassen des Wirkungsbereichs hält den Schaden nicht fern - die Säure haftet auf der Haut, und jedes Wesen, das sich im Wirkungsbereich befindet, wenn der Säuresturm losgeht, kassiert so lange Schadenspunkte, bis der Zauber erlischt. Wesen, die in die Säurewolke geraten, können einen Rettungswurf gegen Zauber ausführen, der im Erfolgsfall den Schaden halbiert (nur in der jeweiligen Runde).~ +%atsymbol%60=~Säuresturm~ +%atsymbol%59=~Trollische Regeneration (Nekromantie) +Grad: 6 +Reichweite: Anwender +Wirkungsdauer: 2 Phasen +Zeitaufwand: 6 +Wirkungsbereich: Anwender +Rettungswurf: Nein +Dieser Zauber verleiht dem Anwender die Unverwüstlichkeit eines Trolls, wodurch der Anwender pro Runde 5 Trefferpunkte bis zu seinen maximalen Trefferpunkten wiederherstellen kann.~ +%atsymbol%58=~Trollische Regeneration~ +%atsymbol%57=~Skelett~ +%atsymbol%56=~Skelett~ +%atsymbol%55=~Seelenfresser (Nekromantie) +Grad: 6 +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: Augenblicklich +Zeitaufwand: 5 +Wirkungsbereich: Radius von 3 Metern +Rettungswurf: Nein +Durch diesen Zauber werden jedem lebendigen Wesen in einem Radius von 3 Metern 3-24 Schadenspunkte zugefügt. Jedes Wesen, das infolge dieses Schadens stirbt, wird völlig ausgelöscht, und seine Substanz wird zu einem Skelett mit 3 TW, das dem Anwender dienen muss. Außerdem erhält der Anwender für jedes Wesen, das so stirbt, eine Phase lang einen Bonus von +1 auf seine Stärke, Geschicklichkeit und seine Konstitution.~ +%atsymbol%54=~Seelenfresser~ +%atsymbol%53=~Knochenwurfpfeil~ +%atsymbol%52=~Knochenwurfpfeil~ +%atsymbol%51=~Knochenwurfpfeile (Nekromantie) +Grad: 6 +Reichweite: Anwender +Wirkungsdauer: 5 Runden +Zeitaufwand: 5 +Wirkungsbereich: Anwender +Rettungswurf: Keiner +Dieser Zauber erschafft 9 Wurfpfeile, die vom Anwender verwendet werden können und nicht abgelegt werden können, solange der Zauber wirkt. Die Wurfpfeile sind +3 und fügen einen Schaden von 1-4 Punkten zu. Ein Wesen, das von einem Wurfpfeil getroffen wird, muss einen Rettungswurf gegen Tod durchführen oder erleidet weitere 2-12 Schadenspunkte und büßt 5 Runden lang 3 Stärkepunkte ein. Die Waffenfertigkeit des Anwenders mit Wurfpfeilen (bzw. ihr Fehlen) hat keine Auswirkungen auf die Treffsicherheit der Wurfpfeile.~ +%atsymbol%50=~Knochenwurfpfeile~ +%atsymbol%49=~Otilukes Frostsphäre +(Veränderung, Hervorrufung) +Grad: 6 +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: Speziell +Zeitaufwand: 6 +Wirkungsbereich: Speziell +Rettungswurf: Keine Wirkung +Mit diesem Zauberspruch wird ein Kältestrahl auf ein Wesen gerichtet. Die Reichweite des Strahls entspricht der Sichtweite des Zauberers und verursacht 3-6 Punkte Kälteschaden pro Stufe des Anwenders. Führt das Ziel jedoch einen Rettungswurf aus, weicht es dem Strahl aus und entgeht dem Schaden.~ +%atsymbol%48=~Otilukes Frostsphäre~ +%atsymbol%47=~Flammenschleier (Hervorrufung) +Grad: 5 +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: 1 Runde/2 Stufen (speziell) +Zeitaufwand: 5 +Wirkungsbereich: 1 Wesen +Rettungswurf: Keine Wirkung +Dieser Zauberspruch lässt ein Wesen in Flammen aufgehen, wenn ihm der Rettungswurf gegen Zauber misslingt. Durch die Flammen erleidet das angegriffene Wesen 2-12 Schadenspunkte pro Runde. Außerdem schnellen aus dem brennenden Ziel während der gesamten Wirkungsdauer des Zaubers Flammen hervor, die bewirken, dass alle Wesen im Umkreis von 3 Metern 1-4 Schadenspunkte durch die Flammen erleiden. Zusätzlich müssen alle von den Flammen getroffenen Wesen einen Rettungszauber gegen Zauber ausführen, damit der Zauber nicht auf sie übergreift. Dieser Zauber ist besonders nützlich, um ganze Banden von Trollen und Frostsalamandern zu zerstreuen.~ +%atsymbol%46=~Flammenschleier~ +%atsymbol%45=~Vitriolkugel (Herbeirufung) +Grad: 4 +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: Speziell +Zeitaufwand: 4 +Wirkungsbereich: Speziell +Rettungswurf: Speziell +Mit diesem Zauber wird eine Kugel leuchtend-smaragdgrüner Säure herbeigerufen, die der Anwender auf ein beliebiges Ziel im Wirkungsbereich richten kann. Erreicht die Kugel das Ziel, explodiert sie und tränkt das Opfer in starker Säure. Das Opfer erleidet 1-4 Schadenspunkte durch Säure pro Stufe des Anwenders bis zu einem Maximum von 12-48 Schadenspunkten. Nach dem anfänglichen Schaden muss dem Opfer ein Rettungswurf gelingen, um noch mehr Schaden abzuwenden. Wenn der Rettungswurf fehlschlägt, erleidet das Opfer auch in den folgenden Runden Säureschaden, wobei in jeder Runde die Würfelzahl jeweils um zwei reduziert wird. Beispielsweise fügt ein Zauberer der 8. Stufe seinem Opfer mit diesem Zauber in der ersten Runde 8-32 Schadenspunkte, in der zweiten Runde 6-24 Schadenspunkte, in der dritten Runde 4-16 Schadenspunkte und in der vierten Runde 2-8 Schadenspunkte zu; in der fünften Runde verliert der Zauber dann seine Wirkung. Dem Opfer steht jede Runde ein Rettungswurf gegen Zauber zu, um weitere Schäden zu ver~ +%atsymbol%44=~Vitriolkugel~ +%atsymbol%43=~Taubheit~ +%atsymbol%42=~Brüllen (Anrufung) +Grad: 4 +Reichweite: Anwender +Wirkungsdauer: Augenblicklich +Zeitaufwand: 1 +Wirkungsbereich: 10 Meter lang, Umkreis von 3 Metern +Rettungswurf: 1/2 +Der Zauber "Brüllen" verleiht dem Anwender eine unglaubliche Stimmkraft. Er kann ein ohrenbetäubendes Gebrüll ausstoßen, das sich von seinem Mund in einem kegelförmigen Bereich von 10 Metern Länge und bis zu 3 Metern Durchmesser ausbreitet. Jedes Wesen in diesem Wirkungsbereich wird 2-12 Runden lang taub und erleidet 4-24 Schadenspunkte. Ein erfolgreicher Rettungswurf gegen Zauber vermeidet die Taubheit und halbiert die Zahl der Schadenspunkte.~ +%atsymbol%41=~Brüllen~ +%atsymbol%40=~Mordenkainens Kraftgeschosse +(Anrufung) +Grad: 4 +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: Augenblicklich +Zeitaufwand: 4 +Wirkungsbereich: Speziell +Rettungswurf: Speziell +Dieser Zauber erzeugt eine leuchtende Kugel magischer Energie, die aus der Hand des Anwenders hervorschießt und das Ziel unfehlbar erreicht, wie ein magischer Geschosszauber. Der Zauberer kann auf der 7. Stufe ein Geschoss und für jede 3. nach der 7. Stufe ein weiteres Geschoss erzeugen. Mit anderen Worten erzeugt er zwei Geschosse auf der 10. Stufe, drei auf der 13., vier auf der 16. usw., bis zu einem Maximum von sieben Geschossen auf der 25. Stufe. Jedes Geschoss fügt dem Opfer 2-8 Schadenspunkte zu und bricht dann in einen Erschütterungsstoß mit einem Radius von 1,5 Meter auseinander, der pro Stufe des Anwenders 1 Schadenspunkt anrichtet. Ein Zauberer der 12. Stufe könnte beispielsweise zwei Kraftgeschosse herbeirufen, von denen jedes beim Treffer 2-8+12 Schadenspunkte anrichtet. Getroffene Wesen können einen Rettungswurf gegen Zauber versuchen, um den Schaden durch Erschütterung unwirksam zu machen; bei einem Treffer durch das Geschoss selbst ist jedoch kein Rettungswurf möglich. Der Magier-Zauber 1. Gra~ +%atsymbol%39=~Mordenkainens Kraftgeschosse~ +%atsymbol%38=~Hoffnungslosigkeit~ +%atsymbol%37=~Betäubt~ +%atsymbol%36=~Gefühl: Hoffnungslosigkeit +(Verzauberung/Bezauberung) +Grad: 4 +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: 1 Phase +Zeitaufwand: 4 +Wirkungsbereich: Radius von 2 Metern +Rettungswurf: keine Wirkung +Dieser Zauberspruch bewirkt, dass sich innerhalb des Wirkungsbereiches ein Gefühl der Hoffnungslosigkeit ausbreitet. Alle Feinde, denen ein Rettungswurf gegen Zauber misslingt, bleiben einfach stehen und rühren sich 1 Phase lang nicht. Der Zauber hebt die Auswirkungen von „Gefühl: Hoffnung“ im Wirkungsbereich auf, die wirkten, während der Zauber ausgesprochen wurde.~ +%atsymbol%35=~Gefühl: Hoffnungslosigkeit~ +%atsymbol%34=~Panik~ +%atsymbol%33=~Gefühl: Furcht +(Verzauberung/Bezauberung) +Grad: 4 +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: 5 Runden +Zeitaufwand: 4 +Wirkungsbereich: Radius von 2 Metern +Rettungswurf: keine Wirkung +Dieser Zauberspruch ruft im Wirkungsbereich ein Gefühl der Furcht hervor. Alle Feinde, denen ein Rettungswurf gegen Zauber misslingt, fliehen 5 Runden lang. Der Zauber hebt die Auswirkungen von „Gefühl: Mut“ im Wirkungsbereich auf, die wirkten, während der Zauber ausgesprochen wurde.~ +%atsymbol%32=~Gefühl: Furcht~ +%atsymbol%31=~Gefühl: Hoffnung +(Verzauberung/Bezauberung) +Grad: 4 +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: 1 Stunde +Zeitaufwand: 4 +Wirkungsbereich: Radius von 2 Metern +Rettungswurf: Nein +Dieser Zauberspruch ruft im Wirkungsbereich ein Gefühl der Hoffnung hervor. Alle betroffenen Wesen erhalten einen Moralschub und einen Zugewinn von +2 auf ihre Rettungs-, Angriffs- und Schadenswürfe. Dieser Zauber annulliert jede Hoffnungslosigkeit im Wirkungsbereich, die wirkte, während der Zauber ausgesprochen wurde.~ +%atsymbol%30=~Gefühl: Hoffnung~ +%atsymbol%29=~Gefühl: Mut +(Verzauberung/Bezauberung) +Grad: 4 +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: 1 Stunde +Zeitaufwand: 4 +Wirkungsbereich: Radius von 2 Metern +Rettungswurf: Nein +Dieser Zauberspruch ruft im Wirkungsbereich ein Gefühl des Mutes hervor. Alle betroffenen Wesen bekommen +1 auf ihre Trefferwürfe, +3 auf die Schadenswürfe und +5 auf die vorübergehenden Trefferpunkte (dadurch können sie ihre maximale Trefferpunktzahl überschreiten). Dieser Zauber annulliert alle Ängste im Wirkungsbereich, die wirkten, während der Zauber ausgesprochen wurde.~ +%atsymbol%28=~Gefühl: Mut~ +%atsymbol%27=~Tobend~ +%atsymbol%26=~Beltyns Brennendes Blut +(Nekromantie) +Grad: 4 +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: 1 Runde/2 Stufen +Zeitaufwand: 4 +Wirkungsbereich: 1 Wesen +Rettungswurf: Keine Wirkung +Dieser Zauberspruch entzündet das Blut des Ziels und verursacht pro Runde 3-12 Schadenspunkte und raubt dem Opfer die Sinne vor Schmerz. Das Ziel kann jede Runde einen Rettungswurf gegen Zauber anwenden; gelingt dieser, werden Schaden und Berserkerzustand annulliert. Der Zauberspruch zeigt keine Wirkung bei Untoten oder Wesen von anderen Existenzebenen, die kein Blut haben (zum Beispiel Elementare). Bei Wesen, die gegen Feuer widerstandsfähig sind, wird der Schaden durch diesen Zauberspruch reduziert oder annulliert.~ +%atsymbol%25=~Beltyns Brennendes Blut~ +%atsymbol%24=~Lanze der Zerschlagung (Anrufung) +Grad: 3 +Reichweite: 20 Meter +Wirkungsdauer: Augenblicklich +Zeitaufwand: 3 +Wirkungsbereich: Speziell +Rettungswurf: 1/2 +Dieser Zauber erzeugt eine Kraftlanze, die vom Anwender bis zu einem angegebenen Punkt in 18 Metern Entfernung reicht. Wesen, die in den Weg der Lanze geraten, erleiden 5-20 Schadenspunkte durch Wucht, +2 Schadenspunkte pro Stufe des Anwenders (maximal +30). Die Opfer können einen Rettungswurf gegen Zauber durchführen und den Schaden so halbieren.~ +%atsymbol%23=~Lanze der Zerschlagung~ +%atsymbol%22=~Betäubt~ +%atsymbol%21=~Eislanze +(Hervorrufung) +Grad: 3 +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: Augenblicklich +Zeitaufwand: 3 +Wirkungsbereich: 1 Lanze +Rettungswurf: Speziell +Dieser Zauberspruch feuert eine Eislanze auf ein vom Anwender bestimmtes Ziel. Die Lanze trifft automatisch, verursacht 5-30 Schadenspunkte und zwingt das Ziel, einen Rettungswurf gegen Zauber auszuführen, wenn es nicht 1-4 Runden lang betäubt bleiben will.~ +%atsymbol%20=~Eislanze~ +%atsymbol%19=~Geschicklichkeits-Modifikation~ +%atsymbol%18=~Katzenanmut (Veränderung) +Grad: 2 +Reichweite: Berührung +Wirkungsdauer: 1 Stunde/Stufe +Zeitaufwand: 2 +Wirkungsbereich: 1 Wesen +Rettungswurf: Nein +Dieser Zauber erhöht auf magische Weise die Geschicklichkeit des Empfängers. In welchem Ausmaß, hängt von der Klasse des Ziels ab: Diebe gewinnen 1-8 Punkte hinzu, Kämpfer und Magier 1-6 Punkte, und Kleriker 1-4 Punkte. Die "Katzenanmut" kann die Geschicklichkeit des Ziels nicht auf mehr als 20 erhöhen.~ +%atsymbol%17=~Katzenanmut~ +%atsymbol%16=~Dekastab~ +%atsymbol%15=~Dekastab~ +%atsymbol%14=~Dekastab +(Hervorrufung) +Grad: 2 +Reichweite: Anwender +Wirkungsdauer: 1 Runde pro Stufe +Zeitaufwand: 2 +Wirkungsbereich: Anwender +Rettungswurf: Nein +Dieser Zauberspruch legt einen Kraftstab in die Hand des Anwenders. Dieser wird als magische Waffe benutzt, die 1-6 Schadenspunkte pro Treffer verursacht; außerdem kann er Wesen treffen, die gegen normale Waffen immun sind. Es handelt sich jedoch um einen Stab, für den Fertigkeiten im Umgang mit Stabwaffen erforderlich sind. Andernfalls führt die Verwendung des Dekastabs zu Strafpunkten. Der Stab kann seinem Ziel auch 1-2 Trefferpunkte auf einen Schlag entziehen. Diese Punkte gehen auf das Konto des Anwenders, können aber nur Schaden heilen; die Trefferpunkte werden nicht über die normale Höchstzahl hinaus erhöht.~ +%atsymbol%13=~Dekastab~ +%atsymbol%12=~~ +%atsymbol%11=~Snillocs Schneeballschwarm +(Hervorrufung) +Grad: 2 +Reichweite: Sichtweite des Anwenders +Wirkungsdauer: Augenblicklich +Zeitaufwand: 2 +Wirkungsbereich: 4,5 m Radius +Rettungswurf: 1/2 +Dieser Zauberspruch bewirkt, dass von einem bestimmten Punkt aus eine Ladung Schneebälle abgeschossen wird. Diese treffen alles, was sich im Wirkungsbereich befindet, und verursachen 1W3 Schadenspunkte durch Kälte pro Stufe bis zu maximal 8W3 Schadenspunkte auf Stufe 8. Gegen feuerspeiende oder feuerbewohnende Wesen erzielen sie 1W6 Schadenspunkte durch Kälte pro Stufe bis zu maximal 8W6 Schadenspunkte auf Stufe 8.~ +%atsymbol%10=~~ +%atsymbol%9=~Snillocs Schneeballschwarm~ +%atsymbol%8=~Auge der Gedanken blockiert die Wirkung und löst sich auf~ +%atsymbol%7=~Auge des Schwertes blockiert die Wirkung und löst sich auf~ +%atsymbol%6=~Auge des Magiers blockiert die Wirkung und löst sich auf~ +%atsymbol%5=~Auge des Giftes blockiert die Wirkung und löst sich auf~ +%atsymbol%4=~Auge des Geistes blockiert die Wirkung und löst sich auf~ +%atsymbol%3=~Auge der Stärke blockiert die Wirkung und löst sich auf~ +%atsymbol%2=~Auge des Steines blockiert die Wirkung und löst sich auf~ +%atsymbol%1=~Dieser Zauber heilt den Charakter um 11 Trefferpunkte.~ diff --git a/iwdification/dw_iwdspells_resource/tra/en_us/dw_iwdspells_arcane.tra b/iwdification/dw_iwdspells_resource/tra/en_us/dw_iwdspells_arcane.tra new file mode 100644 index 0000000..80cac9f --- /dev/null +++ b/iwdification/dw_iwdspells_resource/tra/en_us/dw_iwdspells_arcane.tra @@ -0,0 +1,71 @@ +// this is a copy of the tra file from Sword Coast Stratagems + +@1="Create Boneguard" +@2="Create Boneguard +(Necromancy) + +Level: 9 +Range: 20 ft. +Duration: 8 rounds + 1 round/level +Casting Time: 9 +Area of Effect: Special +Saving Throw: None +With the casting of this spell, the wizard calls forth 1d2 boneguards. These undead monstrosities appear within spell range and can be commanded to attack the caster's opponents until the spell duration expires or the monsters are destoyed." + +@3 = "Conjure Earth Elemental +(Conjuration/Summoning) + +Level: 6 +Range: Visual range of the caster +Duration: 1 turn/level +Casting Time: 9 +Area of Effect: Special +Saving Throw: None + +Upon casting a Conjure Earth Elemental spell, the caster opens a special gate to the Elemental Plane of Earth, and an earth elemental is summoned in the vicinity of the caster. There is a 60% chance that a 12-Hit-Dice elemental appears, a 35% chance that a 16-Hit-Dice elemental appears, and a 5% chance that a 24-Hit-Dice elemental appears. The elemental will do the bidding of the caster until it is slain or the duration of the spell runs out. All of the commands given to the elemental are done telepathically, so there is no time lost due to miscommunication and no need to know the language of the summoned creature." +@4 = "Conjure Fire Elemental +(Conjuration/Summoning) + +Level: 6 +Range: Visual range of the caster +Duration: 1 turn/level +Casting Time: 9 +Area of Effect: Special +Saving Throw: None + +Upon casting a Conjure Fire Elemental spell, the caster opens a special gate to the Elemental Plane of Fire, and a fire elemental is summoned in the vicinity of the caster. There is a 60% chance that a 12-Hit-Dice elemental appears, a 35% chance that a 16-Hit-Dice elemental appears, and a 5% chance that a 24-Hit-Dice elemental appears. The elemental will do the bidding of the caster until it is slain or the duration of the spell runs out. All of the commands given to the elemental are done telepathically, so there is no time lost due to miscommunication and no need to know the language of the summoned creature." +@5 = "Conjure Air Elemental +(Conjuration/Summoning) + +Level: 6 +Range: Visual range of the caster +Duration: 1 turn/level +Casting Time: 9 +Area of Effect: Special +Saving Throw: None + +Upon casting a Conjure Air Elemental spell, the caster opens a special gate to the Elemental Plane of Air, and an air elemental is summoned in the vicinity of the caster. There is a 60% chance that a 12-Hit-Dice elemental appears, a 35% chance that a 16-Hit-Dice elemental appears, and a 5% chance that a 24-Hit-Dice elemental appears. The elemental will do the bidding of the caster until it is slain or the duration of the spell runs out. All of the commands given to the elemental are done telepathically, so there is no time lost due to miscommunication and no need to know the language of the summoned creature." +@6 = "Conjure Water Elemental +(Conjuration/Summoning) + +Level: 6 +Range: Visual range of the caster +Duration: 1 turn/level +Casting Time: 9 +Area of Effect: Special +Saving Throw: None + +Upon casting a Conjure Water Elemental spell, the caster opens a special gate to the Elemental Plane of Water, and a water elemental is summoned in the vicinity of the caster. There is a 60% chance that a 12-Hit-Dice elemental appears, a 35% chance that a 16-Hit-Dice elemental appears, and a 5% chance that a 24-Hit-Dice elemental appears. The elemental will do the bidding of the caster until it is slain or the duration of the spell runs out. All of the commands given to the elemental are done telepathically, so there is no time lost due to miscommunication and no need to know the language of the summoned creature." +@7="Conjure Lesser Water Elemental" +@8="Elder Water Elemental" +@9="Lesser Water Elemental" +@10="Mordenkainen's Force Blade" +@11="Orc Warrior" +@12="Orc Archer" +@13="Hobgoblin Warrior" +@14="Hobgoblin Archer" +@15="Ettin" +@16="Yuan-Ti" +@17="Giant Troll" +@18="and so on, to a maximum of seven missiles at 25th level" // TO TRANSLATORS: must be verbatim from IWD 'Mordenkainen's Force Missiles' description +@19="to a maximum of five missiles at 19th level" \ No newline at end of file diff --git a/iwdification/dw_iwdspells_resource/tra/en_us/dw_iwdspells_bard.tra b/iwdification/dw_iwdspells_resource/tra/en_us/dw_iwdspells_bard.tra new file mode 100644 index 0000000..a1054b7 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/tra/en_us/dw_iwdspells_bard.tra @@ -0,0 +1,18 @@ +@1="May use Bard Song ability\. While active, the Bard Song has the following effects:" // 1-4 must exactly match the appropriate strings from the BG2 description of the bard song (other than replacing '.' with '\.') +@2="Restore morale to its average value" +@3="Remove Fear" +@4="Protection From Fear" + + + +@10="May use Bard Song ability to play any song from repertoire." +@11="Can play The Ballad of Three Heroes starting at 1st level." +@12="Can play The Tale of Curran Strongheart starting at 3rd level." +@13="Can play Tymora's Melody starting at 5th level." +@14="Can play The Song of Kaudies starting at 7th level." +@15="Can play The Siren's Yearning starting at 9th level." +@16="Can play War Chant of Sith starting at 11th level." + +@20="Does not know the songs available to regular Bards." +@21="None." // must match the string used in kit descriptions to indicate that there are no disadvantages; see, e.g., Jester +@22="Disadvantages:" // must match appropriate string from kit descriptions \ No newline at end of file diff --git a/iwdification/dw_iwdspells_resource/tra/en_us/dw_iwdspells_divine.tra b/iwdification/dw_iwdspells_resource/tra/en_us/dw_iwdspells_divine.tra new file mode 100644 index 0000000..bff9fcd --- /dev/null +++ b/iwdification/dw_iwdspells_resource/tra/en_us/dw_iwdspells_divine.tra @@ -0,0 +1,47 @@ +// this is a copy of the tra file from Sword Coast Stratagems + + +@1="Chant +(Conjuration/Summoning) + +Level: 2 +Sphere: Combat +Range: Visual range of the caster +Duration: 1 turn +Casting Time: 9 +Area of Effect: 60-ft. radius +Saving Throw: None + +By means of the Chant spell, the priest brings special favor upon self and party and causes harm to enemies. When the Chant spell is completed, all the priest's allies within the area of effect gain a +1 bonus to attack rolls, minimum damage rolls, and Saving Throws. Furthermore, damage dice for all effects outside a weapon's base damage is reduced by 1. For example, a 6d6 fireball will do 6d5 damage, and a flaming long sword that deals 1d8+2 slashing plus 1d3 fire damage will deal 1d8+2 slashing plus 1d2 fire damage instead. The priest's enemies suffer from the opposite effects. + +Multiple chants are not cumulative. This spell requires a moderate amount of concentration by the caster, so movement is slowed by half." +@2="It cannot be cast by good-aligned characters." // NOTE TO TRANSLATORS: this must *exactly* match the sentence in the description of Cause Light Wounds in your language with this English translation. +@3="It cannot be cast by good-aligned characters." // NOTE TO TRANSLATORS: this must *exactly* match the sentence in the description of Cause Moderate Wounds in your language with this English translation. +@4="Cause Medium Wounds cannot be cast by good-aligned characters." // NOTE TO TRANSLATORS: this must *exactly* match the sentence in the description of Cause Medium Wounds in your language with this English translation. +@5="It cannot be cast by good-aligned characters." // NOTE TO TRANSLATORS: this must *exactly* match the sentence in the description of Cause Serious Wounds in your language with this English translation. +@6="It can be cast only by evil-aligned characters." // NOTE TO TRANSLATORS: this must *exactly* match the sentence in the description of Cause Critical Wounds in your language with this English translation. +@7="It can only be cast by evil-aligned characters." // NOTE TO TRANSLATORS: this must *exactly* match the sentence in the description of Cause Serious Wounds in your language with this English translation. + + +// note to translators: any sentence containing any of strings 10001-10020 is deleted from the spell description. Use these to remove good/evil alignment restrictions from the spell descriptions. (Use 10007 and later if you need more than 6 strings to do this in your language) + +@10001="can only be cast by good-aligned characters" +@10002="can only be cast by evil-aligned characters" +@10003="can be cast only by good-aligned characters" +@10004="can be cast only by evil-aligned characters" +@10005="cannot be cast by good-aligned characters" +@10006="cannot be cast by evil-aligned characters" +@10007="NULL_NOT_IN_USE_WURBLE" +@10008="NULL_NOT_IN_USE_WURBLE" +@10009="NULL_NOT_IN_USE_WURBLE" +@10010="NULL_NOT_IN_USE_WURBLE" +@10011="NULL_NOT_IN_USE_WURBLE" +@10012="NULL_NOT_IN_USE_WURBLE" +@10013="NULL_NOT_IN_USE_WURBLE" +@10014="NULL_NOT_IN_USE_WURBLE" +@10015="NULL_NOT_IN_USE_WURBLE" +@10016="NULL_NOT_IN_USE_WURBLE" +@10017="NULL_NOT_IN_USE_WURBLE" +@10018="NULL_NOT_IN_USE_WURBLE" +@10019="NULL_NOT_IN_USE_WURBLE" +@10020="NULL_NOT_IN_USE_WURBLE" \ No newline at end of file diff --git a/iwdification/dw_iwdspells_resource/tra/en_us/iwdspells.tra b/iwdification/dw_iwdspells_resource/tra/en_us/iwdspells.tra new file mode 100644 index 0000000..01971d7 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/tra/en_us/iwdspells.tra @@ -0,0 +1,1211 @@ +@359=~Courage~ +@358=~Hope~ +@357=~Cat's Grace~ +@356=~Righteous Wrath of the Faithful~ +@355=~Prayer~ +@354=~Blood Rage~ +@353=~Recitation~ +@352=~Exaltation~ +@351=~Animal Rage~ +@350=~Iron Body~ +@349=~Petrified~ +@348=~Impervious Sanctity of Mind~ +@347=~Pain~ +@346=~Phased~ +@345=~Aid~ +@344=~Mind Blank~ +@343=~Earth Elemental Transformation~ +@342=~Fire Elemental Transformation~ +@341=~War Chant of Sith-Armor Bonuses and Regeneration~ +@340=~"War Chant of Sith" +All allies within 30 ft. gain a +2 bonus to Armor Class, +10% resistance to slashing, piercing, crushing, and missile damage, and the ability to regenerate 2 Hit Points per round.~ +@339=~War Chant of Sith~ +@338=~Enthralled~ +@337=~The Siren's Yearning-Enthralls Creatures~ +@336=~"The Siren's Yearning" +All enemies within 30 ft. must save vs. Spell or become enthralled, unable to take action until 1 round passes or they take damage.~ +@335=~The Siren's Yearning~ +@334=~The Song of Kaudies-Resistant to Sound Attacks~ +@333=~"The Song of Kaudies" +All allies within 30 ft. have a 50% chance to shrug off the effects of spells such as Silence, Shout, Great Shout, Command, Greater Command, or any other sound-based attack.~ +@332=~The Song of Kaudies~ +@331=~Tymora's Melody-Luck and Skill Bonuses~ +@330=~"Tymora's Melody" +All allies within 30 ft. gain +1 to luck, +3 to Saving Throws, +10 to lore, and a +10% bonus to all of their thieving skills.~ +@329=~Tymora's Melody~ +@328=~The Tale of Curran Strongheart-Immunity to Fear~ +@327=~"The Tale of Curran Strongheart" +All allies within 30 ft. gain immunity to fear effects for as long as the song lasts, and any fear effects currently on them are removed.~ +@326=~The Tale of Curran Strongheart~ +@325=~The Ballad of Three Heroes-Combat Bonuses~ +@324=~"The Ballad of Three Heroes" +All allies within 30 ft. gain +1 to hit, +1 to damage, and +1 to all their Saving Throws.~ +@323=~The Ballad of Three Heroes~ +@322=~Releases Acidic Vapor~ +@321=~Withering~ +@320=~Wither +(Necromancy) +Level: 7 +Sphere: Healing +Range: Touch +Duration: 1 round/2 levels +Casting Time: 7 +Area of Effect: 1 creature +Saving Throw: Neg. +This powerful spell causes the organs of the touched creature to cease functioning and wither away unless a Save vs. Death at a penalty of -4 is made. The creature affected will lose 3 Hit Points per second. The effect lasts for 1 round per 2 levels of the caster or until dispelled. For example, a 14th-level priest would cause the targeted creature to lose 18 Hit Points per round for 7 rounds. This spell has no effect on undead, constructs, or extraplanar creatures. It can only be cast by evil-aligned characters.~ +@319=~Wither~ +@318=~Chant +(Conjuration/Summoning) +Level: 2 +Sphere: Combat +Range: Visual range of the caster +Duration: 1 turn +Casting Time: 9 +Area of Effect: 60-ft. radius +Saving Throw: None +By means of the Chant spell, the priest brings special favor upon self and party and causes harm to enemies. When the Chant spell is completed, all the priest's allies within the area of effect gain a +1 bonus to attack rolls, minimum damage rolls, and Saving Throws. Furthermore, damage dice for all effects outside a weapon's base damage is reduced by 1. For example, a 6d6 fireball will do 6d5 damage, and a flaming long sword that deals 1d8+2 slashing plus 1d3 fire damage will deal 1d8+2 slashing plus 1d2 fire damage instead. The priest's enemies suffer from the opposite effects. +Multiple chants are not cumulative. This spell requires a moderate amount of concentration by the caster, so the priest cannot cast any spells for the chant's duration, and movement is slowed by half.~ +@317=~Chant~ +@316=~Fart Repellent for Bombardier Beetles. +Do not translate~ +@315=~Boring Beetle~ +@314=~Boring Beetle~ +@313=~Bombardier Beetle~ +@312=~Bombardier Beetle~ +@311=~Giant Insect +(Alteration) +Level: 4 +Sphere: Animal +Range: Visual range of the caster +Duration: 8 hours +Casting Time: 7 +Area of Effect: Special +Saving Throw: None +This spell summons 2-3 boring beetles or bombardier beetles to the caster's side. The beetles will obey the caster until the spell expires or they are slain.~ +@310=~Giant Insect~ +@309=~Cause Critical Wounds +(Necromancy) +Level: 5 +Sphere: Healing +Range: Touch +Duration: Instant +Casting Time: 8 +Area of Effect: 1 creature +Saving Throw: 1/2 +By casting this spell and touching a creature, the priest deals 27 points of magic damage (save vs. Spell for half) to the creature's body. This spell has no effect on undead, constructs, or extraplanar creatures. It can be cast only by evil-aligned characters.~ +@308=~Cause Critical Wounds~ +@307=~Cause Serious Wounds +(Necromancy) +Level: 4 +Sphere: Healing +Range: Touch +Duration: Instant +Casting Time: 5 +Area of Effect: 1 creature +Saving Throw: 1/2 +By casting this spell and touching a creature, the priest deals 17 points of damage (save vs. Spell for half) to the creature's body. This spell has no effect on undead, constructs, or extraplanar creatures. It cannot be cast by good-aligned characters.~ +@306=~Cause Serious Wounds~ +@305=~Two Levels Drained~ +@304=~Energy Drain +(Necromancy) +Level: 7 +Sphere: Necromantic +Range: Touch +Duration: Permanent +Casting Time: 3 +Area of Effect: 1 creature +Saving Throw: None +Casting this spell opens a channel between the caster's plane and the Negative Energy Plane. The caster acts as a conduit between the two planes, sucking life from a victim and transferring it to the Negative Energy Plane, draining of 2 levels of experience. The target of this spell loses levels, Hit Dice, Hit Points, and abilities permanently. These levels can only be restored by a priest's Restoration spell. This spell has no effect on undead, constructs, or extraplanar creatures. It can only be cast by evil-aligned characters.~ +@303=~Energy Drain~ +@302=~Entangled~ +@301=~Shambling Mound~ +@300=~Shambling Mound~ +@299=~Stalker +(Conjuration) +Level: 7 +Sphere: Plant +Range: Visual range of the caster +Duration: 8 hours +Casting Time: 9 +Area of Effect: Special +Saving Throw: None +This spell creates two 11-HD shambling mounds. These creatures willingly aid the caster in combat or whatever other duties they are assigned and have the capability to carry out.~ +@298=~Stalker~ +@297=~Mist of Eldath +(Invocation) +Level: 7 +Sphere: Elemental +Range: Visual range of the caster +Duration: Instant +Casting Time: 9 +Area of Effect: 7-ft. radius +Saving Throw: None +This spell blankets the area of effect with a silver-blue mist-any creature within the mist will be cured of disease and poison and healed 25 Hit Points.~ +@296=~Mist of Eldath~ +@295=~Greater Shield of Lathander +(Conjuration) +Level: 7 +Sphere: Guardian +Range: Touch +Duration: 3 rounds +Casting Time: 9 +Area of Effect: 1 creature +Saving Throw: None +This spell grants the recipient 100% Magic Resistance and immunity to damage for the duration of the spell. Evil creatures cannot be protected by a Greater Shield of Lathander. This spell can only be cast by good-aligned characters.~ +@294=~Greater Shield of Lathander~ +@293=~Destruction +(Necromancy) +Level: 7 +Sphere: Healing +Range: Touch +Duration: Instant +Casting Time: 9 +Area of Effect: The caster +Saving Throw: Special +This spell instantly destroys a target, blasting it into small chunks. The victim is allowed a Save vs. Death at a penalty of -4; if successful, the target takes 8d6 points of magic damage instead of being destroyed. Destruction can only be cast by evil characters. Note that a character struck with a Destruction spell cannot be raised from the dead with a Raise Dead or Resurrection spell.~ +@292=~Destruction~ +@291=~Spell Ineffective~ +@290=~Impervious Sanctity of Mind +(Abjuration) +Level: 7 +Sphere: Protection +Range: 0 +Duration: 1 turn/level +Casting Time: 9 +Area of Effect: The caster +Saving Throw: None +This spell steels the caster's mind against any outside influence. Charm, confusion, fear, feeblemindedness, hold, sleep, maze, berserk, and intoxication will not affect the caster as long as this spell is in effect.~ +@289=~Impervious Sanctity of Mind~ +@288=~Symbol, Hopelessness +(Conjuration/Summoning) +Level: 7 +Sphere: Guardian +Range: Visual range of the caster +Duration: 2 turns +Casting Time: 3 +Area of Effect: 15-ft. radius +Saving Throw: Neg. +Symbol, Hopelessness is a powerful enchantment that allows the priest to inscribe a symbol on the ground or any other surface. The symbol will remain there until an opponent comes too close, at which point it will explode, causing all enemies within the area of effect to make a Save vs. Spell with a -2 penalty or stand in place, overwhelmed by dejection and surrender. They will make no move to defend themselves from attack. This spell nullifies Emotion, Hope within the area of effect at the time of casting.~ +@287=~Symbol, Hopelessness~ +@286=~Wracking Pains~ +@285=~Symbol, Pain +(Conjuration/Summoning) +Level: 7 +Sphere: Guardian +Range: Visual range of the caster +Duration: 11 turns +Casting Time: 3 +Area of Effect: 15-ft. radius +Saving Throw: Neg. +All enemies within 15 ft. of the symbol of pain at the moment it is invoked must make a Save vs. Spell. Those who fail their Saving Throws are overwhelmed by pain, suffering a -4 penalty to their attack rolls, a -2 penalty to their Dexterity scores, and a -2 penalty to their Armor Class.~ +@284=~Symbol, Pain~ +@283=~Spiritual Wrath +(Invocation) +Level: 6 +Sphere: Combat +Range: Visual range of the caster +Duration: Instant +Casting Time: 2 +Area of Effect: Special +Saving Throw: 1/2 +Upon completion of this spell, the priest becomes a focus of spiritual energy, which then shoots out from the caster in four directions, like lightning bolts. All creatures in the bolts' paths take 4d10 points of magic damage (save vs. Spell for half). Creatures of the same moral alignment (good, neutral, evil) as the caster are unaffected by the spell.~ +@282=~Spiritual Wrath~ +@281=~Whirlwind +(Invocation) +Level: 6 +Sphere: Elemental Air +Range: Visual range of the caster +Duration: Special +Casting Time: 9 +Area of Effect: Special +Saving Throw: Special +This spell creates a small whirlwind within the caster's sight. The whirlwind will fly around randomly, harming friend and foe alike. The caster is immune to own spell, and elementals and other huge creatures are also unaffected. If a creature is caught in the path of the whirlwind, it takes 2d8 crushing damage, 2d8 slashing damage, and must make a Save vs. Breath Weapon or be stunned for 2 rounds. Creatures with 2 or fewer Hit Dice are automatically killed by this spell. A maximum of 8 targets can be affected, after which the whirlwind will dissipate.~ +@280=~Whirlwind~ +@279=~Entropy Shield +(Abjuration) +Level: 6 +Sphere: Protection +Range: 0 +Duration: 1 round/level +Casting Time: 9 +Area of Effect: The caster +Saving Throw: None +When cast, this spell surrounds the caster with a defensive maelstrom of energy that blocks or deflects many attacks. This gives the priest a +6 bonus to Armor Class, a +2 bonus to Saving Throws, and +50% resistance to electricity, fire, cold, and acid. The priest is also immune to Flamestrike and all missile-based attacks, including missiles created by spells such as Magic Missile.~ +@278=~Entropy Shield~ +@277=~Mass Cause Light Wounds +(Necromancy) +Level: 5 +Sphere: Healing +Range: 0 +Duration: Instant +Casting Time: 5 +Area of Effect: 15-ft. radius +Saving Throw: 1/2 +By casting this spell, the priest deals 1d8 + 1/level points of damage to nearby enemies. A successful Save vs. Spell halves the damage. This spell has no effect on undead, constructs, or extraplanar creatures. It can only be cast by evil-aligned characters.~ +@276=~Mass Cause Light Wounds~ +@275=~Animal Rage +(Enchantment) +Level: 5 +Sphere: Combat +Range: Touch +Duration: 15 rounds +Casting Time: 8 +Area of Effect: 1 creature +Saving Throw: None +This spell imbues the target creature with animal ferocity. The target creature gains a Strength score of 19, +20 Hit Points, +20% movement rate, and a +2 bonus to all Saving Throws. The target loses the ability to cast spells while Animal Rage is in effect; when enemies are within sight, immediately attacks in melee, using whatever is in hand. While this spell is in effect, there is a 5% chance per round that the target will go berserk, attacking friend and foe alike.~ +@274=~Animal Rage~ +@273=~Undead Ward +(Necromancy) +Level: 5 +Sphere: Wards +Range: 0 +Duration: 1 turn +Casting Time: 7 +Area of Effect: 10-ft. radius +Saving Throw: None +This spell amplifies the influence a priest has over undead, though it is tied to the area surrounding the priest at the moment of its casting and does not move. Any undead creature entering the area of effect is affected as if turned by the priest that cast this spell. If the turning fails, the undead creature is immune to further turning attempts by the spell unless it leaves and reenters the area of effect.~ +@272=~Undead Ward~ +@271=~Shield of Lathander +(Conjuration) +Level: 5 +Sphere: Guardian +Range: Touch +Duration: 2 rounds +Casting Time: 8 +Area of Effect: 1 creature +Saving Throw: None +This spell grants the recipient immunity to damage for the duration of the spell. Evil creatures cannot be protected by a Shield of Lathander. This spell cannot be cast by evil-aligned characters.~ +@270=~Shield of Lathander~ +@269=~Spike Stones +(Alteration, Enchantment) +Level: 5 +Sphere: Elemental Earth +Range: Visual range of the caster +Duration: 12 rounds +Casting Time: 6 +Area of Effect: 8-ft. radius +Saving Throw: Special +This spell warps the surrounding rock, reshaping the terrain into spiked projections that blend into the background. Any creature entering the area takes 2d4 Hit Points of piercing damage per round and must make a Save vs. Spell or have its movement rate reduced by 30%.~ +@268=~Spike Stones~ +@267=~Righteous Wrath of the Faithful +(Enchantment/Charm) +Level: 5 +Sphere: Combat +Range: 0 +Duration: 1 round/level +Casting Time: 8 +Area of Effect: 17-ft. radius +Saving Throw: None +This spell bestows a form of divine madness upon the priest's allies, improving their combat skills. All the priest's allies in the area of effect gain a +1 to attack rolls and Saving Throws, plus 8 bonus Hit Points for the duration of the spell (these Hit Points can take a target beyond Hit Point maximum). Allies of the same alignment, however, gain an extra attack every round (canceling haste), a +2 bonus to their attack rolls, damage rolls, and Saving Throws, and immunity to charm and hold spells. Anyone affected by Righteous Wrath of the Faithful will suffer fatigue when the spell wears off.~ +@266=~Righteous Wrath of the Faithful~ +@265=~Wall of Moonlight +(Invocation) +Level: 4 +Sphere: Protection, Sun +Range: Visual range of the caster +Duration: 1 turn +Casting Time: 7 +Area of Effect: 8 ft. long, 2 ft. wide wall +Saving Throw: None +This spell invokes a shimmering tapestry of blue-white force. This wall is intangible, requiring no physical anchor, and can easily be passed through. Evil creatures passing through the wall take 2d10 magic damage; evil undead creatures take 5d10. A creature that has passed through the wall can only take damage from it once.~ +@264=~Wall of Moonlight~ +@263=~Thorn Spray +(Alteration) +Level: 4 +Sphere: Plant +Range: 30 ft. +Duration: Instant +Casting Time: 3 +Area of Effect: 17-ft. cone with 90-deg. arc +Saving Throw: 1/2 +By means of this spell, the caster can cause a spray of barbs, spikes, thorns, and spines to spring forth from hand. The thorn spray covers a 17-ft.-long cone, inflicting 2d10 points of piercing damage to all creatures within the area of effect, or 1d10 points of damage if a Save vs. Death is successful.~ +@262=~Thorn Spray~ +@261=~Unconscious~ +@260=~Smashing Wave +(Invocation) +Level: 4 +Sphere: Elemental Water +Range: 100 ft. +Duration: Instant +Casting Time: 9 +Area of Effect: Special +Saving Throw: Special +This spell summons a 5-ft. wide wave of water that moves in the direction willed by the caster, striking all in its path with massive force. The wave deals 4d10 points of crushing damage; in addition, struck creatures may be either stunned (25% chance) or knocked unconscious (5% chance) for 2 rounds. If the creature struck makes a successful Save vs. Breath Weapon, the damage is reduced by half and the creature avoids being stunned or knocked unconscious.~ +@259=~Smashing Wave~ +@258=~Star Metal Cudgel~ +@257=~Star Metal Cudgel~ +@256=~Star Metal Cudgel +(Conjuration) +Level: 4 +Sphere: Combat +Range: 0 +Duration: 3 turns +Casting Time: 7 +Area of Effect: The caster +Saving Throw: None +This spell creates a meteoric iron magical club that deals 1d6+2 points of crushing damage, confers a +2 bonus to attack rolls, and is treated as a +4 weapon for purposes of what it can hit. Strength, proficiency, and specialization bonuses and penalties apply normally. The club deals an additional 2d6 points of crushing damage against unnatural creatures (undead, elementals, golems, outer-planar creatures, etc.).~ +@255=~Star Metal Cudgel~ +@254=~Unfailing Endurance +(Necromancy) +Level: 4 +Sphere: Necromantic +Range: Touch +Duration: Instant +Casting Time: 9 +Area of Effect: 1 creature +Saving Throw: None +This spell restores the stamina of the creature touched, eliminating any fatigue.~ +@253=~Unfailing Endurance~ +@252=~Cloud of Pestilence +(Alteration) +Level: 4 +Sphere: Combat, Elemental Air +Range: Visual range of the caster +Duration: 4 rounds +Casting Time: 7 +Area of Effect: 12-ft. radius +Saving Throw: Neg. +This spell transforms the air in a 12-ft. radius into sickening, grayish mists. The caster and non-living creatures are immune to the effects of the cloud. For every round of exposure to the disease-ridden air, a creature must save vs. Breath or suffer 3 points of magic damage, blindness, and the loss of 3 points of Strength and Dexterity. The blindness and ability score penalties last 1 turn. Cloud of Pestilence can only be cast by evil-aligned characters.~ +@251=~Cloud of Pestilence~ +@250=~Stun~ +@249=~Healed~ +@248=~Blood Rage +(Alteration) +Level: 4 +Sphere: Combat +Range: Visual range of the caster +Duration: 2 turns +Casting Time: 7 +Area of Effect: 1 creature +Saving Throw: None +This spell works only on player characters or allied creatures. When cast, the target of this spell goes berserk, attacking the nearest creature until that creature is dead, then moving on to the next target. While under Blood Rage, the target is immune to charm, sleep, fear, hold, stunning, confusion, emotion, symbol spells, and related effects. In addition, the target gains +2 to hit, +3 to damage, +2 to Strength, +10 to maximum Hit Points, and +2 to movement rate. The spell has several disadvantages, however: The Hit Points of the target are masked for the duration of the spell, and the target cannot benefit from any effect that heals Hit Points. At the end of the spell's duration, the target becomes fatigued and Strength drops to 3 for 2 turns. Blood Rage cannot affect-and cannot be cast by-creatures of lawful alignment.~ +@247=~Blood Rage~ +@246=~Recitation +(Abjuration, Invocation/Evocation) +Level: 4 +Sphere: Combat +Range: 0 +Duration: 1 round/level +Casting Time: 7 +Area of Effect: 25-ft. radius +Saving Throw: None +By reciting a sacred passage or declaration, the priest invokes deity's blessing upon self and allies while sowing confusion and weakness among enemies. The priest's allies gain a +2 bonus to their attack rolls and Saving Throws, and the priest's enemies receive a -2 penalty to the same. Recitation does not nullify a Prayer spell-the two can be cast in tandem, and the effects are cumulative.~ +@245=~Recitation~ +@244=~Discharge of static electricity~ +@243=~Static Charge +(Alteration) +Level: 4 +Sphere: Weather +Range: 0 +Duration: 1 turn/level +Casting Time: 9 +Area of Effect: Visual range of the caster +Saving Throw: 1/2 +Static Charge is similar to Call Lightning, except it can be used indoors. This spell allows the caster to generate a static charge around any creature within the area of effect, dealing 2d8 points of electrical damage plus an additional 1d8 points per level of the caster (save vs. Spell for half). The charge keeps going off once every turn for the duration of the spell.~ +@242=~Static Charge~ +@241=~Produce Fire +(Alteration) +Level: 4 +Sphere: Elemental Fire +Range: Visual range of the caster +Duration: 1 round +Casting Time: 7 +Area of Effect: 4-ft. radius +Saving Throw: None +When cast, flames erupt from the target point, dealing 1d4 points of fire damage plus 1 point per level of the caster to all creatures within the spell's radius. Creatures will take damage once per round regardless of when they enter the area of effect.~ +@240=~Produce Fire~ +@239=~Favor of Ilmater +(Necromancy) +Level: 3 +Sphere: Necromantic, Protection +Range: 30 ft. +Duration: Instant +Casting Time: 6 +Area of Effect: 1 creature +Saving Throw: None +By invoking this spell, the caster switches own life force with that of the recipient, exchanging all physical injuries. The spell will only function if the caster has more Hit Points than the target before the switch is attempted. This switch is permanent until the caster uses normal methods to heal the damage. The exchange can be done from a distance so long as the spell range is not exceeded. Only the Hit Points are exchanged; the caster cannot take on other conditions from the target such as disease, poison, intoxication, and similar afflictions. +This spell cannot be cast by evil-aligned characters. It has no effect on undead, constructs, or extraplanar creatures.~ +@238=~Favor of Ilmater~ +@237=~Cause Medium Wounds +(Necromancy) +Level: 3 +Sphere: Healing +Range: Touch +Duration: Instant +Casting Time: 5 +Area of Effect: 1 creature +Saving Throw: 1/2 +By casting this spell and touching a creature, the priest deals 14 points of damage (save vs. Spell for half) to the creature's body. This spell has no effect on undead, constructs, or extraplanar creatures. Cause Medium Wounds cannot be cast by good-aligned characters.~ +@236=~Cause Medium Wounds~ +@235=~Storm Shell +(Abjuration) +Level: 3 +Sphere: Protection, Weather +Range: 0 +Duration: 1 turn +Casting Time: 6 +Area of Effect: The caster +Saving Throw: None +This spell surrounds the caster with a bright sphere of disruptive energy that moves with . The storm shell increases the caster's resistance to fire, cold, and electrical damage by 50%.~ +@234=~Storm Shell~ +@233=~Mold Touch +(Alteration) +Level: 3 +Sphere: Plant +Range: Touch +Duration: Special +Casting Time: 6 +Area of Effect: 10-ft. radius +Saving Throw: Special +This spell infects the creature the caster touches with a rapidly spreading brown mold. If the infected creature fails a Save vs. Spell, the infection is severe and the creature takes magic damage as follows: +1st round: 4d6 damage +2nd round: 3d6 damage +3rd round: 2d6 damage +4th round: 1d6 damage +If the Saving Throw is successful, the damage is reduced as follows: +1st round: 2d6 damage +2nd round: 1d6 damage +3rd round: 1d6 damage +Each round after the first, the nearest creature within 10 ft. of the victim must make a Save vs. Spell or be infected by the mold at full strength. This process continues until the mold fails to infect a suitable host in time. Creatures already under the effects of the mold cannot contract it again. The brown mold quickly dies once the spell expires.~ +@232=~Mold Touch~ +@231=~Cloudburst +(Invocation) +Level: 3 +Sphere: Elemental Water +Range: Visual range of the caster +Duration: 2 rounds +Casting Time: 6 +Area of Effect: 17-ft. radius +Saving Throw: None +This spell brings forth a magical rain that saturates the area of effect. All cold- and fire-dwelling creatures take 2d3 points of magic damage per round. In addition, all creatures in the area have a 50% chance per round of being struck by bolts of lightning that deal 2d6 electrical damage, with a Save vs. Spell for half. Flame Blade, Shroud of Flame, and salamander auras are extinguished by Cloudburst.~ +@230=~Cloudburst~ +@229=~Spike Growth +(Alteration) +Level: 3 +Sphere: Elemental Earth +Range: Visual range of the caster +Duration: 1 turn +Casting Time: 6 +Area of Effect: 15-ft. radius +Saving Throw: None +This spell transforms the surrounding terrain into spiky plants. Any creature entering the area takes 1d4 points of piercing damage and 1d4 points of slashing damage every round until the spell expires.~ +@228=~Spike Growth~ +@227=~Circle of Bones +(Necromancy) +Level: 3 +Sphere: Guardian, Creation +Range: 0 +Duration: 3 rounds +Casting Time: 3 +Area of Effect: 3-ft. radius +Saving Throw: None +This spell conjures forth a barrier of floating bones that spin rapidly around the caster, who cannot move for the duration of the spell. Anyone entering the path of the bones takes 1d6 crushing damage and 1d6 slashing damage per round. Circle of Bones cannot be cast by good-aligned characters.~ +@226=~Circle of Bones~ +@225=~Moonblade~ +@224=~Moonblade~ +@223=~Moonblade +(Invocation) +Level: 3 +Sphere: Combat, Sun +Range: 0 +Duration: 2 turns +Casting Time: 6 +Area of Effect: The caster +Saving Throw: None +This spell summons forth a silent, weightless sword-like construct made of moonlight that extends four feet from the caster's hand. The moonblade is considered a +4 weapon for determining what creatures it can hit, though the bonus does not apply to attack rolls made with it. In addition, due to the insubstantial nature of the moonblade, melee bonuses from Strength do not apply. +The strike of a moonblade drains a target's vitality, inflicting 1d12+4 points of magic damage, plus an additional 1d12 points to undead, who are particularly susceptible. A successful strike also temporarily scrambles magic, causing any spells the target casts in the next round to fail.~ +@222=~Moonblade~ +@221=~Sleep~ +@220=~Exaltation +(Abjuration) +Level: 3 +Sphere: Healing +Range: Touch +Duration: 1 turn +Casting Time: 9 +Area of Effect: 1 creature +Saving Throw: None +This spell enables a priest to aid and protect any one being other than the priest. By touch, the caster removes the effects of fear, sleep, feeblemindedness, unconsciousness, and intoxication, as well as berserk and confused states of mind. In addition, the recipient is protected against spells and other attacks that cause these effects for the duration of the spell.~ +@219=~Exaltation~ +@218=~Cause Disease +(Abjuration) +Level: 3 +Sphere: Necromantic +Range: Touch +Duration: 8 hours +Casting Time: 9 +Area of Effect: 1 creature +Saving Throw: Neg. +This spell afflicts one creature the priest touches with a disease that saps the target of 5d4 points of Strength. A successful Save vs. Spell negates the effects. This spell has no effect on undead, constructs, or extraplanar creatures. It cannot be cast by good-aligned characters.~ +@217=~Cause Disease~ +@216=~Combat Penalties~ +@215=~Combat Bonuses~ +@214=~Prayer +(Conjuration/Summoning) +Level: 3 +Sphere: Combat +Range: 0 +Duration: 1 round/level +Casting Time: 6 +Area of Effect: 30-ft. radius +Saving Throw: None +Prayer bestows favor on the priest and allies, and curses their enemies. All attacks, damage, and Saving Throws by friendly characters gain a +1 bonus, while enemy attacks, damage rolls, and saves get a -1 penalty. Any creatures within the area of effect when the spell is cast will continue to be affected by the spell when they leave the area, so if the warriors want to chase down that fleeing goblin, the effects of the Prayer will follow them.~ +@213=~Prayer~ +@212=~Cause Moderate Wounds +(Necromancy) +Level: 2 +Sphere: Healing +Range: Touch +Duration: Instant +Casting Time: 5 +Area of Effect: 1 creature +Saving Throw: 1/2 +By casting this spell and touching a creature, the priest deals 11 points of damage (save vs. Spell for half) to the creature's body. This spell has no effect on undead, constructs, or extraplanar creatures. It cannot be cast by good-aligned characters.~ +@211=~Cause Moderate Wounds~ +@210=~Beast Claw~ +@209=~Beast Claw~ +@208=~Beast Claw +(Alteration) +Level: 2 +Sphere: Combat +Range: 0 +Duration: 1 turn +Casting Time: 5 +Area of Effect: The caster +Saving Throw: None +This spell transforms the caster's arms into the claws of a mighty beast, giving the caster 18/72 Strength and the ability to rake an opponent for 2d4 (plus Strength bonus) points of slashing damage. The caster can attack twice per round with the beast claws, with a +2 bonus to hit.~ +@207=~Beast Claw~ +@206=~Outlined in a Silvery Radiance (AC penalty of 2)~ +@205=~Alicorn Lance +(Invocation) +Level: 2 +Sphere: Combat +Range: Visual range of the caster +Duration: Instant +Casting Time: 5 +Area of Effect: 1 creature +Saving Throw: Special +This spell creates a silver-hued, partially ethereal lance shaped in the form of an alicorn (a unicorn horn). The caster chooses a target, and the alicorn lance instantaneously fires at it, inflicting 3d6 points of piercing damage with a Save vs. Spell for half. Although the alicorn lance dissipates after it strikes, it always leaves a silvery radiance around the target that makes it easier to see and hit, giving it a -2 penalty to its Armor Class for 3 rounds.~ +@204=~Alicorn Lance~ +@203=~Healed~ +@202=~Cure Moderate Wounds +(Necromancy) +Level: 2 +Sphere: Healing +Range: Touch +Duration: Instant +Casting Time: 5 +Area of Effect: 1 creature +Saving Throw: None +A stronger version of the 1st-level priest spell Cure Light Wounds, Cure Moderate Wounds heals 11 Hit Points and cures intoxication. This spell has no effect on undead, constructs, or extraplanar creatures.~ +@201=~Cure Moderate Wounds~ +@200=~Blinded~ +@199=~Sunscorch +(Invocation) +Level: 1 +Sphere: Sun +Range: Visual range of the caster +Duration: Instant +Casting Time: 4 +Area of Effect: 1 creature +Saving Throw: Special +When this spell is cast, a brilliant ray of scorching heat slants down from the sky and strikes one target of the caster's choice. Any creature struck by the ray takes 1d6 points of damage, plus 1 point per level of the caster; however, if the target is an undead creature or a monster vulnerable to bright light, the damage is 1d6, plus 2 points per level of the caster. In addition to sustaining damage, victims are also blinded for 3 rounds. The victim is allowed a Save vs. Spell for half damage and to avoid the blindness.~ +@198=~Sunscorch~ +@197=~Cause Light Wounds +(Necromancy) +Level: 1 +Sphere: Healing +Range: Touch +Duration: Instant +Casting Time: 5 +Area of Effect: 1 creature +Saving Throw: 1/2 +By casting this spell and touching a creature, the priest deals 8 points of damage (save vs. Spell for half) to the creature's body. This spell has no effect on undead, constructs, or extraplanar creatures. It cannot be cast by good-aligned characters.~ +@196=~Cause Light Wounds~ +@195=~Cursed~ +@194=~Curse +(Conjuration/Summoning) +Level: 1 +Sphere: All +Range: Visual range of the caster +Duration: 6 rounds +Casting Time: 9 +Area of Effect: 15-ft. radius +Saving Throw: None +When uttering the Curse spell, the caster lowers the morale of enemy creatures and any Saving Throws and attack rolls they make by 1. At the instant the spell is completed, it affects all creatures in a 15-ft. radius centered on the point selected by the caster. Affected creatures leaving the area are still subject to the spell's effect; those entering the area after the casting is completed are not.~ +@193=~Curse~ +@192=~Eye of Stone +This eye shields the caster from a single petrification attack. +It can also be used as the 3rd-level wizard spell Hold Person, rendering humanoids of man-size or smaller immobile for 1 round/level (Save vs. Spell negates).~ +@191=~Eye of Stone~ +@190=~Eye of the Spirit +This eye blocks one instant-death magic attack (Death Spell; Finger of Death; Power Word, Kill; Slay Living; Destruction). +The wizard may instead choose to expend the eye's power as the 2nd-level wizard spell Ray of Enfeeblement, dropping a target's Strength to 5 (Save vs. Spell negates).~ +@189=~Eye of the Spirit~ +@188=~Eye of Fortitude +This eye blocks one stunning, deafness, blindness, or silence effect. +It may alternatively be expended as the 4th-level wizard spell Shout, dealing 4d6 magic damage and deafening creatures within a 35-ft. cone (Save vs. Spell halves damage and negates deafness).~ +@187=~Eye of Fortitude~ +@186=~Eye of Venom +This eye halts any one attack or effect that could poison the caster. +The eye can also be expended as the 4th-level priest spell Poison, dealing 20 points of damage to one creature over a period of 20 seconds (Save vs. Poison negates).~ +@185=~Eye of Venom~ +@184=~Eye of the Sword +This eye deflects the first physical damaging attack that strikes the caster. +The eye may be expended as the 1st-level wizard spell Magic Missile, creating up to 5 missiles (one for every two levels of experience besides the first) that each strike a target for 1d4+1 magic damage.~ +@183=~Eye of the Sword~ +@182=~Eye of the Mage +This eye absorbs one manifestation of fire, electrical, cold, or acid damage. +The eye can also be expended as the 3rd-level wizard spell Lightning Bolt, dealing 1d6 electrical damage per level (capped at 10d6) to all creatures in its path.~ +@181=~Eye of the Mage~ +@180=~Eye of the Mind +This orb protects the caster against mental attacks such as charm, emotion, and fear. +The eye can be expended as the 1st-level wizard spell Charm Person, bringing a humanoid creature under the caster's control for 1 turn (Save vs. Spell negates).~ +@179=~Eye of the Mind~ +@178=~You cannot cast this spell until the current casting has run out.~ +@177=~Seven Eyes +(Abjuration) +Level: 7 +Range: 0 +Duration: 2 turns +Casting Time: 7 +Area of Effect: The caster +Saving Throw: None +This spell conjures forth seven magical orbs that float in a ring above the caster's head. Each eye has a defensive and offensive ability, though once either one is used, the eye will lose its power. The powers of each eye are described below. +Eye of the Mind: This orb protects the caster against mental attacks such as charm, emotion, and fear. The eye can be expended as the 1st-level wizard spell Charm Person, bringing a humanoid creature under the caster's control for 1 turn (Save vs. Spell negates). +Eye of the Sword: This eye deflects the first physical damaging attack that strikes the caster. The eye may be expended as the 1st-level wizard spell Magic Missile, creating up to 5 missiles (one for every two levels of experience besides the first) that each strike a target for 1d4+1 magic damage. +Eye of the Mage: This eye absorbs one manifestation of fire, electrical, cold, or acid damage. The eye can also be expended as the 3rd-level wizard spell Lightning Bolt, dealing 1d6 electrical damage per level (capped at 10d6) to all creatures in its path. +Eye of Venom: This eye halts any one attack or effect that could poison the caster. The eye can also be expended as the 4th-level priest spell Poison, dealing 20 points of damage to one creature over a period of 20 seconds (Save vs. Poison negates). +Eye of the Spirit: This eye blocks one instant-death magic attack (Death Spell; Finger of Death; Power Word, Kill; Slay Living; Destruction). The wizard may instead choose to expend the eye's power as the 2nd-level wizard spell Ray of Enfeeblement, dropping a target's Strength to 5 (Save vs. Spell negates). +Eye of Fortitude: This eye blocks one stunning, deafness, blindness, or silence effect. It may alternatively be expended as the 4th-level wizard spell Shout, dealing 4d6 magic damage and deafening creatures within a 35-ft. cone (Save vs. Spell halves damage and negates deafness). +Eye of Stone: This eye shields the caster from a single petrification attack. It can also be used as the 3rd-level wizard spell Hold Person, rendering humanoids of man-size or smaller immobile for 1 round/level (Save vs. Spell negates).~ +@176=~Seven Eyes~ +@175=~Malavon's Rage +(Evocation) +Level: 7 +Range: 0 +Duration: Instant +Casting Time: 1 +Area of Effect: 7-ft. radius +Saving Throw: 1/2 +Malavon's Rage was created by the dark elf sorcerer Malavon. It shoots darts of pure energy out from the caster's body in all directions, harming friend and foe alike. The small wedges of magic do 20d4 points of piercing damage (save vs. Spell for half) to everything caught in their path. This spell is especially useful when a wizard is surrounded by enemies.~ +@174=~Malavon's Rage~ +@173=~Vorpal Hit~ +@172=~Death~ +@171=~Undead destroyed~ +@170=~Outer planar destroyed~ +@169=~Shades +(Illusion/Phantasm) +Level: 6 +Range: Visual range of the caster +Duration: 1 round/level +Casting Time: 6 +Area of Effect: Special +Saving Throw: None +Shades is similar to Shadow Monsters and Demi-Shadow Monsters-it allows the caster to shape material from the Demiplane of Shadow into illusionary creatures. These shadows are tougher than the shadows summoned by Shadow Monsters and Demi-Shadow Monsters, and they will obey the caster until the spell expires or they are slain.~ +@168=~Shades~ +@167=~Lich Touch~ +@166=~Lich Touch~ +@165=~Lich Touch +(Necromancy) +Level: 6 +Range: Touch +Duration: 1 round/level +Casting Time: 6 +Area of Effect: The caster +Saving Throw: Special +This spell confers the powers of a lich's touch and a lich's immunities upon the caster. The wizard gains immunity to paralysis and fear while the spell is in effect, and hands glow with an unearthly blue radiance that does 1d10 cold damage to a target and paralyzes them unless a Save vs. Paralysis is made. This spell has no effect on undead.~ +@164=~Lich Touch~ +@163=~Dispel Effects~ +@162=~Antimagic Shell +(Abjuration) +Level: 6 +Range: 0 +Duration: 1 turn/level +Casting Time: 1 +Area of Effect: The caster +Saving Throw: None +This spell surrounds the caster with an invisible barrier that moves with . This barrier makes the wizard immune to any magical attacks, but it prevents from casting spells. +Antimagic Shell also dispels deafness and feeblemindedness in the caster.~ +@161=~Antimagic Shell~ +@160=~Tough Lizard Man~ +@159=~Goblin Elite~ +@158=~Goblin Elite~ +@157=~Demi-Shadow Monsters +(Illusion/Phantasm) +Level: 5 +Range: Visual range of the caster +Duration: 1 round/level +Casting Time: 5 +Area of Effect: Special +Saving Throw: None +This spell is similar to the 4th-level wizard spell Shadow Monsters, except the summoned creatures are much more powerful.~ +@156=~Demi-Shadow Monsters~ +@155=~Troll Weapon~ +@154=~Troll~ +@153=~Troll~ +@152=~Shadow Monsters +(Illusion/Phantasm) +Level: 4 +Range: Visual range of the caster +Duration: 1 round/level +Casting Time: 4 +Area of Effect: Special +Saving Throw: None +This spell shapes material from the Demiplane of Shadow into illusionary monsters. Up to six shadowy creatures can be summoned at once, but their total Hit Dice will normally not exceed the spellcaster's level.~ +@151=~Shadow Monsters~ +@150=~Hasted~ +@149=~Slow~ +@148=~Slowed~ +@147=~Expeditious Retreat +(Alteration) +Level: 1 +Range: 0 +Duration: 3 rounds +Casting Time: 1 +Area of Effect: The caster +Saving Throw: None +This spell doubles the caster's normal speed for a short period of time... usually long enough to escape. Other movement-altering effects, such as Haste and Slow, cannot affect the caster while this spell is in effect. While Expeditious Retreat is active, the caster cannot attack, cast spells, or use any items or special abilities... can only run.~ +@146=~Expeditious Retreat~ +@145=~Mordenkainen's Sword~ +@144=~Mordenkainen's Sword~ +@143=~Mordenkainen's Sword +(Evocation) +Level: 7 +Range: Visual range of the caster +Duration: 1 round/level +Casting Time: 7 +Area of Effect: Special +Saving Throw: None +This spell summons a shimmering sword of force that can be mentally wielded by the caster. It strikes as if it were being used by a Fighter at half the level of the caster, and despite the fact it is held in the hand, it can hit creatures anywhere within the sight of the caster. Although the sword has no bonus to attack, it can hit creatures normally hit only by +2 weapons or lower and inflicts 5d6 points of slashing damage with every strike.~ +@142=~Mordenkainen's Sword~ +@141=~Water Elemental~ +@140=~Water Elemental~ +@139=~Conjure Water Elemental +(Conjuration/Summoning) +Level: 5 +Range: Visual range of the caster +Duration: 1 turn/level +Casting Time: 9 +Area of Effect: Special +Saving Throw: None +This spell allows the caster to summon an 8-HD elemental from the Elemental Plane of Water and bind it to will. This elemental will fight on behalf of the caster until the spell duration expires or the elemental is destroyed.~ +@138=~Conjure Water Elemental~ +@137=~Air Elemental~ +@136=~Air Elemental~ +@135=~Conjure Air Elemental +(Conjuration/Summoning) +Level: 5 +Range: Visual range of the caster +Duration: 1 turn/level +Casting Time: 9 +Area of Effect: Special +Saving Throw: None +This spell allows the caster to summon an 8-HD elemental from the Elemental Plane of Air and bind it to will. This elemental will fight on behalf of the caster until the spell duration expires or the elemental is destroyed.~ +@134=~Conjure Air Elemental~ +@133=~Fire Elemental~ +@132=~Fire Elemental~ +@131=~Conjure Fire Elemental +(Conjuration/Summoning) +Level: 5 +Range: Visual range of the caster +Duration: 1 turn/level +Casting Time: 9 +Area of Effect: Special +Saving Throw: None +This spell allows the caster to summon an 8-HD elemental from the Elemental Plane of Fire and bind it to will. This elemental will fight on behalf of the caster until the spell duration expires or the elemental is destroyed.~ +@130=~Conjure Fire Elemental~ +@129=~Earth Elemental~ +@128=~Earth Elemental~ +@127=~Conjure Earth Elemental +(Conjuration/Summoning) +Level: 5 +Range: Visual range of the caster +Duration: 1 turn/level +Casting Time: 9 +Area of Effect: Special +Saving Throw: None +This spell allows the caster to summon an 8-HD elemental from the Elemental Plane of Earth and bind it to will. This elemental will fight on behalf of the caster until the spell duration expires or the elemental is destroyed.~ +@126=~Conjure Earth Elemental~ +@125=~Monster Summoning III +(Conjuration/Summoning) +Level: 5 +Range: 20 ft. +Duration: 4 rounds + 1 round/level +Casting Time: 5 +Area of Effect: Special +Saving Throw: None +With the casting of this spell the wizard summons 1d4 3rd-level monsters. These appear within spell range and can be commanded to attack the caster's opponents until the spell duration expires or the monsters are slain.~ +@124=~Monster Summoning III~ +@123=~Lizard Man~ +@122=~Lizard Man~ +@121=~Monster Summoning II +(Conjuration/Summoning) +Level: 4 +Range: 20 ft. +Duration: 3 rounds + 1 round/level +Casting Time: 4 +Area of Effect: Special +Saving Throw: None +With the casting of this spell the wizard summons 1d6 2nd-level monsters. These appear within spell range and can be commanded to attack the caster's opponents until the spell duration expires or the monsters are slain.~ +@120=~Monster Summoning II~ +@119=~Goblin~ +@118=~Goblin~ +@117=~Monster Summoning I +(Conjuration/Summoning) +Level: 3 +Range: 20 ft. +Duration: 2 rounds + 1 round/level +Casting Time: 3 +Area of Effect: Special +Saving Throw: None +With the casting of this spell the wizard summons 2d3 1st-level monsters. These appear within spell range and can be commanded to attack the caster's opponents until the spell duration expires or the monsters are slain.~ +@116=~Monster Summoning I~ +@115=~Attack~ +@114=~Minotaur~ +@113=~Minotaur~ +@112=~Monster Summoning V +(Conjuration/Summoning) +Level: 7 +Range: 20 ft. +Duration: 6 rounds + 1 round/level +Casting Time: 7 +Area of Effect: Special +Saving Throw: None +With the casting of this spell the wizard summons 1d3 5th-level monsters. These appear within spell range and can be commanded to attack the caster's opponents until the spell duration expires or the monsters are slain.~ +@111=~Monster Summoning V~ +@110=~Salamander spear +1d8 piercing +1d6 fire damage +do not translate~ +@109=~Frost salamander spear +1d8 piercing ++1d6 cold +do not trans~ +@108=~Salamander~ +@107=~Salamander~ +@106=~Frost Salamander~ +@105=~Frost Salamander~ +@104=~Monster Summoning VI +(Conjuration/Summoning) +Level: 8 +Range: 20 ft. +Duration: 7 rounds + 1 round/level +Casting Time: 8 +Area of Effect: Special +Saving Throw: None +With the casting of this spell the wizard summons 1d3 6th-level monsters. These appear within spell range and can be commanded to attack the caster's opponents until the spell duration expires or the monsters are slain.~ +@103=~Monster Summoning VI~ +@102=~Attack~ +@101=~Umber Hulk~ +@100=~Umber Hulk~ +@99=~Boneguard Skeleton~ +@98=~Boneguard Skeleton~ +@97=~Monster Summoning VII +(Conjuration/Summoning) +Level: 9 +Range: 20 ft. +Duration: 8 rounds + 1 round/level +Casting Time: 9 +Area of Effect: Special +Saving Throw: None +With the casting of this spell, the wizard summons 1d2 7th- or 8th-level monsters. These appear within spell range and can be commanded to attack the caster's opponents until the spell duration expires or the monsters are slain.~ +@96=~Monster Summoning VII~ +@95=~Monster Summoning IV +(Conjuration/Summoning) +Level: 6 +Range: 20 ft. +Duration: 5 rounds + 1 round/level +Casting Time: 6 +Area of Effect: Special +Saving Throw: None +With the casting of this spell the wizard summons 1d3 4th-level monsters. These appear within spell range and can be commanded to attack the caster's opponents until the spell duration expires or the monsters are slain.~ +@94=~Monster Summoning IV~ +@93=~Skull~ +@92=~Monster Transparency +Do not translate~ +@91=~Monster Transparancy Item~ +@90=~Shadow~ +@89=~Shadow~ +@88=~Summon Shadow +(Conjuration/Summoning, Necromancy) +Level: 5 +Range: Visual range of the caster +Duration: 1 round + 1 round/level +Casting Time: 5 +Area of Effect: Special +Saving Throw: None +This spell summons three 4-HD shadows. The shadows will obey the orders of the caster, attacking enemies or performing tasks until the spell expires or the shadows are slain.~ +@87=~Summon Shadow~ +@86=~Iron Fist~ +@85=~Iron Fist~ +@84=~Stricken by a foul disease~ +@83=~Diseased~ +@82=~Poisoned~ +@81=~Poison~ +@80=~Iron Body +(Alteration) +Level: 8 +Range: 0 +Duration: 2 turns +Casting Time: 8 +Area of Effect: The caster +Saving Throw: None +This spell transforms the caster's body into living iron, granting several powerful resistances and abilities. While the spell is in effect, the caster is 100% resistant to electricity and poison, 50% resistant to fire, and 25% resistant to crushing damage. Spells that affect respiration or the physiology of the caster are ignored. In addition, the caster's Strength is raised to 25, and the caster can attack twice per round with iron fists for 2d4 points of damage plus appropriate Strength bonuses. +Unfortunately, the caster's movement becomes slow and awkward, setting movement rate to 25% of normal, and cannot cast spells while Iron Body is in effect.~ +@79=~Iron Body~ +@78=~Unconscious~ +@77=~Great Shout +(Invocation) +Level: 8 +Range: 0 +Duration: Instant +Casting Time: 1 +Area of Effect: 17-ft. cone with 15-deg. arc +Saving Throw: 1/2 +Upon uttering the Great Shout, the caster releases a stunning force from mouth in a 17-ft. cone. The Great Shout is extremely taxing and dangerous to the user. The shout drains 2d4 Hit Points from the caster, and must make a Save vs. Spell or fall unconscious for 1 turn. Creatures 5 Hit Dice and under caught within the Great Shout instantly die. All other creatures within the area of effect must save vs. Spell. Those who fail the save are stunned for 2 rounds, deafened for 4 rounds, and suffer 4d12 points of magic damage. Those who make the save are stunned for 1 round, deafened for 2 rounds, and suffer 2d12 points of magic damage.~ +@76=~Great Shout~ +@75=~Charmed~ +@74=~Dire Charmed~ +@73=~Dominated~ +@72=~Morale Failure: Panic~ +@71=~Intoxicated~ +@70=~Confused~ +@69=~Rigid Thinking~ +@68=~Held~ +@67=~Paralyzed~ +@66=~Held~ +@65=~Mind Blank +(Abjuration) +Level: 8 +Range: 0 +Duration: 24 hours +Casting Time: 1 +Area of Effect: The caster +Saving Throw: None +In the interests of one's self-control and privacy, Mind Blank shields a creature's mind from almost any mental effect-charm, maze, feeblemind, confusion, fear, intoxication, berserk, hold, and petrification.~ +@64=~Mind Blank~ +@63=~Suffocate +(Alteration) +Level: 7 +Range: Visual range of the caster +Duration: 4 rounds +Casting Time: 7 +Area of Effect: 7-ft. radius +Saving Throw: Special +This spell draws the breath out of all creatures within the area of effect. Creatures that do not breathe are unaffected. Suffocating creatures suffer -4 to Armor Class, -4 to hit, -6 to Dexterity, one less attack per round, half movement rate, and take 4d8 points of magic damage per round. A successful Saving Throw negates all effects but 2d8 points of damage for one round. The effects begin to fade when the creature moves out of the area of effect, although it can take a round for a character to catch their second wind.~ +@62=~Suffocate~ +@61=~Acid Storm +(Evocation) +Level: 7 +Range: Visual range of the caster +Duration: 1 round/level +Casting Time: 7 +Area of Effect: 12-ft. radius +Saving Throw: 1/2 +This spell unleashes an acidic downpour on the area of effect, doing 1d4 points of acid damage each round for the first three rounds, 1d6 points for the next three rounds, and 1d8 points for each round thereafter. Moving out of the area of effect does not stop the damage-the acid adheres to the skin, and any creatures in the area of effect when Acid Storm is cast continue to suffer acid damage as long as the spell duration lasts. Creatures make a Save vs. Spell every round after they have been hit by the cloud-if successful, they only take half damage (for that round only).~ +@60=~Acid Storm~ +@59=~Trollish Fortitude +(Necromancy) +Level: 6 +Range: 0 +Duration: 2 turns +Casting Time: 6 +Area of Effect: The caster +Saving Throw: None +This spell imbues the caster with the resilience of a troll, allowing the caster to regenerate 5 Hit Points per round up to maximum Hit Points.~ +@58=~Trollish Fortitude~ +@57=~Skeleton~ +@56=~Skeleton~ +@55=~Soul Eater +(Necromancy) +Level: 6 +Range: Visual range of the caster +Duration: Instant +Casting Time: 5 +Area of Effect: 7-ft. radius +Saving Throw: None +This spell deals 3d8 magic damage to all living creatures within a 14-ft. radius. Any creatures that die as a result of this damage are obliterated, and their essence is transformed into a 3-Hit-Dice skeleton under control of the caster. Also, for each creature that dies in this manner, the caster receives a +1 bonus to Strength, Dexterity, and Constitution for 1 turn. Soul Eater has no effect on undead, constructs, and elemental creatures.~ +@54=~Soul Eater~ +@53=~Dart of Bone +3~ +@52=~Dart of Bone~ +@51=~Darts of Bone +(Necromancy) +Level: 6 +Range: 0 +Duration: 5 rounds +Casting Time: 5 +Area of Effect: The caster +Saving Throw: None +This spell creates nine darts that can be used by the caster and cannot be unequipped so long as the spell is in effect. The darts are +3, do 1d4+3 missile damage, and a creature struck by a dart must save vs. Death or take 2d6 magic damage and have its Strength reduced by 3 for 5 rounds. Strength reduction is noncumulative, and failing a save while the reduction is in effect will not extend its duration. The caster's weapon proficiency with darts (or lack thereof) has no effect on the darts' chances to hit a target.~ +@50=~Darts of Bone~ +@49=~Otiluke's Freezing Sphere +(Alteration, Evocation) +Level: 6 +Range: Visual range of the caster +Duration: Instant +Casting Time: 6 +Area of Effect: 1 creature +Saving Throw: Neg. +This spell fires an orb of cold at a creature that inflicts 1d4+2 points of cold damage per level of the caster. If the target makes its Save vs. Spell, however, they have dodged the orb and avoided all damage.~ +@48=~Otiluke's Freezing Sphere~ +@47=~Shroud of Flame +(Invocation) +Level: 5 +Range: Visual range of the caster +Duration: 1 round/2 levels (special) +Casting Time: 5 +Area of Effect: 5-ft. radius +Saving Throw: Neg. +This spell causes a creature to burst into flames if it fails a Save vs. Spell. The creature will burn for 2d6 points of fire damage every round, and gouts of flame erupt from the burning target, causing any creatures within 5 ft. to take 1d4 points of fire damage from the flames. Anyone hit by the victim's flames must also make a Save vs. Spell to avoid contracting the shroud themselves. The shroud of flame dissipates if the caster and target are no longer in the same area. This spell is particularly useful in dispersing packs of trolls and frost salamanders.~ +@46=~Shroud of Flame~ +@45=~Vitriolic Sphere +(Conjuration) +Level: 4 +Range: Visual range of the caster +Duration: Special +Casting Time: 4 +Area of Effect: 5-ft. radius +Saving Throw: Special +This spell conjures a sphere of glowing emerald acid that the caster can direct to strike any target within range. When it reaches its target, the sphere explodes and drenches the victim in potent acid. The victim suffers 1d4 points of acid damage per caster level, to a maximum of 12d4 points of damage. After the initial damage, the victim must save vs. Spell to avoid more damage. If unsuccessful, the victim continues to suffer acid damage in the following rounds, sustaining two less dice of damage each round. For example, an 8th-level wizard inflicts 8d4 damage with this spell on the first round, 6d4 on the second round, 4d4 on the third round, 2d4 on the fourth round, and the spell ends on the fifth round. Each round after the first, the victim is entitled to a Save vs. Spell to avoid further damage. +The vitriolic sphere also splashes acid in a 5-ft. radius around the primary target. Any creatures within the splash radius must save vs. Petrification/Polymorph or suffer a splash hit that inflicts 1d4 points of damage per every five levels of the caster. Splash hits do not cause continuing damage.~ +@44=~Vitriolic Sphere~ +@43=~Deafness~ +@42=~Shout +(Invocation) +Level: 4 +Range: 0 +Duration: Instant +Casting Time: 1 +Area of Effect: 17-ft. cone with 15-deg. arc +Saving Throw: Special +Shout grants the wizard tremendous vocal powers, allowing to emit an earsplitting roar from mouth in a cone-shaped area of effect. Any creature within this area is deafened for 9 rounds and suffers 4d6 points of magic damage. A successful Save vs. Spell negates the deafness and reduces the damage by half.~ +@41=~Shout~ +@40=~Mordenkainen's Force Missiles +(Invocation) +Level: 4 +Range: Visual range of the caster +Duration: Instant +Casting Time: 4 +Area of Effect: 2-ft. radius +Saving Throw: Special +This spell creates a brilliant globe of magical energy that streaks forth from the caster's hand to unerringly strike its target, much like a Magic Missile spell. The wizard creates one missile at 7th level and an additional missile at every third level after 7th-in other words, two missiles at 10th level, three at 13th, four at 16th, and so on, to a maximum of seven missiles at 25th level. Each missile inflicts 2d4 points of damage to the target and then bursts in a 2-ft. radius concussive blast that inflicts 1 point of damage per level of the caster-for example, a 12th-level wizard could conjure two force missiles, each of which strikes for 2d4+12 points of magic damage. Creatures taking damage can attempt a Save vs. Spell to negate the concussion damage, but the impact of the missile itself allows no Saving Throw. The 1st-level wizard spell Shield will absorb the force missiles harmlessly, including the concussion damage.~ +@39=~Mordenkainen's Force Missiles~ +@38=~Hopelessness~ +@37=~Stunned~ +@36=~Emotion, Hopelessness +(Enchantment/Charm) +Level: 4 +Range: Visual range of the caster +Duration: 1 turn +Casting Time: 4 +Area of Effect: 7-ft. radius +Saving Throw: Neg. +This spell creates the emotion of hopelessness within the area of effect. All enemies who fail to save vs. Spell just stand and do nothing for 1 turn. This spell nullifies Emotion, Hope within the area of effect at the time of casting.~ +@35=~Emotion, Hopelessness~ +@34=~Panic~ +@33=~Emotion, Fear +(Enchantment/Charm) +Level: 4 +Range: Visual range of the caster +Duration: 5 rounds +Casting Time: 4 +Area of Effect: 7-ft. radius +Saving Throw: Neg. +This spell creates the emotion of fear within the area of effect. All enemies who fail to save vs. Spell flee for 5 rounds. This spell nullifies Emotion, Courage within the area of effect at the time of casting.~ +@32=~Emotion, Fear~ +@31=~Emotion, Hope +(Enchantment/Charm) +Level: 4 +Range: Visual range of the caster +Duration: 1 hour +Casting Time: 4 +Area of Effect: 7-ft. radius +Saving Throw: None +This spell creates the emotion of hope within the area of effect. All creatures affected by the spell gain a morale boost and +2 on their Saving Throws, attack rolls, and damage rolls. This spell nullifies all hopelessness effects within the area of effect at the time of casting.~ +@30=~Emotion, Hope~ +@29=~Emotion, Courage +(Enchantment/Charm) +Level: 4 +Range: Visual range of the caster +Duration: 1 hour +Casting Time: 4 +Area of Effect: 7-ft. radius +Saving Throw: None +This spell creates the emotion of courage within the area of effect. All creatures affected by the spell gain +1 to hit, +3 to their damage rolls, and +5 temporary Hit Points (which can put them above their maximum Hit Points). This spell nullifies all fear effects within the area of effect at the time of casting.~ +@28=~Emotion, Courage~ +@27=~Berserk~ +@26=~Beltyn's Burning Blood +(Necromancy) +Level: 4 +Range: Visual range of the caster +Duration: 1 round/2 levels +Casting Time: 4 +Area of Effect: 1 creature +Saving Throw: Neg. +This spell turns a target's blood to flame, doing 3d4 Hit Points of damage every round and driving the victim berserk with pain. The target gets to save vs. Spell every round; if successful, the damage and berserk state are negated. This spell does not work against undead or extraplanar creatures that do not have blood (such as elementals). If the creature is resistant to fire, this resistance will lower or nullify the damage from this spell.~ +@25=~Beltyn's Burning Blood~ +@24=~Lance of Disruption +(Invocation) +Level: 3 +Range: 100 ft. +Duration: Instant +Casting Time: 3 +Area of Effect: Special +Saving Throw: 1/2 +This spell shoots a lance of force, which travels from the caster to a specified point 100 ft. in the distance. Any creatures in the lance's path take 5d4 points of crushing damage plus 2 points of damage per level of the caster (maximum of +30). Victims can save vs. Spell for half damage.~ +@23=~Lance of Disruption~ +@22=~Stunned~ +@21=~Icelance +(Evocation) +Level: 3 +Range: Visual range of the caster +Duration: Instant +Casting Time: 3 +Area of Effect: 1 creature +Saving Throw: Special +This spell fires a magical lance of ice at a target of the caster's choosing. It automatically hits, inflicting 5d6 points of cold damage and forcing the target to make a Save vs. Spell or be stunned for 3 rounds.~ +@20=~Icelance~ +@19=~Dexterity Modification~ +@18=~Cat's Grace +(Alteration) +Level: 2 +Range: Touch +Duration: 1 hour/level +Casting Time: 2 +Area of Effect: 1 creature +Saving Throw: None +This spell magically increases a target's Dexterity. The amount depends on the target's class: Rogues gain 1d8 points, warriors and wizards gain 1d6 points, and priests gain 1d4 points. If a character has more than one class, the larger die is used. Cat's Grace cannot raise a target's Dexterity past 20.~ +@17=~Cat's Grace~ +@16=~Decastave~ +@15=~Decastave~ +@14=~Decastave +(Evocation) +Level: 2 +Range: 0 +Duration: 3 rounds + 1 round/level +Casting Time: 2 +Area of Effect: The caster +Saving Throw: None +This spell creates a staff of force in the caster's hand. It is treated as a magical weapon, doing 1d6 Hit Points of damage per hit, and it can hit creatures that require +1 weapons to hit. It is a staff, however, so if the caster does not have a proficiency in staff weapons, then the Decastave is used at a penalty. The staff also has the power to drain a target of 1d2 Hit Points on every strike. These Hit Points are added to the caster's, but they can only heal damage the caster has taken; they will not raise Hit Points beyond normal maximum.~ +@13=~Decastave~ +@12=~~ +@11=~Snilloc's Snowball Swarm +(Evocation) +Level: 2 +Range: Visual range of the caster +Duration: Instant +Casting Time: 2 +Area of Effect: 15-ft. radius +Saving Throw: 1/2 +This spell causes a flurry of snowballs to erupt from a point within range. These snowballs will hit everything within the area of effect, doing 1d3 points of cold damage per level, up to a maximum of 8d3 points at level 8. Against fire-using or fire-dwelling creatures, it inflicts 1d6 points of cold damage per level, up to a maximum of 8d6 points at level 8.~ +@10=~~ +@9=~Snilloc's Snowball Swarm~ +@8=~Eye of the Mind blocks effect and dissipates.~ +@7=~Eye of the Sword blocks effect and dissipates.~ +@6=~Eye of the Mage blocks effect and dissipates.~ +@5=~Eye of Venom blocks effect and dissipates.~ +@4=~Eye of the Spirit blocks effect and dissipates.~ +@3=~Eye of Fortitude blocks effect and dissipates.~ +@2=~Eye of Stone blocks effect and dissipates.~ +@1=~This spell heals the character by 11 Hit Points.~ diff --git a/iwdification/dw_iwdspells_resource/tra/es_es/iwdspells.tra b/iwdification/dw_iwdspells_resource/tra/es_es/iwdspells.tra new file mode 100644 index 0000000..01a954d --- /dev/null +++ b/iwdification/dw_iwdspells_resource/tra/es_es/iwdspells.tra @@ -0,0 +1,1320 @@ +%atsymbol%359=~Coraje~ +%atsymbol%358=~Esperanza~ +%atsymbol%357=~Gracia felina~ +%atsymbol%356=~Ira honesta de los fieles~ +%atsymbol%355=~Rezo~ +%atsymbol%354=~Rabia sangrienta~ +%atsymbol%353=~Recitación~ +%atsymbol%352=~Exaltación~ +%atsymbol%351=~Rabia animal~ +%atsymbol%350=~Cuerpo de hierro~ +%atsymbol%349=~Petrificado~ +%atsymbol%348=~Impenetrable santidad de la mente~ +%atsymbol%347=~Dolor~ +%atsymbol%346=~Cambio de fase~ +%atsymbol%345=~Ayuda~ +%atsymbol%344=~Mente en blanco~ +%atsymbol%343=~Transformación en elemental de tierra~ +%atsymbol%342=~Transformación en elemental de fuego~ +%atsymbol%341=~Cántico de guerra de Sith: Bonificaciones a la armadura y regeneración~ +%atsymbol%340=~"Canto de guerra de Sith" +Todos los aliados en un radio de 9m ganan +2 a la Clase de Armadura, +10% resistencia al daño cortante, punzante, aplastante y de misil; y la habilidad de regenerar 2 puntos de daño por asalto.~ +%atsymbol%339=~Cántico de Guerra de Sith~ +%atsymbol%338=~Cautivado~ +%atsymbol%337=~El anhelo de la sirena: Cautiva a las criaturas~ +%atsymbol%336=~"El anhelo de la sirena" +Todos los enemigos en un radio de 9m deven salvar contra Hechizos o ser Cautivados e incapaces de tomar acción hasta que pase un asalto o sean dañados.~ +%atsymbol%335=~El Anhelo de la Sirena~ +%atsymbol%334=~La canción de Kaudies: Resistencia a los ataques sonoros~ +%atsymbol%333=~"La canción de Kaudies" +Todos los aliados en un radio de 9m ganan la posibilidad de curar los efectos de Silencio, Alarido, Gran Alarido, Orden Imperiosa o cualquier otro ataque de sonido. ~ +%atsymbol%332=~La Canción de Kaudies~ +%atsymbol%331=~Melodía de Tymora: Suerte y bonificaciones de habilidad~ +%atsymbol%330=~"La melodía de Tymora" +Todos los aliados en un radio de 9m ganan +1 a la suerte, +3 a las tiradas de salvación, +10 al conocimiento y +10% a sus habilidades de ladrón.~ +%atsymbol%329=~Melodía de Tymora~ +%atsymbol%328=~El relato de Curran Fortecorazón: Inmunidad al miedo~ +%atsymbol%327=~"El cuento de Curran Fortecor" +Todos los aliados en un radio de 9m ganan inmunidad al miedo y todos los efectos del miedo actualmente sobre ellos son curados.~ +%atsymbol%326=~El Relato de Curran Fortecorazón~ +%atsymbol%325=~La balada de los tres héroes: Bonificaciones al combate~ +%atsymbol%324=~"La balada de los tres héroes" +Todos los aliados en un radio de 9m ganan +1 al golpe, +1 al daño y +1 a todas las tiradas de salvación.~ +%atsymbol%323=~La balada de los tres héroes~ +%atsymbol%322=~Expulsa vapor ácido~ +%atsymbol%321=~Marchitando~ +%atsymbol%320=~Marchitar +(Nigromancia) +Nivel: 7 +Alcance: Toque +Duración: Instantáneo +Tiempo de lanzamiento: 1 turno por cada 2 niveles +Ãrea de efecto: 1 criatura +Tirada de salvación: Neg. +DESCRIPCIÓN: +Este conjuro marchita los órganos de la criatura tocada. Las víctimas tienen derecho a realizar una tirada de salvación contra la muerte con penalización -4. La criatura afectada perderá 3 puntos de golpe por segundo. El efecto dura un turno por cada 2 niveles del lanzador o hasta ser disipado. Este efecto no hará daño a los no-muertos, construcciones o criaturas extra planares. No puede ser lanzado por personajes buenos.~ +%atsymbol%319=~Marchitar~ +%atsymbol%318=~Salmo +(Conjuración/Convocación) +Nivel: 2 +Esfera: Combate +Alcance: Rango visual del lanzador +Duración: 1 asalto +Tiempo de lanzamiento: 1 asalto +Ãrea de efecto: Radio de 9 metros +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Mediante el conjuro Salmo, al sacerdote y a su grupo se les otorga un favor especial, y también daña a sus enemigos. Al terminar de vocalizar el conjuro Salmo, todos los aliados del sacerdote en el área de efecto obtienen una bonificación +1 al ataque y a las tiradas de salvación, mientras que los enemigos del sacerdote sufren una penalización -1 a sus ataques y a sus tiradas de salvación. Si se lanzan varios Salmos no se acumulan. Este conjuro necesita cierta concentración por parte del lanzador, así que el sacerdote no puede lanzar ningún conjuro mientras dura el conjuro Salmo y su tasa de movimiento se reduce a la mitad.~ +%atsymbol%317=~Salmo~ +%atsymbol%316=~Fart Repellent for Bombardier Beetles. +Do not translate~ +%atsymbol%315=~Escarabajo tedioso~ +%atsymbol%314=~Escarabajo tedioso~ +%atsymbol%313=~Escarabajo bombardero~ +%atsymbol%312=~Escarabajo bombardero~ +%atsymbol%311=~Insecto gigante +(Alteración) +Nivel: 4 +Esfera: Animal +Alcance: Rango visual del lanzador +Duración: 8 horas +Tiempo de lanzamiento: 7 asaltos +Ãrea de efecto: 1-6 insectos +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro convoca unos insectos pequeños para el hechicero, después los agranda a tamaño gigante, lo cual hace que se conviertan en unos aliados temibles. La fuerza y el tipo de insectos varía según el nivel del lanzador; cuanto más alto sea el nivel del lanzador, más fuertes serán los insectos que se convocan.~ +%atsymbol%310=~Insecto gigante~ +%atsymbol%309=~Causar heridas críticas +(Nigromancia) +Nivel: 5 +Esfera: Curación +Alcance: Toque +Duración: Permanente +Tiempo de lanzamiento: 8 asaltos +Ãrea de efecto: 1 criatura +Tirada de salvación: Mitad +DESCRIPCIÓN: +Cuando se lanza este conjuro y se toca a la criatura, el sacerdote propina 27 puntos de daño (la tirada de salvación hace la mitad del daño) al cuerpo de la criatura. Este conjuro no afecta a los muertos vivientes, constructos, o criaturas extraplanares. El conjuro Causar heridas críticas solo lo pueden lanzar personajes de alineamiento maligno.~ +%atsymbol%308=~Causar heridas críticas~ +%atsymbol%307=~Causar heridas graves +(Nigromancia) +Nivel: 4 +Esfera: Curación +Alcance: Toque +Duración: Permanente +Tiempo de lanzamiento: 5 asaltos +Ãrea de efecto: 1 criatura +Tirada de salvación: Mitad +DESCRIPCIÓN: +Cuando se lanza este conjuro y se toca a la criatura, el sacerdote propina 17 puntos de daño (la tirada de salvación hace la mitad del daño) al cuerpo de la criatura. Este conjuro no afecta a los muertos vivientes, constructos, o criaturas extraplanares. El conjuro Causar heridas graves no puede ser lanzado por personajes de alineamiento bueno.~ +%atsymbol%306=~Causar heridas graves~ +%atsymbol%305=~Dos niveles consumidos~ +%atsymbol%304=~Consumir energía (Nigromancia) +Nivel: 7 +Alcance: Toque +Duración: Permanente +Tiempo de lanzamiento: 3 +Ãrea de efecto: Criatura objetivo +Tirada de salvación: Ninguna +DESCRIPCIÓN: +La ejecución de este conjuro abre un canal entre el plano del lanzador y el plano de energía negativa. El mago hará las veces de vínculo entre ambos planos, extrayendo la fuerza vital de una víctima (haciendo que pierda 2 niveles de experiencia) y enviándola al plano de energía negativa. La víctima de este conjuro perderá los niveles de forma permanente y, por tanto, también perderá dados de golpe, puntos de golpe y aptitudes. Los niveles perdidos solo pueden recuperarse gracias al conjuro de sacerdote llamado Restablecimiento.~ +%atsymbol%303=~Consumir energía~ +%atsymbol%302=~Enredado~ +%atsymbol%301=~Masa bamboleante~ +%atsymbol%300=~Masa bamboleante~ +%atsymbol%299=~Acechador +(Conjuración) +Nivel: 7 +Esfera: Vegetal +Alcance: Rango visual del lanzador +Duración: 8 horas +Tiempo de lanzamiento: 1 asalto +Ãrea de efecto: Especial +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro crea dos montículos que se arrastran por el suelo. Estas criaturas estarán dispuestas a ayudar en combate al lanzador, o a cualquier otra tarea que se les asigne y sean capaces de cumplir.~ +%atsymbol%298=~Acechador~ +%atsymbol%297=~Niebla de Eldath +(Invocación) +Nivel: 7 +Esfera: Elemental +Alcance: Rango visual del lanzador +Duración: 1 asalto +Tiempo de lanzamiento: 1 asalto +Ãrea de efecto: Radio de 3 metros +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro cubre el área de efecto con una niebla azul-plateada. Cualquier criatura que se encuentre dentro de la niebla se le curarán la enfermedad y el veneno, y se le reestablecerán 25 puntos de golpe.~ +%atsymbol%296=~Niebla de Eldath~ +%atsymbol%295=~Escudo mayor de Lazhánder +(Conjuración) +Nivel: 7 +Esfera: Guardián +Alcance: Toque +Duración: 3 asaltos +Tiempo de lanzamiento: 1 asalto +Ãrea de efecto: 1 criatura +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro otorga al objetivo una resistencia a la magia del 100% e inmunidad al daño mientras dure el conjuro. Las criaturas malignas no pueden recibir la protección del conjuro Escudo mayor de Lazhánder. Este conjuro solo lo pueden lanzar personajes de alineamiento bueno.~ +%atsymbol%294=~Escudo mayor de Lazhánder~ +%atsymbol%293=~Destrucción +(Nigromancia) +Nivel: 7 +Esfera: Curación +Alcance: Toque +Duración: Instantáneo +Tiempo de lanzamiento: 1 asalto +Ãrea de efecto: El lanzador +Tirada de salvación: Especial +DESCRIPCIÓN: +Este conjuro destruye al instante a un objetivo, de forma que explota en mil pedazos. A la víctima se le permite una tirada de salvación contra muerte con un penalizador -4; si tiene éxito, el objetivo recibe 8D6 puntos de daño en vez de ser destruido. El conjuro Destrucción solo lo pueden lanzar personajes de alineamiento maligno. Cabe mencionar que un personaje muerto con el conjuro Destrucción no puede volver a la vida con los conjuros Revivir a los muertos o Resurrección.~ +%atsymbol%292=~Destrucción~ +%atsymbol%291=~Conjuro ineficaz~ +%atsymbol%290=~Impenetrable santidad de la mente +(Abjuración) +Nivel: 7 +Esfera: Protección +Alcance: El lanzador +Duración: 1 asalto por nivel +Tiempo de lanzamiento: 1 asalto +Ãrea de efecto: El lanzador +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro endurece la mente del lanzador contra cualquier influencia externa. Los conjuros de Hechizo, Orden imperiosa, Confusión, Dominación, Capa de miedo, Debilidad mental, Inmovilizar persona, Sueño y cualquier ataque psiónico dirigido al lanzador fallarán mientras este conjuro sea efectivo.~ +%atsymbol%289=~Impenetrable santidad de la mente~ +%atsymbol%288=~Símbolo de la desesperación +(Conjuración/Convocación) +Nivel: 7 +Esfera: Guardián +Alcance: Rango visual del lanzador +Duración: 2 asaltos +Tiempo de lanzamiento: 3 asaltos +Ãrea de efecto: Radio de 18 metros +Tirada de salvación: Negación +DESCRIPCIÓN: +Cuando se invoca, todas las criaturas dentro de un radio de 18 metros del Símbolo de la desesperación deben hacer una tirada de salvación contra conjuros con un penalizador -2. Si se falla, se quedarán quietas en su sitio, sobrecogidas por el abatimiento y la resignación. No harán ningún movimiento para defenderse de los ataques.~ +%atsymbol%287=~Símbolo de la desesperación~ +%atsymbol%286=~Dolores devastadores~ +%atsymbol%285=~Símbolo del dolor +(Conjuración/Convocación) +Nivel: 7 +Esfera: Guardián +Alcance: Rango visual del lanzador +Duración: 2-20 asaltos +Tiempo de lanzamiento: 3 asaltos +Ãrea de efecto: Radio de 18 metros +Tirada de salvación: Negación +DESCRIPCIÓN: +Cuando se invoca, todas las criaturas dentro de un radio de 18 metros del Símbolo del dolor deben hacer una tirada de salvación contra conjuros. Si se falla, se sobrecogen de dolor, sufriendo varias penalizaciones, -4 a sus tiradas de ataque, -2 a la destreza y -2 a su clase de armadura.~ +%atsymbol%284=~Símbolo del dolor~ +%atsymbol%283=~Ira espiritual +(Invocación) +Nivel: 6 +Esfera: Combate +Alcance: Rango visual del lanzador +Duración: Instantáneo +Tiempo de lanzamiento: 2 asaltos +Ãrea de efecto: Especial +Tirada de salvación: Mitad +DESCRIPCIÓN: +Tras acabar de lanzar este conjuro, el sacerdote se convierte en un foco de energía espiritual, el cual sale disparado de lanzador en cuatro direcciones, como si fueran rayos relampagueantes. El lanzador indica la dirección de uno de los rayos y los otros se disparan de forma opuesta y perpendicular a esa dirección, en forma de una cruz. Todas las criaturas que se encuentran en la trayectoria de los rayos, reciben 6-42 puntos de daño mágico, y si tienen éxito en la tirada de salvación, solo reciben la mitad del daño. A las criaturas de un mismo alineamiento (bueno, neutral o maligno) que el lanzador no les afecta el conjuro.~ +%atsymbol%282=~Ira espiritual~ +%atsymbol%281=~Torbellino +(Invocación) +Nivel: 6 +Esfera: Invocación +Alcance: Rango visual del lanzador +Duración: Especial +Tiempo de lanzamiento: 9 asaltos +Ãrea de efecto: Especial +Tirada de salvación: Especial +DESCRIPCIÓN: +Este conjuro crea un pequeño torbellino cerca de lanzador, el cual puede direccionar hacia una localización dentro de su rango visual. +Una vez el torbellino alcanza su destino, el lanzador pierde el control y el torbellino volará al azar por los alrededores, dañando por igual a amigos y a enemigos. +El lanzador es inmune a su propio conjuro, y a los elementales y a otras criaturas enormes tampoco les afecta. Si una criatura se cruza en el camino del torbellino, recibe 2D8 puntos de daño contundente y debe hacer una tirada de salvación contra aliento o quedará aturdida durante 2 asaltos. +Las criaturas con 2 dados de golpe o menos mueren automáticamente por el conjuro. Puede afectar a un máximo de 8 objetivos, tras los cuales el torbellino se disipa.~ +%atsymbol%280=~Torbellino~ +%atsymbol%279=~Escudo de entropía +(Abjuración) +Nivel: 6 +Esfera: Protección +Alcance: El lanzador +Duración: 1 asalto por nivel +Tiempo de lanzamiento: 9 asaltos +Ãrea de efecto: El lanzador +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Cuando se lanza, este conjuro rodea al lanzador con una vorágine defensiva de energía que bloquea o desvía muchos ataques. Esto le da al sacerdote un bonificador a la clase de armadura de +6 y una resistencia del 50% a la mayoría de los tipos de ataque: electricidad, fuego, frío y demás. También otorga al lanzador un bonificador +2 a todas sus tiradas de salvación e inmunidad a todos los ataques basados en proyectiles.~ +%atsymbol%278=~Escudo de entropía~ +%atsymbol%277=~Causar heridas leves en masa +(Nigromancia) +Nivel: 5 +Esfera: Curación +Alcance: 0 +Duración: Permanente +Tiempo de lanzamiento: 5 asaltos +Ãrea de efecto: 9 metros +Tirada de salvación: Mitad +DESCRIPCIÓN: +Gracias a este conjuro, el sacerdote causa 1d8 +1 puntos de herida a los enemigos cercanos a menos que salven contra conjuros. Esta curación poco tiene que ver con las criaturas que carecen de entidad corpórea, así como tampoco puede sanar las heridas de criaturas no vivientes o que sean originarias de otro plano.~ +%atsymbol%276=~Causar heridas leves en masa~ +%atsymbol%275=~Rabia animal +(Encantamiento) +Nivel: 5 +Esfera: Combate +Alcance: Toque +Duración: 15 asaltos +Tiempo de lanzamiento: 8 asaltos +Ãrea de efecto: 1 criatura +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro infunde a la criatura objetivo con una ferocidad animal. La criatura objetivo obtiene una Fuerza de 19, +20 puntos de golpe, +20% a la tasa de movimiento y una bonificación +2 a todas las tiradas de salvación. El objetivo pierde la habilidad de lanzar conjuros mientras sea efectiva la Rabia animal. Al personaje se le puede controlar normalmente hasta que haya enemigos en su rango visual, en cuyo caso el objetivo atacará de inmediato en combate cuerpo a cuerpo, usando cualquier cosa que tenga a mano. Hay un 5% de probabilidad en cada asalto de que el objetivo se vuelva Furioso, y ataque tanto a enemigos como amigos.~ +%atsymbol%274=~Rabia animal~ +%atsymbol%273=~Guarda contra los muertos vivientes +(Nigromancia) +Nivel: 5 +Esfera: Custodias +Alcance: El lanzador +Duración: 1 asalto +Tiempo de lanzamiento: 7 asaltos +Ãrea de efecto: Radio de 6 metros +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro amplifica la influencia que el sacerdote tiene sobre los muertos vivientes, aunque el efecto estará sujeto al área que rodea al lanzador y no se desplaza con él. Cualquier criatura muerto viviente que entra en el área resultará afectada igual que si hubiera sido rechazada por el sacerdote. Si el primer rechazo resultara fallido, la criatura muerto viviente es inmune a cualquier intento posterior de rechazarla con el conjuro a menos que deje y vuelva a entrar en el área de efecto.~ +%atsymbol%272=~Guarda contra los muertos vivientes~ +%atsymbol%271=~Escudo de Lazhánder +(Conjuración) +Nivel: 5 +Esfera: Guardián +Alcance: Toque +Duración: 2 asaltos +Tiempo de lanzamiento: 8 asaltos +Ãrea de efecto: 1 criatura +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro otorga al objetivo inmunidad al daño mientras dure el conjuro. Las criaturas malignas no pueden recibir la protección del conjuro Escudo de Lazhánder. Solo pueden lanzar el conjuro Escudo de Lazhánder personajes no malignos.~ +%atsymbol%270=~Escudo de Lazhánder~ +%atsymbol%269=~Piedras puntiagudas +(Alteración, Encantamiento) +Nivel: 5 +Esfera: Elemental (tierra) +Alcance: Rango visual del lanzador +Duración: 12 asaltos +Tiempo de lanzamiento: 6 asaltos +Ãrea de efecto: Radio de 3 metros +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro manipula las rocas de alrededor, reformando el terreno en forma de salientes puntiagudos que se combinan con el entorno. Cualquier criatura que entra en el área recibe 2D4 puntos de daño perforante por asalto y debe hacer una tirada de salvación contra conjuros o su tasa de movimiento se verá reducida en un 30%.~ +%atsymbol%268=~Piedras puntiagudas~ +%atsymbol%267=~Ira honesta de los fieles +(Encantamiento/Hechizo) +Nivel: 5 +Esfera: Combate +Alcance: El lanzador +Duración: 1 asalto por nivel +Tiempo de lanzamiento: 8 asaltos +Ãrea de efecto: Radio de 9 metros +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro concede una especie de locura divina sobre los aliados del sacerdote, mejorando sus habilidades de combate. Todos los aliados del sacerdote dentro del área de efecto ganan +1 a las tiradas de ataque y a las tiradas de salvación, además de una bonificación de 1-8 a los puntos de golpe mientras dure el conjuro (estos puntos de golpe pueden sumarse a los puntos de golpe máximos del objetivo). Sin embargo, todas las criaturas del mismo alineamiento ganan un ataque adicional en cada asalto y +2 a las tiradas de ataque, daño y tiradas de salvación. A cualquiera que le afecte la Ira honesta de los fieles sufrirá de fatiga cuando el conjuro termine.~ +%atsymbol%266=~Ira honesta de los fieles~ +%atsymbol%265=~Muro de luz de luna +(Invocación) +Nivel: 4 +Esfera: Protección, Sol +Alcance: Rango visual del lanzador +Duración: 1 asalto +Tiempo de lanzamiento: 7 asaltos +Ãrea de efecto: Muro de 6 metros de largo y 1'5 metros de ancho +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro conjura un tapiz brillante de energía de color blanco-azulado. Este muro es intangible, sin necesidad de un amarre físico, y por el que se puede pasar a través fácilmente. Las criaturas malignas que cruza a través del muro reciben 2D10 puntos de daño y los muertos vivientes malignos reciben 5D10. Una criatura que cruza a través del muro, solo recibe el daño una vez. Solo puede haber efectivo un único Muro de luz de luna al mismo tiempo.~ +%atsymbol%264=~Muro de luz de luna~ +%atsymbol%263=~Rociada de espinas +(Alteración) +Nivel: 4 +Esfera: Vegetal +Alcance: Especial +Duración: Instantáneo +Tiempo de lanzamiento: 3 asaltos +Ãrea de efecto: Cono de 9 metros de largo y 7'5 metros de diámetro +Tirada de salvación: Mitad +DESCRIPCIÓN: +Mediante este conjuro el lanzador descarga desde su mano una rociada de púas, pinchos, agujas y espinas. La rociada de espinas cubre un cono de 9 metros de largo y 7'5 metros de diámetro, infligiendo 2D10 puntos de daño perforante a todas las criaturas dentro del área de efecto, o 1D10 puntos de daño si tienen éxito en una tirada de salvación contra muerte.~ +%atsymbol%262=~Rociada de espinas~ +%atsymbol%261=~Inconsciente~ +%atsymbol%260=~Maretazo +(Invocación) +Nivel: 4 +Esfera: Elemental (agua) +Alcance: 12 metros +Duración: Instantáneo +Tiempo de lanzamiento: 1 asalto +Ãrea de efecto: Ola de 1'5 metros de ancho +Tirada de salvación: Mitad +DESCRIPCIÓN: +Este conjuro convoca una ola de agua que se desplaza en la dirección deseada por el lanzador, golpeando con tremenda fuerza todo lo que encuentra en su camino. La ola inflige 4D10 puntos de daño contundente, y además, hay un 25% de probabilidad de aturdir a una criatura golpeada durante 2 asaltos, y un 5% de probabilidad de que quede inconsciente. Si la criatura golpeada tiene éxito en una tirada de salvación contra alientos, el daño se reduce a la mitad y evita ser aturdida o quedar inconsciente.~ +%atsymbol%259=~Maretazo~ +%atsymbol%258=~Garrote de metal de las estrellas~ +%atsymbol%257=~Garrote de metal de las estrellas~ +%atsymbol%256=~Garrote de metal de las estrellas +(Conjuración) +Nivel: 4 +Esfera: Combate +Alcance: El lanzador +Duración: 3 asaltos +Tiempo de lanzamiento: 7 asaltos +Ãrea de efecto: El lanzador +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro crea un garrote mágico, hecho de hierro meteórico, con un bonificador +2 al GAC0 y al daño, y se considera un arma +4 a efectos de saber a qué criaturas puede golpear. Se aplican las bonificaciones y penalizaciones en lo que respecta a los talentos marciales, a la fuerza, y a la especialización. Inflige 2D6 puntos de daño contundente adicionales contra las criaturas sobrenaturales (los muertos vivientes, los elementales, los gólems, las criaturas de los Planos exteriores, etc.).~ +%atsymbol%255=~Garrote de metal de las estrellas~ +%atsymbol%254=~Resistencia inagotable +(Nigromancia) +Nivel: 4 +Esfera: Necromántica +Alcance: Toque +Duración: Instantáneo +Tiempo de lanzamiento: 1 asalto +Ãrea de efecto: 1 criatura +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro restablece la resistencia de la criatura tocada, devolviéndole la energía perdida correspondiente a un día y medio. Hay que tener en cuenta que esto puede que no sea suficiente para eliminar el estado de "Fatiga" de un personaje.~ +%atsymbol%253=~Resistencia inagotable~ +%atsymbol%252=~Nube de pestilencia +(Alteración) +Nivel: 4 +Esfera: Combate, Elemental (aire) +Alcance: Rango visual del lanzador +Duración: 4 asaltos +Tiempo de lanzamiento: 7 asaltos +Ãrea de efecto: Radio de 6 metros +Tirada de salvación: Negación +DESCRIPCIÓN: +Este conjuro transforma el aire, de un Radio de 6 metros, en una bruma grisácea y repugnante. El lanzador y las criaturas muertos vivientes son inmunes a los efectos de la nube. Cada asalto de exposición al aire malsano causará la pérdida de 3 puntos de Fuerza y de Destreza, 3 puntos de daño y el estado de ceguera. Estos efectos duran 1 asalto. El conjuro Nube de pestilencia solo lo pueden lanzar personajes de alineamiento maligno.~ +%atsymbol%251=~Nube de pestilencia~ +%atsymbol%250=~Aturdir~ +%atsymbol%249=~Sanado~ +%atsymbol%248=~Rabia sangrienta +(Alteración) +Nivel: 4 +Esfera: Combate +Alcance: Rango visual del lanzador +Duración: 2 asaltos +Tiempo de lanzamiento: 7 asaltos +Ãrea de efecto: 1 criatura +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro solo surte efecto en las criaturas aliadas o en los personajes controlados por el jugador. Cuando se lanza, el objetivo del conjuro se vuelve Furioso, y ataca a la criatura más cercana hasta que muere, y después se desplaza hasta la siguiente. +Mientras la criatura se encuentra bajo el efecto del conjuro Rabia sangrienta es inmune a Hechizar, Sueño, Miedo, Inmovilizar, Aturdir, Emoción, conjuros de tipo Símbolo y a toda esa clase de efectos. Además, el objetivo obtiene ciertas bonificaciones, como +2 al golpe, +3 al daño, +2 a la Fuerza, 10 puntos de golpe adicionales, y a la tasa de movimiento. +Sin embargo, este conjuro tiene algunas desventajas. El objetivo no sabe los puntos de golpe que le quedan mientras dure el conjuro y no puede beneficiarse con los efectos de los conjuros que reestablezcan puntos de golpe. Al finalizar la duración del conjuro, el objetivo queda fatigado y su Fuerza se reduce a 3 durante 2 asaltos. El conjuro Rabia sangrienta no afecta ni pueden lanzarlo los personajes de alineamiento neutral.~ +%atsymbol%247=~Rabia sangrienta~ +%atsymbol%246=~Recitación +(Abjuración, Invocación/Evocación) +Nivel: 4 +Esfera: Combate +Alcance: El lanzador +Duración: 1 asalto por nivel +Tiempo de lanzamiento: 7 asaltos +Ãrea de efecto: Radio de 18 metros +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Al recitar un pasaje sagrado o una predicación, el sacerdote invoca la bendición de su deidad sobre sí mismo y a sus aliados, mientras siembra la confusión y la debilidad entre sus enemigos. Los aliados del sacerdote ganan una bonificación +2 a su ataque y a las tiradas de salvación, y los enemigos del sacerdote reciben una penalización -2 a los mismos. Este conjuro no anula un cojuro Rezo... ambos pueden lanzarse en tándem, y los efectos son acumulativos.~ +%atsymbol%245=~Recitación~ +%atsymbol%244=~Descargar electricidad estática~ +%atsymbol%243=~Carga estática +(Alteración) +Nivel: 4 +Esfera: Clima +Alcance: El lanzador +Duración: 1 asalto por nivel +Tiempo de lanzamiento: 1 asalto +Ãrea de efecto: Rango visual del lanzador +Tirada de salvación: Mitad +DESCRIPCIÓN: +El conjuro Carga estática es parecido al conjuro Clamar al relámpago con la excepción de que puede usarse en interiores. Este conjuro permite al lanzador generar una carga estática alrededor de cualquier criatura dentro del área de efecto, haciendo 2-16 puntos de daño eléctrico, y 1-8 puntos de daño adicionales por cada nivel del lanzador. La carga se enciende y se apaga una vez en cada asalto, mientras dure el conjuro.~ +%atsymbol%242=~Carga estática~ +%atsymbol%241=~Producir fuego +(Alteración) +Nivel: 4 +Esfera: Elemental (fuego) +Alcance: Rango visual del lanzador +Duración: 1 asalto +Tiempo de lanzamiento: 7 asaltos +Ãrea de efecto: Radio de 3'6 metros +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Cuando se lanza, brotan llamas desde un punto objetivo, haciendo 1-4 puntos de daño por fuego más 1 punto por nivel del lanzador a todas las criaturas dentro del área de efecto.~ +%atsymbol%240=~Producir fuego~ +%atsymbol%239=~Favor de Ilmater +(Nigromancia) +Nivel: 3 +Esfera: Nigromántica, Protección +Rango: Visual del lanzador +Duración: Instantánea +Tiempo de lanzamiento: 6 +Ãrea de efecto: 1 criatura +Tirada de salvación: Ninguna +El lanzador intercambia su propia vida por la del recipiente, intercambiando heridas físicas. El hechizo sólo tendrá efecto si el lanzador tiene más puntos de golpe que el objetivo. El intercambio es permanente hasta que se cure por otros métodos. Solo se intercambian puntos de golpe, no otras propiedades. +Este hechizo solo puede ser lanzado por personajes no-malvados. No tiene efecto sobre no-muertos, criaturas conjuradas o extra planares.~ +%atsymbol%238=~Favor de Ilmáter~ +%atsymbol%237=~Causar heridas medias (Nigromancia) +Nivel: 3 +Esfera: Curación +Alcance: Toque +Duración: Instantánea +Tiempo de lanzamiento: 5 asaltos +Ãrea de efecto: Criatura tocada +Tirada de salvación: 1/2 +DESCRIPCIÓN: +Este conjuro es el reverso de Curar heridas graves. En lugar de sanar a la criatura tocada, este efecto le inflige daño. Si el sacerdote tiene éxito en la tirada y logra tocar a su víctima, el conjuro le infligirá directamente 14 puntos de daño. El hechizo no afecta a no-muertos, criaturas convocadas o extraplanares. Este hechizo no puede ser lanzado por personajes de alineación buena.~ +%atsymbol%236=~Causar heridas medias~ +%atsymbol%235=~Caparazón de la tormenta +(Abjuración) +Nivel: 3 +Esfera: Protección, Clima +Alcance: El lanzador +Duración: 1 asalto +Tiempo de lanzamiento: 6 asaltos +Ãrea de efecto: El lanzador +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro rodea al lanzador con una esfera oscura de energía disruptiva que se desplaza con él. El caparazón reduce al lanzador el daño por fuego, por frío y eléctrico en un 50%.~ +%atsymbol%234=~Caparazón de la tormenta~ +%atsymbol%233=~Toque mohoso +(Alteración) +Nivel: 3 +Esfera: Vegetal +Alcance: Toque +Duración: 3 ó 4 asaltos (especial) +Tiempo de lanzamiento: 6 asaltos +Ãrea de efecto: 1 criatura +Tirada de salvación: Especial +DESCRIPCIÓN: +Este conjuro infecta a la criatura tocada por el lanzador con un moho marrón que se extiende rápidamente. La criatura infectada tendrá derecho a realizar una tirada de salvación contra conjuros. Si no tiene éxito, la infección será grave y la criatura recibirá el siguiente daño: +1r asalto: 4D6 puntos de daño +2o asalto: 3D6 puntos de daño +3r asalto: 2D6 puntos de daño +4o asalto: 1D6 puntos de daño +Si tiene éxito en la tirada de salvación, el daño se reduce: +1r asalto: 2D6 puntos de daño +2o asalto: 1D6 puntos de daño +3r asalto: 1D6 puntos de daño +Cada asalto después del primero, la criatura más cercana a la víctima (a 3 metros o menos) debe realizar una tirada de salvación contra conjuros o quedará afectada por el moho a plena potencia. Este proceso continúa hasta que el moho no logra infectar a tiempo a una víctima apropiada. Las criaturas que ya se encuentran bajo los efectos del moho no pueden contraerlo de nuevo. El moho marrón muere una vez expira la duración del conjuro.~ +%atsymbol%232=~Toque mohoso~ +%atsymbol%231=~Aguacero +(Invocación) +Nivel: 3 +Esfera: Elemental (agua) +Alcance: Rango visual del lanzador +Duración: 2 asaltos +Tiempo de lanzamiento: 6 asaltos +Ãrea de efecto: Radio de 9 metros +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro levanta una lluvia mágica que satura el área de efecto. Todas las criaturas que usen o moren en el fuego o en el frío recibirán 2D3 puntos de daño por asalto. Además, todas las criaturas del área tendrán un 50% de probabilidad en cada asalto de ser golpeadas por un relámpago que hace 2D6 de daño, quedando este reducido a la mitad si logran tener éxito en una tirada de salvación. El Aguacero extingue los conjuros Hoja de fuego, Sudario de fuego y el aura de las salamandras.~ +%atsymbol%230=~Aguacero~ +%atsymbol%229=~Brotar de espinas +(Alteración) +Nivel: 3 +Esfera: Elemental (tierra) +Alcance: Rango visual del lanzador +Duración: 1 asalto +Tiempo de lanzamiento: 6 asaltos +Ãrea de efecto: Radio de 5 metros +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro transforma el terreno circundante en unas plantas espinosas. Cualquier criatura que entre en el área recibirá 1D4 puntos de daño perforante y 1D4 puntos de daño cortante en cada asalto, hasta que se termine la duración del conjuro.~ +%atsymbol%228=~Brotar de espinas~ +%atsymbol%227=~Círculo de huesos +(Nigromancia) +Nivel: 3 +Esfera: Guardián/Creación +Alcance: El lanzador +Duración: 3 asaltos +Tiempo de lanzamiento: 3 asaltos +Ãrea de efecto: Radio de 1 metro +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro genera una barrera de huesos flotantes que giran rápidamente en torno al lanzador. Cualquiera que se cruza en su camino recibe 1D6 puntos de daño contundente y 1D6 puntos de daño cortante por asalto. El lanzador no puede moverse mientras dure el conjuro. El conjuro Círculo de huesos no pueden lanzarlo personajes de alineamiento bueno.~ +%atsymbol%226=~Círculo de huesos~ +%atsymbol%225=~Espada lunar~ +%atsymbol%224=~Espada lunar~ +%atsymbol%223=~Filo lunar +(Invocación) +Nivel: 3 +Esfera: Combate, Sol +Alcance: El lanzador +Duración: 2 asaltos +Tiempo de lanzamiento: 6 asaltos +Ãrea de efecto: El lanzador +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro convoca una espada tipo constructo, silenciosa e ingrávida, hecha con la esencia de la luz de la luna, y con una longitud de 1'2 metros desde la mano del lanzador. El filo lunar se considera un arma +4 a efectos de saber a qué criaturas puede golpear, aunque no se aplica ningún bonificador al GAC0. Además, dada la naturaleza inmaterial del filo lunar, no se aplican las bonificaciones de la fuerza en los ataques cuerpo a cuerpo. +Un golpe del filo lunar desgasta la vitalidad del objetivo, infligiendo 1D12+4 puntos de daño, además de 1D12 puntos de daño adicionales a los muertos vivientes que son particularmente susceptibles. Un golpe con éxito también provoca que la magia sea equívoca temporalmente, y como efecto, cualquier conjuro que quiera lanzar el objetivo en el siguiente asalto fallará.~ +%atsymbol%222=~Filo lunar~ +%atsymbol%221=~Sueño~ +%atsymbol%220=~Exaltación +(Abjuración) +Nivel: 3 +Esfera: Curación +Alcance: Toque +Duración: 1 asalto +Tiempo de lanzamiento: 1 asalto +Ãrea de efecto: 1 criatura +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro permite al sacerdote ayudar y proteger a una criatura cualquiera que no sea él mismo. Al tocar al objetivo, el lanzador elimina los efectos de miedo, sueño, debilidad mental, pérdida del conocimiento, intoxicación, y también la furia y los estados mentales de confusión. Además, el receptor está protegido contra conjuros y otros ataques que provocan estos efectos durante el tiempo que dura el conjuro.~ +%atsymbol%219=~Exaltación~ +%atsymbol%218=~Causar enfermedad +(Nigromancia) +Nivel: 3 +Esfera: Curación +Alcance: Toque +Duración: 8 horas +Tiempo de lanzamiento: 1 asalto +Ãrea de efecto: 1 criatura +Tirada de salvación: Negación +DESCRIPCIÓN: +Este conjuro aflige una enfermedad a una criatura que toca el sacerdote y que consume entre 5-20 puntos de fuerza al objetivo. Una tirada de salvación contra conjuros con éxito niega el efecto. Este conjuro no afecta a muertos vivientes, constructos o criaturas extraplanares. El conjuro Causar enfermedad no lo pueden lanzar personajes de alineamiento bueno.~ +%atsymbol%217=~Causar enfermedad~ +%atsymbol%216=~Penalizaciones de combate~ +%atsymbol%215=~Bonificaciones de combate~ +%atsymbol%214=~Rezo +(Conjuración/Convocación) +Nivel: 3 +Esfera: Combate +Alcance: El lanzador +Duración: 1 asalto por nivel +Tiempo de lanzamiento: 6 asaltos +Ãrea de efecto: Radio de 18 metros +Tirada de salvación: Ninguna +DESCRIPCIÓN: +El conjuro Rezo concede un beneficio al sacerdote y a sus aliados, y maldice a sus enemigos. Todos los ataques, el daño y las tiradas de salvación de los personajes amistosos ganan un +1, mientras que los ataques enemigos, el daño de las tiradas de dados y las tiradas de salvación se penalizan todas con -1. Cualquier criatura que se encuentre en el área de efecto cuando se lance el conjuro continuará afectada por este aunque se marchen del área, así, si los guerreros quieren ir a por los trasgos que huyen, los efectos del conjuro Rezo se mantendrán.~ +%atsymbol%213=~Rezo~ +%atsymbol%212=~Causar heridas moderadas +(Nigromancia) +Nivel: 2 +Esfera: Curación +Alcance: Toque +Duración: Permanente +Tiempo de lanzamiento: 5 asaltos +Ãrea de efecto: 1 criatura +Tirada de salvación: Mitad +DESCRIPCIÓN: +Cuando se lanza este conjuro y se toca a una criatura, el sacerdote inflige 11 puntos de daño en el cuerpo de la criatura (tirada de salvación exitosa para la mitad del daño). Este conjuro no tiene efecto en muertos vivientes, constructos o criaturas de los Planos exteriores. El conjuro Causar heridas moderadas no lo pueden lanzar personajes de alineamiento bueno.~ +%atsymbol%211=~Causar heridas moderadas~ +%atsymbol%210=~Garra de la bestia~ +%atsymbol%209=~Garra de la bestia~ +%atsymbol%208=~Garra de la bestia +(Alteración) +Nivel: 2 +Esfera: Combate +Alcance: El lanzador +Duración: 1 asalto +Tiempo de lanzamiento: 5 asaltos +Ãrea de efecto: El lanzador +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro transforma los brazos del lanzador en unas garras de una poderosa bestia, concediéndole al lanzador una Fuerza de 18/72 y la capacidad de arañar a su oponente infligiendo 2D4 puntos de daño cortante (más el bonificador a la Fuerza). El lanzador puede atacar dos veces por asalto con las garras de la bestia, con un bonificador +2 al golpe.~ +%atsymbol%207=~Garra de la bestia~ +%atsymbol%206=~Un reflejo plateado cubre su silueta (penalizador -2 a la CA).~ +%atsymbol%205=~Lanza de alicornio +(Invocación) +Nivel: 2 +Esfera: Combate +Alcance: Rango visual del lanzador +Duración: Instantáneo +Tiempo de lanzamiento: 5 asaltos +Ãrea de efecto: 1 criatura +Tirada de salvación: Mitad +DESCRIPCIÓN: +Este conjuro crea una lanza de matiz plateado y parcialmente etérea, con la forma de un alicornio (un cuerno de unicornio). El lanzador elige un objetivo y la lanza de alicornio se dispara al instante hacia él, infligiendo 3D6 puntos de daño perforante, con posibilidad de una tirada de salvación haciendo la mitad del daño. Aunque la lanza de alicornio se disipa una vez impacta, deja una brillo plateado alrededor del objetivo que hace que sea más fácil verlo y golpearlo, penalizando en -2 su CA durante 3 asaltos.~ +%atsymbol%204=~Lanza de alicornio~ +%atsymbol%203=~Sanado~ +%atsymbol%202=~Curar heridas moderadas +(Nigromancia) +Esfera: Curación +Nivel: 2 +Alcance: Toque +Duración: Instantáneo +Tiempo de lanzamiento: 5 asaltos +Ãrea de efecto: 1 criatura +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Una versión más potente del conjuro de 1er nivel de sacerdote Curar heridas leves, Curar heridas moderadas reestablece 11 puntos de golpe a una criatura viva.~ +%atsymbol%201=~Curar heridas moderadas~ +%atsymbol%200=~Cegado~ +%atsymbol%199=~Quemadura solar +(Invocación) +Nivel: 1 +Esfera: Sol +Alcance: Rango visual del lanzador +Duración: Instantáneo +Tiempo de lanzamiento: 4 asaltos +Ãrea de efecto: 1 criatura +Tirada de salvación: Mitad +DESCRIPCIÓN: +Cuando se lanza este conjuro, un rayo brillante de un calor abrasador cae vertical desde el cielo y golpea un objetivo que elija el lanzador. A la víctima se le permite una tirada de salvación contra conjuros para recibir solo la mitad del daño. Cualquier criatura golpeada por el rayo recibe 1D6 puntos de daño, y 1 punto adicional por nivel del lanzador. Las criaturas muertos vivientes y los monstruos vulnerables a la luz brillante reciben 1D6 puntos de daño, y 2 puntos adicionales por nivel de lanzador. Además de recibir el daño, las víctimas también son cegadas por el conjuro durante 3 asaltos.~ +%atsymbol%198=~Quemadura solar~ +%atsymbol%197=~Causar heridas leves +(Nigromancia) +Nivel: 1 +Esfera: Curación +Alcance: Toque +Duración: Permanente +Tiempo de lanzamiento: 5 asaltos +Ãrea de efecto: 1 criatura +Tirada de salvación: Mitad +DESCRIPCIÓN: +Cuando se lanza este conjuro y se toca a una criatura, el sacerdote inflige 8 puntos de daño (la mitad con una tirada de salvación exitosa) al cuerpo de la criatura. Este conjuro no tiene efecto en los muertos vivientes, constructos o criaturas de los Planos exteriores. El conjuro Causar heridas leves no puede ser lanzado por personajes de alineamiento bueno.~ +%atsymbol%196=~Causar heridas leves~ +%atsymbol%195=~Maldito~ +%atsymbol%194=~Maldecir +(Conjuración/Convocación) +Nivel: 1 +Esfera: Todas +Alcance: Rango visual del lanzador +Duración: 6 asaltos +Tiempo de lanzamiento: 1 asalto +Ãrea de efecto: Radio de 7'5 metros +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Cuando se vocaliza el conjuro Maldecir, el lanzador hace disminuir la moral de las criaturas enemigas y penaliza sus tiradas de salvación y las tiradas de dados de los ataques en -1. En el momento que el conjuro se ha completado, afecta a todas las criaturas en un cubo de 15 metros de lado, cuyo punto central es el seleccionado por el lanzador (y debido a eso, las criaturas que se marchan del área todavía siguen con el efecto del conjuro; y aquellas que entran en el área cuando se completa el conjuro, en cambio, no).~ +%atsymbol%193=~Maldecir~ +%atsymbol%192=~Ojo de piedra +Este ojo escuda al lanzador de un ataque de petrificación. +Puede ser usado como el hechizo de tercer nivel de mago Inmovilizar persona durante 1 asalto por nivel (negación al salvar contra conjuros).~ +%atsymbol%191=~Ojo de la piedra~ +%atsymbol%190=~Ojo del espíritu +Este ojo bloquea la muerte mágica instantánea (Dedo de la muerte, Muerte, Palabra de poder, Muerte, etc). +El ojo puede ser usado como el hechizo de segundo nivel de mago Rayo de debilitamiento, reduciendo la fuerza del objetivo en 5 (negación con salvación contra conjuros).~ +%atsymbol%189=~Ojo del espíritu~ +%atsymbol%188=~Ojo de fortitud +El ojo bloquea atontamiento, sordera, ceguera o efectos de silencio. +Puede ser usado como el hechizo de cuarto nivel Alarido, provocando 4d6 de daño mágico y ensordeciendo criaturas dentro de un radio de 15m (salvación contra conjuros por la mitad de daño y negación de sordera).~ +%atsymbol%187=~Ojo de la fortaleza~ +%atsymbol%186=~Ojo de veneno +El ojo detiene un ataque o efecto que pueda envenenar al lanzador. +El ojo puede ser usado como el hechizo de cuarto nivel de clérigo, Veneno, provocando 20 puntos de daño a una criatura durante 20 segundos (negación con salvación contra veneno).~ +%atsymbol%185=~Ojo del veneno~ +%atsymbol%184=~Ojo de la espada +Este ojo desvía el pimer ataque físico que golpea al lanzador. +El ojo puede ser usado como el hechizo de primer nivel de mago, Misil mágico, creando hasta cinco misiles (uno por cada dos niveles de experiencia), que golpean con 1d4+1 de daño mágico.~ +%atsymbol%183=~Ojo de la espada~ +%atsymbol%182=~Ojo del mago +Este ojo absorbe una manifestación del fuego, frío o ácido. +El ojo puede ser usado como el hechizo de tercer nivel de mago Rayo relampagueante, provocando 1d6 de daño por nivel del lanzador a todas las criaturas a su paso (máximo 10d6).~ +%atsymbol%181=~Ojo del mago~ +%atsymbol%180=~Ojo de la mente +Este orbe protege al lanzador contra ataques mentales como emoción y miedo. +El ojo puede ser usado como el hechizo de mago de primer nivel Hechizar persona, pudiendo el lanzador controlar al objetivo durante un asalto (negado con salvación contra conjuros).~ +%atsymbol%179=~Ojo de la mente~ +%atsymbol%178=~No podéis lanzar este hechizo hasta que no se haya agotado el conjuro actual.~ +%atsymbol%177=~Siete ojos +(Abjuración) +Nivel: 7 +Alcance: El lanzador +Duración: 2 asaltos +Tiempo de lanzamiento: 7 asaltos +Ãrea de efecto: El lanzador +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro convoca siete orbes mágicos que flotan en forma de anillo por encima de la cabeza del lanzador. Cada ojo tiene una habilidad ofensiva y una defensiva, aunque una vez se usa una de ellas, el ojo pierde su poder. Cada lanzamiento siguiente el conjuro Siete ojos fallará si se lanza antes de terminar su duración, queden o no ojos. Los poderes de cada ojo se describen a continuación: +Ojo de la mente: +Este ojo protege al lanzador contra los ataques mentales, como Hechizo, Emoción o Miedo. El ojo puede abrirse para lanzar el conjuro de primer nivel de mago, Hechizar persona. +Ojo de la espada: +Este ojo desvía el primer ataque físico dañino que golpea al lanzador. El ojo puede abrirse para lanzar el conjuro de primer nivel de mago, Proyectil mágico (5 proyectiles). +Ojo del mago: +Este ojo absorbe una manifestación de daño por fuego, electricidad, frío o ácido. El ojo también puede abrirse para lanzar el conjuro de tercer nivel de mago, Rayo relampagueante (4D8 de daño). +Ojo del veneno: +Este ojo interrumpe cualquier ataque o efecto que pueda envenenar al lanzador. El ojo también puede abrirse para envenenar a una criatura, haciendo 30 puntos de daño durante un periodo de 30 segundos. +Ojo del espíritu: +Este ojo bloquea un ataque mágico de muerte instantánea (Conjuro de muerte, Dedo de la muerte, Palabra de poder: matar, Rematar a los vivos o Destrucción). El mago puede elegir abrir el ojo para lanzar el conjuro Rayo de debilitamiento que reduce la fuerza del objetivo en 5, su probabilidad del golpe certero, y el daño que provoca. +Ojo de la fortaleza: +Este ojo bloquea un efecto de aturdimiento, sordera, ceguera o silencio. O sino, se puede abrir el ojo para lanzar el conjuro de cuarto nivel de mago, Alarido. +Ojo de la piedra: +Este ojo escuda al lanzador de un único ataque petrificante. También puede abrirse el ojo para lanzar un conjuro de tercer nivel de mago, Inmovilizar persona. +Cualquier lanzamiento siguiente del conjuro Siete ojos fallará si se lanza antes de que haya expirado el conjuro original, queden o no ojos.~ +%atsymbol%176=~Siete ojos~ +%atsymbol%175=~Furia de Malavón +(Evocación) +Nivel: 7 +Alcance: El lanzador +Duración: Instantáneo +Tiempo de lanzamiento: 1 asalto +Ãrea de efecto: Radio de 4,5 metros +Tirada de salvación: Mitad +DESCRIPCIÓN: +El conjuro Furia de Malavón lo creó Malavón, el hechicero elfo oscuro. Dispara dardos de energía pura desde el cuerpo del lanzador en todas direcciones, dañando por igual a amigos y a enemigos. Los pequeños tacos de magia hacen 20-80 puntos de daño perforante a todo lo que encuentran en su trayectoria. Este conjuro es especialmente útil cuando un mago está rodeado de enemigos.~ +%atsymbol%174=~Furia de Malavón~ +%atsymbol%173=~Golpe vorpalino~ +%atsymbol%172=~Muerte~ +%atsymbol%171=~Muerto viviente destruido~ +%atsymbol%170=~Planar destruído~ +%atsymbol%169=~Sombras +(Ilusión/Fantasmagoría) +Nivel: 6 +Alcance: Rango visual del lanzador +Duración: 1 asalto por nivel +Tiempo de lanzamiento: 6 asaltos +Ãrea de efecto: Cubo de 6 metros de lado +Tirada de salvación: Ninguna +DESCRIPCIÓN: +El conjuro Sombras es parecido al de Monstruos de la sombra y al de Monstruos de la penumbra... permite al lanzador moldear la materia del Semiplano de las Sombras y transformarlo en criaturas ilusorias. Estas sombras son más fuertes que las sombras convocadas con los conjuros Monstruos de la sombra y Monstruos de la penumbra, y obedecerán al lanzador hasta que el conjuro expire o las maten.~ +%atsymbol%168=~Sambres~ +%atsymbol%167=~Toque de liche~ +%atsymbol%166=~Toque de Liche~ +%atsymbol%165=~Toque de liche +(Nigromancia) +Nivel: 6 +Alcance: Toque +Duración: 1 asalto por nivel +Tiempo de lanzamiento: 6 asaltos +Ãrea de efecto: El lanzador +Tirada de salvación: Especial +DESCRIPCIÓN: +Este conjuro confiere al lanzador los poderes del toque y de las inmunidades de un liche. El mago obtiene la inmunidad a la parálisis y al miedo mientras el conjuro sea efectivo, y sus manos brillan con un resplandor verde sobrenatural que hacen 1-10 puntos de daño a un objetivo y lo paralizan a menos de tener éxito en una tirada de salvación contra parálisis. Este conjuro no es efectivo contra muertos vivientes.~ +%atsymbol%164=~Toque de Liche~ +%atsymbol%163=~Disipar magia~ +%atsymbol%162=~Escudo antimagia +(Abjuración) +Nivel: 6 +Alcance: El lanzador +Duración: 1 asalto por nivel +Tiempo de lanzamiento: 1 asalto +Ãrea de efecto: El lanzador +Tiro: Ninguna +DESCRIPCIÓN: +Este conjuro rodea al lanzador con una barrera invisible que se mueve con él. Esta barrera hace inmune al mago a cualquier ataque mágico, pero impide al mago poder lanzar conjuros fuera del escudo.~ +%atsymbol%161=~Escudo antimagia~ +%atsymbol%160=~Hombre lagarto violento~ +%atsymbol%159=~Trasgo de élite~ +%atsymbol%158=~Trasgo de élite~ +%atsymbol%157=~Monstruos de la penumbra +(Ilusión/Fantasmagoría) +Nivel: 5 +Alcance: Rango visual del lanzador +Duración: 1 asalto por nivel +Tiempo de lanzamiento: 5 asaltos +Ãrea de efecto: Cubo de 6 metros de lado +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro es parecido al conjuro de mago del 4º nivel, Monstruos de la sombra, excepto que las criaturas convocadas son mucho más poderosas, con el 40% de los puntos de golpe que tienen sus homónimos del mundo real.~ +%atsymbol%156=~Monstruos de la penumbra~ +%atsymbol%155=~Arma de troll~ +%atsymbol%154=~Troll~ +%atsymbol%153=~Troll~ +%atsymbol%152=~Monstruos de la sombra +(Ilusión/Fantasmagoría) +Nivel: 4 +Alcance: Rango visual del lanzador +Duración: 1 asalto por nivel +Tiempo de lanzamiento: 4 asaltos +Ãrea de efecto: Cubo de 6 metros de lado +Tirada de salvación: Especial +DESCRIPCIÓN: +Este conjuro moldea el material del Semiplano de las Sombras para convertirlo en monstruos ilusorios. Estos monstruos se convocan aleatoriamente uno por uno con los puntos de una tirada de dados entre 1 y el nivel del lanzador, hasta que los niveles de las criaturas convocadas suman en total el nivel que tiene el lanzador. (Por ejemplo, un mago de nivel 15 podría convocar a una criatura de nivel 10 en un asalto, entonces, en el siguiente asalto, la criatura que aparecería tendría una tirada de dados entre 1 y 5, y así sucesivamente). Estas criaturas de la sombra solo consiguen el 20% de los puntos de golpe que tienen sus homónimos del mundo real, aunque sus ataques provocan el daño en su totalidad.~ +%atsymbol%151=~Monstruos de la sombra~ +%atsymbol%150=~Acelerado~ +%atsymbol%149=~Lentificar~ +%atsymbol%148=~Ralentizado~ +%atsymbol%147=~Retirada expeditiva +(Alteración) +Nivel: 1 +Alcance: El lanzador +Duración: 3 asaltos +Tiempo de lanzamiento: 1 asalto +Ãrea de efecto: El lanzador +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro duplica la velocidad normal del lanzador durante un breve periodo de tiempo... normalmente, lo suficiente para poder escapar. Otros efectos que alteren el movimiento, como los conjuros Celeridad y Lentificar, no pueden afectar al lanzador mientras este conjuro sea efectivo.~ +%atsymbol%146=~Retirada expeditiva~ +%atsymbol%145=~Espada de Mordenkainen~ +%atsymbol%144=~Espada de Mordenkainen~ +%atsymbol%143=~Espada de Mordenkainen +(Evocación) +Nivel: 7 +Alcance: Rango visual del lanzador +Duración: 1 asalto por nivel +Tiempo de lanzamiento: 7 asaltos +Ãrea de efecto: Especial +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro convoca una brillante espada de fuerza que puede ser blandida mentalmente por el lanzador. Golpea como si fuera usada por un guerrero con un nivel a la mitad del que tiene el lanzador, y a pesar del hecho de que se sostiene con la mano, puede golpear a criaturas en cualquier lugar dentro del rango visual del lanzador. Aunque la espada no tiene bonificaciones para el ataque, puede golpear a criaturas que normalmente se aciertan solamente con armas +2 o mejores, e inflige 5-30 puntos de daño en cada golpe.~ +%atsymbol%142=~Espada de Mordenkainen~ +%atsymbol%141=~Elemental de agua~ +%atsymbol%140=~Elemental de agua~ +%atsymbol%139=~Conjurar elemental de agua +(Conjuración/Convocación) +Nivel: 5 +Alcance: Rango visual del lanzador +Duración: 1 asalto por nivel +Tiempo de lanzamiento: 1 asalto +Ãrea de efecto: Especial +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro permite al lanzador conjurar un elemental desde el Plano elemental del agua y vincularlo a su voluntad. Este elemental luchará en beneficio del lanzador hasta que la duración del conjuro expire o se destruya al elemental.~ +%atsymbol%138=~Conjurar elemental de agua~ +%atsymbol%137=~Elemental de aire~ +%atsymbol%136=~Elemental de aire~ +%atsymbol%135=~Conjure Air Elemental +(Conjuration/Summoning) +Level: 5 +Range: Visual range of the caster +Duration: 1 turn/level +Casting Time: 9 +Area of Effect: Special +Saving Throw: None +This spell allows the caster to summon an 8-HD elemental from the Elemental Plane of Air and bind it to will. This elemental will fight on behalf of the caster until the spell duration expires or the elemental is destroyed.~ +%atsymbol%134=~Conjurar elemental de aire~ +%atsymbol%133=~Elemental de fuego~ +%atsymbol%132=~Elemental de fuego~ +%atsymbol%131=~Conjurar elemental de fuego +(Conjuración/Convocación) +Nivel: 5 +Alcance: Rango visual del lanzador +Duración: 1 asalto por nivel +Tiempo de lanzamiento: 1 asalto +Ãrea de efecto: Especial +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro permite al lanzador convocar a un elemental del Plano elemental del fuego y lo vincula a su voluntad. Este elemental luchará en beneficio del lanzador hasta que finalice la duración del conjuro o se destruya al elemental.~ +%atsymbol%130=~Conjurar elemental de fuego~ +%atsymbol%129=~Elemental de tierra~ +%atsymbol%128=~Elemental de tierra~ +%atsymbol%127=~Conjurar elemental de tierra +(Conjuración/Convocación) +Nivel: 5 +Alcance: Rango visual del lanzador +Duración: 1 asalto por nivel +Tiempo de lanzamiento: 1 asalto +Ãrea de efecto: Especial +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro permite al lanzador convocar a un elemental del Plano elemental de tierra y lo vincula a su voluntad. Este elemental luchará en beneficio del lanzador hasta que finalice la duración del conjuro o se destruya al elemental.~ +%atsymbol%126=~Conjurar elemental de tierra~ +%atsymbol%125=~Convocar monstruos III +(Conjuración/Convocación) +Nivel: 5 +Alcance: 36 metros +Duración: 4 asaltos + 1 asalto por nivel +Tiempo de lanzamiento: 5 asaltos +Ãrea de efecto: Especial +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Cuando se lanza este conjuro, el mago convoca entre 1-4 monstruos de tercer nivel. Estos aparecen dentro del alcance del conjuro y se les puede ordenar que ataquen a los oponentes del lanzador hasta que termine la duración del conjuro o mueran los monstruos.~ +%atsymbol%124=~Convocar monstruos III~ +%atsymbol%123=~Hombre lagarto~ +%atsymbol%122=~Hombre lagarto~ +%atsymbol%121=~Convocar monstruos II +(Conjuración/Convocación) +Nivel: 4 +Alcance: 36 metros +Duración: 3 asaltos + 1 asalto por nivel +Tiempo de lanzamiento: 4 asaltos +Ãrea de efecto: Especial +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Cuando se lanza este conjuro, el mago convoca entre 1-6 monstruos de segundo nivel. Estos aparecen dentro del alcance del conjuro y se les puede ordenar que ataquen a los oponentes del lanzador hasta que termine la duración del conjuro o mueran los monstruos.~ +%atsymbol%120=~Convocar monstruos II~ +%atsymbol%119=~Trasgo~ +%atsymbol%118=~Trasgo~ +%atsymbol%117=~Convocar monstruos I +(Conjuración/Convocación) +Nivel: 3 +Alcance: 36 metros +Duración: 2 asaltos + 1 asalto por nivel +Tiempo de lanzamiento: 4 asaltos +Ãrea de efecto: Especial +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Cuando se lanza este conjuro, el mago convoca entre 2-6 monstruos de primer nivel. Estos aparecen dentro del alcance del conjuro y se les puede ordenar que ataquen a los oponentes del lanzador hasta que termine la duración del conjuro o mueran los monstruos.~ +%atsymbol%116=~Convocar monstruos I~ +%atsymbol%115=~Atacar~ +%atsymbol%114=~Minotauro~ +%atsymbol%113=~Minotauro~ +%atsymbol%112=~Convocar monstruos V +(Conjuración/Convocación) +Nivel: 7 +Alcance: 40 metros +Duración: 6 asaltos + 1 asalto por nivel +Tiempo de lanzamiento: 6 asaltos +Ãrea de efecto: Especial +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Cuando se lanza este conjuro, el mago convoca entre 1-3 monstruos de quinto nivel. Estos aparecen dentro del alcance del conjuro y se les puede ordenar que ataquen a los oponentes del lanzador hasta que termine la duración del conjuro o mueran los monstruos.~ +%atsymbol%111=~Convocar monstruos V~ +%atsymbol%110=~Salamander spear +1d8 piercing +1d6 fire damage +do not translate~ +%atsymbol%109=~Frost salamander spear +1d8 piercing ++1d6 cold +do not trans~ +%atsymbol%108=~Salamandra~ +%atsymbol%107=~Salamandra~ +%atsymbol%106=~Salamandra de la escarcha~ +%atsymbol%105=~Salamandra de la escarcha~ +%atsymbol%104=~Convocar monstruos VI +(Conjuración/Convocación) +Nivel: 8 +Alcance: 40 metros +Duración: 7 asaltos + 1 asalto por nivel +Tiempo de lanzamiento: 8 asaltos +Ãrea de efecto: Especial +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Cuando se lanza este conjuro, el mago convoca entre 1-3 monstruos de sexto nivel. Estos aparecen dentro del alcance del conjuro y se les puede ordenar que ataquen a los oponentes del lanzador hasta que termine la duración del conjuro o mueran los monstruos.~ +%atsymbol%103=~Convocar monstruos VI~ +%atsymbol%102=~Atacar~ +%atsymbol%101=~Mole sombría~ +%atsymbol%100=~Mole sombría~ +%atsymbol%99=~Esqueleto guardián~ +%atsymbol%98=~Esqueleto guardián~ +%atsymbol%97=~Convocar monstruos VII +(Conjuración/Convocación) +Nivel: 9 +Alcance: 40 metros +Duración: 7 asaltos + 1 asalto por nivel +Tiempo de lanzamiento: 9 asaltos +Ãrea de efecto: Especial +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Cuando se lanza este conjuro, el mago convoca entre 1-2 monstruos de séptimo u octavo nivel. Estos aparecen dentro del alcance del conjuro y se les puede ordenar que ataquen a los oponentes del lanzador hasta que termine la duración del conjuro o mueran los monstruos.~ +%atsymbol%96=~Convocar monstruos VII~ +%atsymbol%95=~Convocar monstruos IV +(Conjuración/Convocación) +Nivel: 6 +Alcance: 40 metros +Duración: 5 asaltos + 1 asalto por nivel +Tiempo de lanzamiento: 6 asaltos +Ãrea de efecto: Especial +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Cuando se lanza este conjuro, el mago convoca entre 1-3 monstruos de cuarto nivel. Estos aparecen dentro del alcance del conjuro y se les puede ordenar que ataquen a los oponentes del lanzador hasta que termine la duración del conjuro o mueran los monstruos.~ +%atsymbol%94=~Convocar monstruos IV~ +%atsymbol%93=~Calavera~ +%atsymbol%92=~Monster Transparency +Do not translate~ +%atsymbol%91=~Objeto para transparentar monstruos~ +%atsymbol%90=~Sombra~ +%atsymbol%89=~Sombra~ +%atsymbol%88=~Invocar a la sombra +(Conjuración/Convocación, Nigromancia) +Nivel: 5 +Alcance: Rango visual del lanzador +Duración: 1 asalto + 1 asalto por nivel +Tiempo de lanzamiento: 5 asaltos +Ãrea de efecto: Cubo de 3 metros de lado +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro convoca a una sombra por cada tres niveles del lanzador. Esta sombra obedecerá las ordenes del lanzador, atacando a sus enemigos o desempeñando tareas hasta que el conjuro expire o se mate a las sombras.~ +%atsymbol%87=~Invocar a la sombra~ +%atsymbol%86=~Puño de hierro~ +%atsymbol%85=~Puño de hierro~ +%atsymbol%84=~Aquejado de una terrible enfermedad.~ +%atsymbol%83=~Enfermo~ +%atsymbol%82=~Envenenado~ +%atsymbol%81=~Veneno~ +%atsymbol%80=~Cuerpo de hierro +(Alteración) +Nivel: 8 +Alcance: El lanzador +Duración: 2 asaltos +Tiempo de lanzamiento: 8 asaltos +Ãrea de efecto: El lanzador +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro transforma el cuerpo del lanzador en hierro viviente, otorgándole varias resistencias y habilidades poderosas. Mientras el conjuro sea efectivo, el lanzador obtiene una resistencia a la electricidad del 100%, del 50% al fuego y del 25% al daño contundente. +Los conjuros que afectan a la respiración o a la fisiología del lanzador se ignoran. Además, la fuerza del lanzador aumenta hasta 25, y puede atacar dos veces por asalto con unos puños de hierro que hacen 2D4 puntos de daño, y a esto hay que añadir las bonificaciones a la fuerza pertinentes. +Por desgracia, el movimiento del lanzador se lentifica y se vuelve torpe, situando su tasa de movimiento al 25% de su actual, y no puede lanzar conjuros mientras sea efectivo el conjuro Cuerpo de hierro.~ +%atsymbol%79=~Cuerpo de hierro~ +%atsymbol%78=~Inconsciente~ +%atsymbol%77=~Gran alarido +(Invocación) +Nivel: 8 +Alcance: El lanzador +Duración: Instantáneo +Tiempo de lanzamiento: 1 asalto +Ãrea de efecto: 10 metros de largo por 3 metros de diámetro +Tirada de salvación: Mitad +DESCRIPCIÓN: +Tras vocalizar el conjuro Gran alarido, el lanzador libera por la boca una fuerza cónica espectacular de 10 metros de largo por 3 metros de diámetro. +El conjuro Gran alarido resulta extremadamente agotador y peligroso para el usuario. El alarido absorbe 2D4 puntos de golpe al lanzador y debe hacer una tirada de salvación contra conjuros o quedará inconsciente durante un asalto. +Las criaturas con 5 dados de golpe a las que afecta el conjuro Gran alarido, mueren al instante. Todas las otras criaturas dentro del área de efecto deben hacer una tirada de salvación contra conjuros. Las que la fallan, son aturdidas durante 2 asaltos, ensordecidas durante 4 asaltos y reciben 4D12 puntos de daño. Las que tienen éxito en la tirada, son aturdidas durante 1 asalto, ensordecidas durante 2 asaltos y reciben 2D12 puntos de daño.~ +%atsymbol%76=~Gran alarido~ +%atsymbol%75=~Hechizado~ +%atsymbol%74=~Horrendamente hechizada~ +%atsymbol%73=~Dominado~ +%atsymbol%72=~Bajada de moral: pánico~ +%atsymbol%71=~Bebido~ +%atsymbol%70=~Confuso~ +%atsymbol%69=~Pensamiento estricto~ +%atsymbol%68=~Inmóvil~ +%atsymbol%67=~Paralizado~ +%atsymbol%66=~Inmóvil~ +%atsymbol%65=~Mente en blanco +(Abjuración) +Nivel: 8 +Alcance: El lanzador +Duración: 1 día +Tiempo de lanzamiento: 1 asalto +Ãrea de efecto: El lanzador +Tirada de salvación: Ninguna +DESCRIPCIÓN: +En lo referente al autocontrol y a la privacidad de uno mismo, el conjuro Mente en blanco escuda a la mente de la criatura de casi cualquier efecto mental... Hechizar, Orden imperiosa, Dominación, Miedo, Debilidad mental, y cualquier visión por bolas de cristal u otros métodos de adivinación.~ +%atsymbol%64=~Mente en blanco~ +%atsymbol%63=~Asfixiar +(Alteración) +Nivel: 7 +Alcance: Rango visual del lanzador +Duración: 4 asaltos +Tiempo de lanzamiento: 7 asaltos +Ãrea de efecto: Radio de 3 metros +Tirada de salvación: Mitad +DESCRIPCIÓN: +Este conjuro extrae el aliento de todas las criaturas dentro del área de efecto. No afecta a las criaturas que no respiran. Las criaturas asfixiadas experimentan un penalizador -4 a la clase de armadura, -4 al golpe, -6 a la destreza, un ataque menos por asalto, la mitad de la tasa del movimiento, y recbien 4D8 puntos de daño por asalto. Una tirada de salvación con éxito niega todos los efectos, excepto que reciben 2D8 puntos de daño durante un asalto. Los efectos empiezan a disiparse cuando la criatura sale del área de efecto, aunque un personaje puede necesitar un asalto para recuperar el aliento.~ +%atsymbol%62=~Asfixiar~ +%atsymbol%61=~Tormenta ácida +(Evocación) +Nivel: 7 +Alcance: Rango visual del lanzador +Duración: 1 asalto por nivel +Tiempo de lanzamiento: 7 asaltos +Ãrea de efecto: Radio de 6 metros +Tirada de salvación: Mitad +DESCRIPCIÓN: +Este conjuro desata un aguacero ácido sobre el área de efecto, haciendo 1-4 puntos de daño en cada asalto durante los tres primeros asaltos, 1-6 puntos de daño durante los tres siguientes asaltos y 1-8 puntos de daño por cada asalto posterior. Apartarse del área de efecto no detiene el daño... el ácido se adhiere a la piel y todas las criaturas que se encontraban dentro del área de efecto cuando se lanzó la Tormenta ácida continúan sufriendo daño mientras el conjuro dure. Las criaturas hacen una tirada de salvación contra conjuros en cada asalto después de haber sido golpeadas por la tormenta... y si se tiene éxito, solamente reciben la mitad de daño (en ese asalto en concreto).~ +%atsymbol%60=~Tormenta ácida~ +%atsymbol%59=~Fortaleza de troll +(Nigromancia) +Nivel: 6 +Alcance: El lanzador +Duración: 2 asaltos +Tiempo de lanzamiento: 6 asaltos +Ãrea de efecto: El lanzador +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro imbuye al lanzador con la capacidad de un troll, y le permite regenerar 5 puntos de golpe por asalto, hasta alcanzar sus puntos de golpe máximos.~ +%atsymbol%58=~Fortaleza de troll~ +%atsymbol%57=~Esqueleto~ +%atsymbol%56=~Esqueleto~ +%atsymbol%55=~Devorador de almas +(Nigromancia) +Nivel: 6 +Alcance: Rango visual del lanzador +Duración: Instantáneo +Tiempo de lanzamiento: 5 asaltos +Ãrea de efecto: Radio de 3 metros +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro inflige 3D8 puntos de daño a todas las criaturas vivas en un radio de 3 metros. Toda criatura que muera como resultado de este daño se extinguirá, y su esencia se transformará en un esqueleto de 3 dados de golpe bajo el control del lanzador. Además, por cada criatura que muera de esta forma, el lanzador recibe una bonificación +1 a la fuerza, destreza y constitución durante 1 asalto. El conjuro Devorador de almas no tiene efecto en los muertos vivientes, constructos y criaturas elementales.~ +%atsymbol%54=~Devorador de almas~ +%atsymbol%53=~Dardo de hueso~ +%atsymbol%52=~Dardo de hueso~ +%atsymbol%51=~Dardos de hueso +(Nigromancia) +Nivel: 6 +Alcance: El lanzador +Duración: 5 asaltos +Tiempo de lanzamiento: 5 asaltos +Ãrea de efecto: El lanzador +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro crea nueve dardos que pueden usarse por el lanzador y no pueden desequiparse mientras el conjuro sea efectivo. Estos dardos poseen un bonificador +3, infligen 1D4 puntos de daño, y toda criatura que resulte alcanzada por un dardo debe hacer una tirada de salvación contra muerte exitosa, sino recibirá 2D6 puntos de daño y su fuerza se reducirá durante 3-5 asaltos. El talento marcial del lanzador con proyectiles (o su carencia), no tiene efecto en la probabilidad de que el dardo golpee un objetivo.~ +%atsymbol%50=~Dardos de hueso~ +%atsymbol%49=~Esfera congelante de Otiluke +(Alteración, Evocación) +Nivel: 6 +Alcance: Rango visual del lanzador +Duración: Instantáneo +Tiempo de lanzamiento: 6 asaltos +Ãrea de efecto: 1 criatura +Tirada de salvación: Negación +DESCRIPCIÓN: +Este conjuro dispara a una criatura un orbe de frío que inflige 3-6 puntos de daño por frío por cada nivel del lanzador. Sin embargo, si el objetivo tiene éxito en su tirada de salvación contra conjuros, puede esquivar el orbe y evitar todo el daño.~ +%atsymbol%48=~Esfera congelante de Otiluke~ +%atsymbol%47=~Sudario de fuego +(Invocación) +Nivel: 5 +Alcance: Rango visual del lanzador +Duración: 1 asalto cada 2 niveles (especial) +Tiempo de lanzamiento: 5 asaltos +Ãrea de efecto: 1 criatura +Tirada de salvación: Negación +DESCRIPCIÓN: +Este conjuro hace que una criatura comience a arder si falla una tirada de salvación contra conjuros. La criatura arderá recibiendo 2D6 puntos de daño en cada asalto, y del objetivo ardiendo eruptan gotas de fuego que causan a las criaturas dentro de un radio de 3 metros del objetivo que reciban 1D4 puntos de daño por fuego. Cualquiera que sea golpeado por las llamas de la víctima también debe hacer una tirada de salvación contra conjuros para evitar contraer el sudario. El sudario de fuego se disipa si el lanzador y el objetivo ya no están en la misma área. Este conjuro es particularmente útil para dispersar grupos de trolls o salamandras de la escarcha.~ +%atsymbol%46=~Sudario de fuego~ +%atsymbol%45=~Esfera vitriólica +(Conjuración) +Nivel: 4 +Alcance: Rango visual del lanzador +Duración: Especial +Tiempo de lanzamiento: 4 asaltos +Ãrea de efecto: Especial +Tirada de salvación: Especial +DESCRIPCIÓN: +Este conjuro convoca una esfera de ácido de color esmeralda brillante que el lanzador puede dirigir para que golpee a cualquier objetivo dentro de su alcance. +Cuando acierta en el objetivo, la esfera explota y empapa a la víctima con un potente ácido. La víctima sufre 1D4 puntos de daño por ácido por nivel del lanzador, hasta un máximo de 12D4 puntos de daño. Tras el daño inicial, la víctima debe hacer una tirada de salvación para evitar el daño. Si no tiene éxito, la víctima continúa sufriendo daño por ácido en los asaltos siguientes, soportando dos dados menos de daño en cada asalto que transcurre. Por ejemplo, un mago de octavo nivel inflige 8D4 puntos de daño con este conjuro en el primer asalto, 6D4 en el segundo asalto, 4D4 en el tercero, 2D4 en el cuarto, y en el quinto asalto finaliza el conjuro. A la víctima se le permite una tirada de salvación contra conjuros en cada ronda para evitar más daño. +El conjuro Esfera vitriólica también salpica ácido en un radio de 1'5 metros alrededor del primer objetivo. Las criaturas dentro del radio donde salpica, deben hacer una tirada de salvación contra polimorfismo/petrificación o sufrirán un golpe por salpicadura que inflige 1D4 puntos de daño por cada cinco niveles del lanzador. Los golpes por salpicadura no provocan un daño continuado.~ +%atsymbol%44=~Esfera vitriólica~ +%atsymbol%43=~Sordera~ +%atsymbol%42=~Alarido +(Invocación) +Nivel: 4 +Alcance: El lanzador +Duración: Instantáneo +Tiempo de lanzamiento: 1 asalto +Ãrea de efecto: 10 metros de largo por 3 metros de diámetro +Tirada de salvación: Mitad +DESCRIPCIÓN: +Este conjuro otorga al mago un tremendo poder vocal, permitiéndole emitir desde la boca un rugido ensordecedor que cubre un área de efecto cónica de 10 metros de largo por 3 metros de diámetro en su punto más lejano. Cualquier criatura dentro del área queda ensordecida durante 2D6 asaltos y recibe 4D6 puntos de daño. Una tirada de salvación contra conjuros con éxito niega la sordera y reduce el daño a la mitad.~ +%atsymbol%41=~Alarido~ +%atsymbol%40=~Proyectiles de fuerza de Mordenkainen +(Invocación) +Nivel: 4 +Alcance: Rango visual del lanzador +Duración: Instantáneo +Tiempo de lanzamiento: 4 asaltos +Ãrea de efecto: Especial +Tirada de salvación: Especial +DESCRIPCIÓN: +Este conjuro crea un globo brillante de energía mágica que surge de la mano del lanzador y alcanza a su objetivo sin posibilidad de error, de forma muy parecida al conjuro Proyectil mágico. El mago crea un proyectil en el séptimo nivel, y un proyectil adicional cada tres niveles después del séptimo... en otras palabras, dos proyectiles a nivel 10, tres a nivel 13, cuatro a nivel 16, y así, hasta un máximo de siete proyectiles a nivel 25. Cada proyectil inflige 2D4 puntos de daño al objetivo y, a continuación, brota en un radio de 1'5 metros una explosión violenta que inflige 1 punto de daño por nivel del lanzador... por ejemplo, un mago de nivel 12, podría convocar dos proyectiles de fuerza, y cada uno de ellos haría 2D4+12 puntos de daño. +Las criaturas que reciben el daño pueden intentar una tirada de salvación contra conjuros para evitar el daño de la explosión, pero el propio proyectil no permite ninguna tirada de salvación. El conjuro Escudo del primer nivel de mago absorbe el daño del proyectil de fuerza, incluído el daño de la explosión.~ +%atsymbol%39=~Proyectiles de fuerza de Mordenkainen~ +%atsymbol%38=~Desesperación~ +%atsymbol%37=~Aturdido~ +%atsymbol%36=~Emoción: desesperación +(Encantamiento/Hechizo) +Nivel: 4 +Alcance: Rango visual del lanzador +Duración: 1 asalto +Tiempo de lanzamiento: 4 asaltos +Ãrea de efecto: Radio de 6 metros +Tirada de salvación: Negación +DESCRIPCIÓN: +Este conjuro crea la emoción de la desesperanza dentro del área de efecto. Todas las criaturas afectadas por el conjuro se detienen y no hacen nada mientras dura el conjuro.~ +%atsymbol%35=~Emoción: desesperación~ +%atsymbol%34=~Pánico~ +%atsymbol%33=~Emoción: temor +(Encantamiento/Hechizo) +Nivel: 4 +Alcance: Rango visual del lanzador +Duración: 5 asaltos +Tiempo de lanzamiento: 4 asaltos +Ãrea de efecto: Radio de 6 metros +Tirada de salvación: Negación +DESCRIPCIÓN: +Este conjuro provoca la emoción de temor dentro del área de efecto. Todas las criaturas afectadas por el conjuro huyen durante 5 asaltos.~ +%atsymbol%32=~Emoción: temor~ +%atsymbol%31=~Emoción: esperanza +(Encantamiento/Hechizo) +Nivel: 4 +Alcance: Rango visual del lanzador +Duración: 5 asaltos +Tiempo de lanzamiento: 4 asaltos +Ãrea de efecto: Radio de 6 metros +Tirada de salvación: Negación +DESCRIPCIÓN: +Este conjuro crea la emoción de esperanza dentro del área de efecto. Todas las criaturas afectadas por el conjuro ganan un aumento de la moral, y +2 a las tiradas de salvación, tiradas de dado para el ataque y tiradas de dado para el daño.~ +%atsymbol%30=~Emoción: esperanza~ +%atsymbol%29=~Emoción: valentía +(Encantamiento/Hechizo) +Nivel: 4 +Alcance: Rango visual del lanzador +Duración: 5 asaltos +Tiempo de lanzamiento: 4 asaltos +Ãrea de efecto: Radio de 6 metros +Tirada de salvación: Negación +DESCRIPCIÓN: +Este conjuro provoca la emoción de valentía dentro del área de efecto. Todas las criaturas afectadas por el conjuro ganan +1 al acierto del golpe, +3 a las tiradas de dado al daño y +5 a los puntos de golpe temporales (que pueden superar los puntos de golpe máximos). Este conjuro anula todos los efectos de miedo dentro del área de efecto en el momento de ser lanzado.~ +%atsymbol%28=~Emoción: valentía~ +%atsymbol%27=~Furia~ +%atsymbol%26=~Sangre ardiente de Beltyn +(Nigromancia) +Nivel: 4 +Alcance: Rango visual del lanzador +Duración: 1 asalto cada 2 niveles +Tiempo de lanzamiento: 4 asaltos +Ãrea de efecto: 1 criatura +Tirada de salvación: Negación +DESCRIPCIÓN: +Este conjuro convierte la sangre del objetivo en fuego, y a causa de eso, recibe 3-12 puntos de daño en cada asalto y hace que se enfurezca debido al dolor. El objetivo debe hacer una tirada de salvación contra conjuros en cada asalto; si tiene éxito, el daño y el estar enfurecido se niegan. Este conjuro no funciona en muertos vivientes o en criaturas de los Planos exteriores que no tengan sangre (como los elementales). Si la criatura es resistente al fuego, esta resistencia disminuirá o anulará el daño de este conjuro.~ +%atsymbol%25=~Sangre ardiente de Beltyn~ +%atsymbol%24=~Lanza de disrupción +(Invocación) +Nivel: 3 +Alcance: 18 metros +Duración: Instantáneo +Tiempo de lanzamiento: 3 asaltos +Ãrea de efecto: Especial +Tirada de salvación: Mitad +DESCRIPCIÓN: +Este conjuro crea una lanza de energía, que se extiende desde el lanzador hasta un punto concreto situado a una distancia de 18 metros. Cualquier criatura que se encuentre en el camino de la lanza sufrirá 5D4 puntos de daño contundente, y adicionalmente, +2 puntos de daño por nivel del lanzador (hasta un máximo de +30). +Las víctimas pueden hacer una tirada de salvación contra conjuros para recibir solamente la mitad del daño.~ +%atsymbol%23=~Lanza de disrupción~ +%atsymbol%22=~Atontado~ +%atsymbol%21=~Lanza de hielo +(Evocación) +Nivel: 3 +Alcance: Rango visual del lanzador +Duración: Instantáneo +Tiempo de lanzamiento: 3 asaltos +Ãrea de efecto: 1 criatura +Tirada de salvación: Especial +DESCRIPCIÓN: +Este conjuro dispara una lanza mágica de hielo al objetivo que elije el lanzador. Golpea de forma automática, infligiendo 5-30 puntos de daño y forzando al objetivo a hacer una tirada de salvación contra conjuros, sino quedará aturdido durante 1-4 asaltos.~ +%atsymbol%20=~Lanza de hielo~ +%atsymbol%19=~Modificación de la Destreza~ +%atsymbol%18=~Gracia felina +(Alteración) +Nivel: 2 +Alcance: Toque +Duración: 1 hora por nivel +Tiempo de lanzamiento: 2 asaltos +Ãrea de efecto: 1 criatura +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro incrementa mágicamente la Destreza del objetivo, aunque la cantidad depende de su clase: +Los ladrones ganan 1-8 puntos +Los guerreros y magos ganan 1-6 puntos +Los clérigos ganan 1-4 puntos +El conjuro Gracia felina no puede aumentar en más de 20 la destreza del objetivo.~ +%atsymbol%17=~Gracia felina~ +%atsymbol%16=~Decaestaca~ +%atsymbol%15=~Decaestaca~ +%atsymbol%14=~Decaestaca +(Evocación) +Nivel: 2 +Alcance: El lanzador +Duración: 1 asalto por nivel +Tiempo de lanzamiento: 2 asaltos +Ãrea de efecto: El lanzador +Tirada de salvación: Ninguna +DESCRIPCIÓN: +Este conjuro crea un bastón de energía en la mano del lanzador. Se considera un arma mágica, y hace 1-6 puntos de daño por golpe y puede golpear a criaturas inmunes a armas normales. Sin embargo es una bastón, así que si el lanzador no tiene ningún talento marcial en bastones, entonces la Decaestaca se usa con penalizadores. El bastón también tiene el poder para drenar 1-2 puntos de golpe del objetivo en el primer golpe. Estos puntos de golpe se añaden al lanzador, pero solo pueden curar el daño que el lanzador ha recibido; no aumentarán sus puntos de golpe máximos.~ +%atsymbol%13=~Decaestaca~ +%atsymbol%12=~Escarabajo~ +%atsymbol%11=~Enjambre de bolas de nieve de Snilloc +(Evocación) +Nivel: 2 +Alcance: Rango visual del lanzador +Duración: Instantáneo +Tiempo de lanzamiento: 2 asaltos +Ãrea de efecto: Radio de 7,5 metros +Tirada de salvación: Mitad +DESCRIPCIÓN: +Este conjuro ocasiona unos remolinos de bolas de nieve que brotan desde un punto dentro de una zona determinada. Estas bolas de nieve golpearán a todo lo que se encuentre dentro del área de efecto, haciendo 1-3 puntos de daño por nivel, hasta un máximo de 8-24 puntos de daño en el nivel 8. Contra criaturas que usan o moran en el fuego, inflige 1-6 puntos de daño por nivel.~ +%atsymbol%10=~~ +%atsymbol%9=~Enjambre de bolas de nieve de Snilloc~ +%atsymbol%8=~El Ojo de la mente bloquea el efecto y se disipa.~ +%atsymbol%7=~El Ojo de la espada bloquea el efecto y se disipa.~ +%atsymbol%6=~El Ojo del mago bloquea el efecto y se disipa.~ +%atsymbol%5=~El Ojo del veneno bloquea el efecto y se disipa.~ +%atsymbol%4=~El Ojo del espíritu bloquea el efecto y se disipa.~ +%atsymbol%3=~El Ojo de la fortaleza bloquea el efecto y se disipa.~ +%atsymbol%2=~El Ojo de la piedra bloquea el efecto y se disipa.~ +%atsymbol%1=~Este conjuro cura al personaje seleccionado. Se reestablecen 11 puntos de golpe.~ diff --git a/iwdification/dw_iwdspells_resource/tra/fr_fr/iwdspells.tra b/iwdification/dw_iwdspells_resource/tra/fr_fr/iwdspells.tra new file mode 100644 index 0000000..0ca9b98 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/tra/fr_fr/iwdspells.tra @@ -0,0 +1,1210 @@ +%atsymbol%359=~Courage~ +%atsymbol%358=~Espoir~ +%atsymbol%357=~Grâce féline~ +%atsymbol%356=~Juste courroux des fidèles~ +%atsymbol%355=~Prière~ +%atsymbol%354=~Rage sanguinaire~ +%atsymbol%353=~Récitation~ +%atsymbol%352=~Exaltation~ +%atsymbol%351=~Rage animale~ +%atsymbol%350=~Corps de fer~ +%atsymbol%349=~Pétrifié(e)~ +%atsymbol%348=~Citadelle de l'âme~ +%atsymbol%347=~Douleur~ +%atsymbol%346=~En état de phase~ +%atsymbol%345=~Aide~ +%atsymbol%344=~Esprit impénétrable~ +%atsymbol%343=~Transf. élémentaire (Terre)~ +%atsymbol%342=~Transf. élémentaire (Feu)~ +%atsymbol%341=~Chant de guerre de Sith - bonus à l'armure et régénération~ +%atsymbol%340=~"Le chant de Guerre de Sith" +Tous les alliés à 9 mètres de distance gagnent un bonus de +2 à la classe d'armure, 10% de résistance aux dégâts tranchants, perforants, contondants et projectiles, ainsi qu'une capacité de régénération de 2 points de vie par round.~ +%atsymbol%339=~Chant de guerre de Sith~ +%atsymbol%338=~Captivé~ +%atsymbol%337=~Chant des sirènes - fascine qui l'entend~ +%atsymbol%336=~"Le chant des Sirènes" +Tous les adversaires à 9 mètres de distance doivent réussir un jet de sauvegarde contre les sorts ou perdre leur action pendant un round, ou jusqu'à ce qu'ils subissent des dégâts.~ +%atsymbol%335=~Chant des sirènes~ +%atsymbol%334=~Chant de Kaudiès - résistance aux attaques soniques~ +%atsymbol%333=~"Le chant de Kaudiès" +Tous les alliés à 9 mètres de distance ont 50% de chances de résister aux effets des sorts de Silence, Cri, Grand Cri, Injonction, Injonction majeure et tout autre attaque à base de son.~ +%atsymbol%332=~Chant de Kaudiès~ +%atsymbol%331=~Mélodie de Tymora - bonus de chance et de compétence~ +%atsymbol%330=~"La mélodie de Tymora" +Tous les alliés à 9 mètres de distance gagnent un bonus de +1 à la chance, +3 aux jets de sauvegarde, +10 au score de connaissance et +10% aux talents de voleur.~ +%atsymbol%329=~Mélodie de Tymora~ +%atsymbol%328=~Ballade de Curran CÅ“urvaillant - immunité contre la terreur~ +%atsymbol%327=~"La ballade de Curran CÅ“urvaillant" +Tous les alliés à 9 mètres de distance sont immunisés à la terreur aussi longtemps que dure la musique, et tout effet de terreur est dissipé instantanément.~ +%atsymbol%326=~Ballade de Curran CÅ“urvaillant~ +%atsymbol%325=~Ballade des Trois Héros - bonus au combat~ +%atsymbol%324=~"La ballade des Trois Héros" +Tous les alliés à 9 mètres de distance gagnent un bonus de +1 à l'attaque, aux dégâts et aux jets de sauvegarde.~ +%atsymbol%323=~Ballade des Trois Héros~ +%atsymbol%322=~Libère des vapeurs acides~ +%atsymbol%321=~Flétrissement~ +%atsymbol%320=~Flétrissement +(Nécromancie) +Niveau : 7 +Sphère : Guérison +Portée : contact +Durée : 1 round par 2 niveaux +Temps d'incantation : 7 +Zone d'effet : 1 créature +Jet de sauvegarde : annule +Ce puissant sort fait en sorte que les organes de la cible cessent de fonctionner et se transforment peu à peu en poussière. La victime perd 3 points de vie par seconde. L'effet dure 1 round par 2 niveaux de lanceur, ou jusqu'à dissipation. Par exemple, un Flétrissement lancé par un clerc de niveau 14 ferait perdre 18 points de vie par round pendant 7 rounds. Ce sort reste sans effet contre les morts-vivants, les créatures artificielles et extra-planaires. Il ne peut être lancé que par un personnage d'alignement mauvais.~ +%atsymbol%319=~Flétrissement~ +%atsymbol%318=~Cantique +(Conjuration/Convocation) +Niveau : 2 +Sphère : Combat +Portée : champ visuel du lanceur +Durée : 1 tour +Temps d'incantation : 9 +Zone d'effet : rayon de 18 mètres +Jet de sauvegarde : aucun +Avec le sort de Cantique, le prêtre attire une faveur spéciale sur lui-même et sur son groupe, et inflige des dégâts à ses ennemis. Au terme de l'incantation, tous les jets d'attaque et de sauvegarde, ainsi que les dégâts minimum effectués par les alliés du prêtre situés dans la zone d'effet reçoivent un bonus de +1. En outre, tous les dommages infligés par les adversaires, à l'exception des dégâts de base des armes, diminuent d'une face de dé. Par exemple, une boule de feu de 6d6 dégâts de feu n'en infligera que 6d5, et une épée longue infligeant 1d8 +2 dégâts, +1d3 dégâts de feu n'en infligera que 1d8 +2, +1d2 dégâts de feu. Les ennemis du prêtre souffrent des effets opposés. +Les cantiques multiples ne sont pas cumulatifs. Le sort requiert une certaine concentration de la part du prêtre, qui est incapable de faire appel à sa magie et dont la vitesse de déplacement est réduite de moitié.~ +%atsymbol%317=~Cantique~ +%atsymbol%316=~Pommade anti-scarabées bombardiers +Do not translate~ +%atsymbol%315=~Scarabée scolyte~ +%atsymbol%314=~Scarabée scolyte~ +%atsymbol%313=~Scarabée bombardier~ +%atsymbol%312=~Scarabée bombardier~ +%atsymbol%311=~Insecte géant +(Transmutation) +Niveau : 4 +Sphère : Faune +Portée : champ visuel du lanceur +Durée : 8 heures +Temps d'incantation : 7 +Zone d'effet : spéciale +Jet de sauvegarde : aucun +Ce sort invoque 2 ou 3 scarabées scolytes ou scarabées bombardiers. Les insectes seront aux ordres du lanceur jusqu'à leur mort ou l'expiration de la durée du sort.~ +%atsymbol%310=~Insecte géant~ +%atsymbol%309=~Blessure critique +(Nécromancie) +Niveau : 5 +Sphère : Guérison +Portée : contact +Durée : instantanée +Temps d'incantation : 8 +Zone d'effet : 1 créature +Jet de sauvegarde : demi-dégâts +En lançant ce sort, le personnage peut, en touchant la créature ciblée, lui infliger 27 points de dégâts (jet de sauvegarde contre les sorts pour demi-dégâts). Ce sort reste sans effet sur les morts-vivants, les créatures artificielles ou extra-planaires. Il ne peut être lancé que par des personnages d'alignement mauvais.~ +%atsymbol%308=~Blessure critique~ +%atsymbol%307=~Blessure grave +(Nécromancie) +Niveau : 4 +Sphère : Guérison +Portée : contact +Durée : instantanée +Temps d'incantation : 5 +Zone d'effet : 1 créature +Jet de sauvegarde : demi-dégâts +En lançant ce sort, le personnage peut, en touchant la créature ciblée, lui infliger 17 points de dégâts (jet de sauvegarde contre les sorts pour demi-dégâts). Ce sort reste sans effet sur les morts-vivants, les créatures artificielles ou extra-planaires. Il ne peut être lancé par des personnages d'alignement bons.~ +%atsymbol%306=~Blessure grave~ +%atsymbol%305=~Deux niveaux absorbés~ +%atsymbol%304=~Drain d'énergie +(Nécromancie) +Niveau : 7 +Sphère : Nécromancie +Portée : contact +Durée : permanente +Temps d'incantation : 3 +Zone d'effet : 1 créature +Jet de sauvegarde : aucun +Ce sort permet de transformer le lanceur en un conduit d'énergie entre son plan et le Plan de l'Énergie Négative. En touchant une créature, le personnage aspire son essence vitale en direction du Plan de l'Énergie Négative, lui drainant 2 niveaux d'expérience. La cible perd ainsi des niveaux, des points de vie et des capacités de manière permanente. Ces niveaux ne peuvent être restaurés que par le sort de clerc de Restauration. Ce sort reste sans effet contre les morts-vivants, les créatures artificielles et extra-planaires. Il ne peut être lancé que par un personnage d'alignement mauvais.~ +%atsymbol%303=~Absorption d'énergie~ +%atsymbol%302=~Enchevêtré(e)~ +%atsymbol%301=~Tertre errant.~ +%atsymbol%300=~Tertre errant.~ +%atsymbol%299=~Traqueur +(Conjuration) +Niveau : 7 +Sphère : Flore +Portée : champ visuel du lanceur +Durée : 8 heures +Temps d'incantation : 9 +Zone d'effet : spéciale +Jet de sauvegarde : aucun +Ce sort fait apparaître 11 DV de tertres errants, qui servent fidèlement le personnage, soit au combat, soit en lui rendant les services dont ils sont capables de se charger.~ +%atsymbol%298=~Traqueur~ +%atsymbol%297=~Brume d'Eldath +(Évocation) +Niveau : 7 +Sphère : Élémentaire +Portée : champ visuel du lanceur +Durée : instantanée +Temps d'incantation : 9 +Zone d'effet : 2,10 mètres de rayon +Jet de sauvegarde : aucun +Une brume bleutée parée de reflets d'argent baigne la zone d'effet. Elle soigne toutes les maladies, vient à bout de tous les empoisonnements et rend 25 points de vie à chaque créature qu'elle enveloppe.~ +%atsymbol%296=~Brume d'Eldath~ +%atsymbol%295=~Bouclier suprême de Lathandre +(Conjuration) +Niveau : 7 +Sphère : Garde +Portée : contact +Durée : 3 rounds +Temps d'incantation : 9 +Zone d'effet : 1 créature +Jet de sauvegarde : aucun +Le sujet bénéficie d'une résistance à la magie de 100 % et d'une immunité totale contre les dégâts jusqu'au terme de la durée indiquée. Bouclier suprême de Lathandre ne peut protéger une créature d'alignement mauvais. Seul un personnage d'alignement bon peut lancer ce sort.~ +%atsymbol%294=~Bouclier suprême de Lathandre~ +%atsymbol%293=~Destruction +(Nécromancie) +Niveau : 7 +Sphère : Guérison +Portée : contact +Durée : instantanée +Temps d'incantation : 9 +Zone d'effet : le lanceur +Jet de sauvegarde : spécial +Ce sort détruit la cible et la fait tomber en débris. La victime a droit à un jet de sauvegarde contre la mort magique, à -4. En cas de succès, elle n'est pas détruite mais perd 8d6 points de vie. Ce sort ne peut être lancé que par les personnages d'alignement mauvais. À noter qu'un individu tué par Destruction ne peut être ramené à la vie grâce à Rappel à la vie ou Résurrection.~ +%atsymbol%292=~Destruction~ +%atsymbol%291=~Sort inefficace~ +%atsymbol%290=~Citadelle de l'âme +(Abjuration) +Niveau : 7 +Sphère : Protection +Portée : personnelle +Durée : 1 tour par niveau +Temps d'incantation : 9 +Zone d'effet : le lanceur +Jet de sauvegarde : aucun +Ce sort immunise l'esprit du prêtre contre toute influence extérieure. Tant que le sort fait effet, le personnage est immunisé aux effets de charme, confusion, terreur, débilité mentale, immobilisation, sommeil, sort de Labyrinthe et ébriété.~ +%atsymbol%289=~Citadelle de l'âme~ +%atsymbol%288=~Symbole : désespoir +(Conjuration/Convocation) +Niveau : 7 +Sphère : Garde +Portée : champ visuel du lanceur +Durée : 2 tours +Temps d'incantation : 3 +Zone d'effet : 4,50 mètres de rayon +Jet de sauvegarde : annule +Ce puissant enchantement permet au prêtre d'inscrire, à même le sol ou sur toute autre surface, un symbole qui y reste jusqu'à ce que quelqu'un approche. À ce moment, le symbole explose et toutes les créatures comprises dans la zone d'effet doivent réussir un jet de sauvegarde contre les sorts avec une pénalité de -2 sous peine de rester immobiles, tellement dépitées et découragées qu'elles ne se défendent même pas lorsqu'on les attaque. Ce sort dissipe l'influence d'Émotion, espoir dans la zone d'effet au moment de son lancement.~ +%atsymbol%287=~Symbole : désespoir~ +%atsymbol%286=~Douleurs atroces~ +%atsymbol%285=~Symbole, douleur +(Conjuration/Convocation) +Niveau : 7 +Sphère : Garde +Portée : champ visuel du lanceur +Durée : 11 tours +Temps d'incantation : 3 +Zone d'effet : 4,50 mètres de rayon +Jet de sauvegarde : annule +Toutes les créatures situées à moins de 4,50 mètres du symbole doivent effectuer un jet de sauvegarde contre les sorts. En cas d'échec, la douleur qu'elles ressentent se traduit par -4 aux jets d'attaque et -2 en Dextérité et à la CA.~ +%atsymbol%284=~Symbole : douleur~ +%atsymbol%283=~Courroux spirituel +(Évocation) +Niveau : 6 +Sphère : Combat +Portée : champ visuel du lanceur +Durée : instantanée +Temps d'incantation : 2 +Zone d'effet : spéciale +Jet de sauvegarde : demi-dégâts +Au terme de l'incantation, le prêtre canalise l'énergie spirituelle pour la libérer sous forme d'éclairs dans quatre directions. Le personnage en choisit une, les autres éclairs partant à angle droit du premier (en forme de croix). Toute créature touchée par un éclair subit 4d10 points de dégâts, total réduit de moitié en cas de jet de sauvegarde réussi. Les créatures ayant la même composante morale d'alignement que le lanceur (bien, mal ou neutralité) ne sont pas affectées.~ +%atsymbol%282=~Courroux spirituel~ +%atsymbol%281=~Tourbillon +(Évocation) +Niveau : 6 +Sphère : Élémentaire (air) +Portée : champ visuel du lanceur +Durée : spéciale +Temps d'incantation : 9 +Zone d'effet : spéciale +Jet de sauvegarde : spécial +Ce sort génère un petit tourbillon à proximité du personnage, lequel peut l'envoyer en n'importe quel point de son champ de vision. Une fois que le cyclone atteint sa destination, le prêtre peut cesser de le contrôler et le tourbillon se déplace alors au hasard, affectant toutes les créatures qu'il touche. Le personnage est immunisé contre l'effet du sort, de même que les élémentaux et les créatures énormes ou plus. Toute autre créature prise dans le tourbillon subit 2d8 points de dégâts contondant et 2d8 points de dégâts tranchants. Elle doit également réussir un jet de sauvegarde contre les souffles pour ne pas être étourdie pendant 2 rounds. Les créatures de 2 DV ou moins sont automatiquement tuées par ce sort. Le tourbillon peut affecter un maximum de 8 cibles, après quoi il se dissipe.~ +%atsymbol%280=~Tourbillon~ +%atsymbol%279=~Bouclier entropique +(Abjuration) +Niveau : 6 +Sphère : Protection +Portée : personnelle +Durée : 1 round par niveau +Temps d'incantation : 9 +Zone d'effet : le lanceur +Jet de sauvegarde : aucun +Ce sort entoure le prêtre d'une aura d'énergie stoppant ou détournant la plupart des attaques. Elle confère un bonus de +6 à la CA et 50 % de résistance à la magie contre la plupart des attaques (feu, froid, électricité, etc.). Enfin, le prêtre bénéficie d'un bonus de +2 à tous ses jets de sauvegarde, tout en étant immunisé contre les projectiles.~ +%atsymbol%278=~Bouclier entropique~ +%atsymbol%277=~Blessure légère de masse +(Nécromancie) +Niveau : 5 +Sphère : Guérison +Portée : personnelle +Durée : instantanée +Temps d'incantation : 5 +Zone d'effet : rayon de 4,50 mètres +Jet de sauvegarde : demi-dégâts +Avec ce sort, le lanceur inflige 1d8 dégâts, +1 point de dégât par niveau aux adversaires à proximité. Un jet de sauvegarde contre les sorts permet de diviser les dégâts par 2. Ce sort reste sans effet contre les morts-vivants, les créatures artificielles et extra-planaires. Ce sort ne peut être lancé que par des personnages d'alignement mauvais.~ +%atsymbol%276=~Blessure légère de masse~ +%atsymbol%275=~Rage animale +(Enchantement) +Niveau : 5 +Sphère : Combat +Portée : contact +Durée : 15 rounds +Temps d'incantation : 8 +Zone d'effet : 1 créature +Jet de sauvegarde : aucun +Ce sort confère au sujet la férocité d'une bête sauvage, ce qui se traduit par les avantages suivants : 19 en force, +20 points de vie, +20 % en vitesse de déplacement et +2 à tous les jets de sauvegarde. Par contre, le sujet ne peut jeter le moindre sort tant que Rage animale fait effet. Il peut être contrôlé normalement, sauf s'il aperçoit le moindre ennemi, auquel cas il se rue sur lui en utilisant toutes les armes possibles et imaginables. Chaque round, il y a 5 % de chances que le personnage devienne totalement enragé et attaque tout le monde, amis comme ennemis.~ +%atsymbol%274=~Rage animale~ +%atsymbol%273=~Vigilance contre les morts-vivants +(Nécromancie) +Niveau : 5 +Sphère : Glyphes +Portée : personelle +Durée : 1 tour +Temps d'incantation : 7 +Zone d'effet : 3 mètres de rayon +Jet de sauvegarde : aucun +Ce sort amplifie l'influence que le prêtre a sur les morts-vivants, mais il est lié à la zone autour du prêtre au moment du lancement. Tout mort-vivant pénétrant dans la zone d'effet est automatiquement affecté comme si le prêtre venait d'essayer de le repousser. En cas d'échec, le mort-vivant est immunisé contre le sort, sauf s'il quitte la zone d'effet pour y revenir par la suite.~ +%atsymbol%272=~Vigilance contre les morts-vivants~ +%atsymbol%271=~Bouclier de Lathandre +(Conjuration) +Niveau : 5 +Sphère : Garde +Portée : contact +Durée : 2 rounds +Temps d'incantation : 8 +Zone d'effet : 1 créature +Jet de sauvegarde : aucun +Le sujet est immunisé contre les dégâts jusqu'au terme de la durée indiquée. Bouclier de Lathandre ne peut protéger une créature d'alignement mauvais. Seul un personnage d'alignement non-mauvais peut lancer ce sort.~ +%atsymbol%270=~Bouclier de Lathandre~ +%atsymbol%269=~Pierres acérées +(Transmutation, Enchantement) +Niveau : 5 +Sphère : Élémentaire (terre) +Portée : champ visuel du lanceur +Durée : 12 rounds +Temps d'incantation : 6 +Zone d'effet : 2,40 mètres de rayon +Jet de sauvegarde : spécial +Ce sort déforme la roche pour faire apparaître des pointes camouflées et invisibles. Toute créature pénétrant dans la zone d'effet perd 2d4 points de vie par round et doit réussir un jet de sauvegarde contre les sorts ou voir sa vitesse de déplacement diminuer de 30%.~ +%atsymbol%268=~Pierres acérées~ +%atsymbol%267=~Juste courroux des fidèles +(Enchantement/Charme) +Niveau : 5 +Sphère : Combat +Portée : personnelle +Durée : 1 round par niveau +Temps d'incantation : 8 +Zone d'effet : 5,10 mètres de rayon +Jet de sauvegarde : aucun +Ce sort confère une sorte de folie divine aux alliés du prêtre, ce qui améliore leurs facultés martiales. Tous les compagnons du prêtre se trouvant dans la zone d'effet bénéficient d'un bonus de +1 aux jets d'attaque et de sauvegarde, tout en gagnant 8 points de vie supplémentaires (pouvant leur permettre de dépasser temporairement leur maximum de points de vie). Cependant, s'ils ont le même alignement que le prêtre, ils gagnent une attaque supplémentaire par round (qui annule Hâte), un bonus de +2 aux jets d'attaque, de dégâts et de sauvegarde, ainsi qu'une immunité aux sorts de charme et d'immobilisation. Les bénéficiaires du sort seront sujets à la fatigue une fois que l'enchantement prend fin.~ +%atsymbol%266=~Juste courroux des fidèles~ +%atsymbol%265=~Mur de lune +(Évocation) +Niveau : 4 +Sphère : Protection, Soleil +Portée : champ visuel du lanceur +Durée : 1 tour +Temps d'incantation : 7 +Zone d'effet : mur de 2,40 mètres de long sur 60 centimètres d'épaisseur +Jet de sauvegarde : aucun +Ce sort fait apparaître un mur luisant d'énergie blanc-bleu. Il est intangible et n'a pas besoin d'être ancré à des points fixes. On peut passer librement au travers, mais les créatures d'alignement mauvais qui s'y risquent subissent 2d10 points de dégâts (5d10 pour les morts-vivants d'alignement mauvais). Une créature blessée par le mur ne peut être affectée une seconde fois, même si elle le retraverse. Plusieurs Murs de lune ne peuvent fonctionner en même temps.~ +%atsymbol%264=~Mur de lune~ +%atsymbol%263=~Projection d'épines +(Transmutation) +Niveau : 4 +Sphère : Flore +Portée : 9 mètres +Durée : instantanée +Temps d'incantation : 3 +Zone d'effet : cône de 5,10 mètres de long et de 90 degrés d'angle +Jet de sauvegarde : demi-dégâts +Par le biais de ce sort, le lanceur fait jaillir une gerbe d'épines, pics, barbillons et pointes de sa main. Les projectiles couvrent une zone conique de 5,10 mètres de long et de 90 degrés d'angle. Ils infligent 2d10 points de dégâts perforants à toutes les créatures dans la zone d'effet, ou 1d10 en cas de jet de sauvegarde réussi contre la mort.~ +%atsymbol%262=~Projection d'épines~ +%atsymbol%261=~Inconscient~ +%atsymbol%260=~Vague destructrice +(Évocation) +Niveau : 4 +Sphère : Élémentaire (eau) +Portée : 30 mètres +Durée : instantanée +Temps d'incantation : 1 round +Zone d'effet : spéciale +Jet de sauvegarde : spécial +Le sort appelle une vague d'eau qui se dirige dans la direction déterminée par le personnage, occasionnant de terribles ravages sur son passage. Toute créature touchée subit 4d10 points de dégâts contondants et a 25 % de chances de se retrouver étourdie pour 2 rounds, ainsi que 5 % de chances de perdre connaissance. En cas de jet de sauvegarde réussi contre les souffles, les dégâts sont réduits de moitié et il n'y a aucun risque d'étourdissement ou de perte de connaissance.~ +%atsymbol%259=~Vague destructrice~ +%atsymbol%258=~Masse d'armes météorique~ +%atsymbol%257=~Masse d'armes météorique~ +%atsymbol%256=~Masse d'armes météorique +(Conjuration) +Niveau : 4 +Sphère : Combat +Portée : personnelle +Durée : 3 tours +Temps d'incantation : 7 +Zone d'effet : le lanceur +Jet de sauvegarde : aucun +Ce sort crée une masse d'armes en fer météorique infligeant 1d6 +2 dégâts contondants, bénéficiant d'un bonus de +2 à l'attaque et considérée comme une arme +4 afin de déterminer ce qu'elle peut toucher. Tous les bonus habituels s'appliquent normalement (Force, compétence et spécialisation). La masse inflige 2d6 points de dégâts contondants supplémentaires aux créatures qui ne sont pas d'origine naturelle (morts-vivants, élémentaux, golems, entités extra-planaires, etc.)~ +%atsymbol%255=~Masse d'armes météorique~ +%atsymbol%254=~Endurance infaillible +(Nécromancie) +Niveau : 4 +Sphère : Nécromancie +Portée : contact +Durée : instantanée +Temps d'incantation : 9 +Zone d'effet : 1 créature +Jet de sauvegarde : aucun +Ce sort permet à la créature touchée de recouvrer les forces perdues au cours des 36 dernières heures (par une succession d'efforts physiques). Notez qu'il n'est pas forcément suffisant pour sortir d'un état fatigué.~ +%atsymbol%253=~Endurance infaillible~ +%atsymbol%252=~Nuage de pestilence +(Transmutation) +Niveau : 4 +Sphère : Combat, Élémentaire (air) +Portée : champ visuel du lanceur +Durée : 4 rounds +Temps d'incantation : 7 +Zone d'effet : 3,60 mètres de rayon +Jet de sauvegarde : annule +Ce sort transforme l'air en brume gris-vert nauséabonde à 3,60 mètres à la ronde. Le lanceur est immunisé contre l'effet des vapeurs, de même que les créatures qui ne respirent pas. A chaque round d'exposition à l'air infesté de maladies, une créature doit réussir un jet de sauvegarde contre les souffles sous peine de subir 3 points de dégâts magiques, d'être aveuglée et de perdre 3 points de Force et de Dextérité. La cécité et la perte de point de caractéristiques durent 1 tour. Nuage de pestilence ne peut être lancé que par les personnages mauvais.~ +%atsymbol%251=~Nuage de pestilence~ +%atsymbol%250=~Étourdir~ +%atsymbol%249=~Guéri(e)~ +%atsymbol%248=~Rage sanguinaire +(Transmutation) +Niveau : 4 +Sphère : Combat +Portée : champ visuel du lanceur +Durée : 2 tours +Temps d'incantation : 7 +Zone d'effet : 1 créature +Jet de sauvegarde : aucun +Ce sort ne fonctionne que sur les personnages et leurs alliés. Le sujet est aussitôt pris d'une rage meurtrière : il s'acharne sur la créature la plus proche jusqu'à la tuer, puis passe à la suivante. Sous l'emprise de ce sort, le sujet est immunisé contre l'étourdissement et les effets de type Charme, Sommeil, Terreur, Immobilisation, Confusion, Émotion et Symbole. De plus, il gagne +2 à l'attaque, +3 aux dégâts, +2 en force, 10 points de vie et un bonus à sa vitesse de déplacement. Cela étant, le sort présente également certains inconvénients : les points de vie du sujet sont masqués jusqu'au terme de la durée indiquée et il ne peut bénéficier d'aucun effet permettant de récupérer des points de vie. Quand le sort s'achève, le personnage se sent pris d'une grande fatigue et tombe à 3 de Force pendant 2 tours. Les créatures d'alignement loyal ne peuvent ni avoir recours à Rage sanguinaire, ni être affecté par ce sort.~ +%atsymbol%247=~Rage sanguinaire~ +%atsymbol%246=~Récitation +(Abjuration, Invocation/Évocation) +Niveau : 4 +Sphère : Combat +Portée : personnelle +Durée : 1 round par niveau +Temps d'incantation : 7 +Zone d'effet : rayon de 7,50 mètres +Jet de sauvegarde : aucun +En récitant un passage de texte sacré, le prêtre invoque la bénédiction de son dieu sur lui-même et ses alliés, tout en affaiblissant ses ennemis et en semant la confusion dans leurs rangs. Les compagnons du prêtre bénéficient d'un bonus de +2 à leurs jets d'attaque et de sauvegarde, tandis que ses adversaires subissent une pénalité de -2. Ce sort n'annule pas Prière ; tous deux peuvent être jetés en même temps, auquel cas leurs effets se cumulent.~ +%atsymbol%245=~Récitation~ +%atsymbol%244=~Décharge d'électricité statique~ +%atsymbol%243=~Électricité statique +(Transmutation) +Niveau : 4 +Sphère : Climat +Portée : personnelle +Durée : 1 tour par niveau +Temps d'incantation : 9 +Zone d'effet : champ visuel du lanceur +Jet de sauvegarde : demi-dégâts +Électricité statique est similaire à Appel de la foudre, si ce n'est qu'il est possible de l'utiliser en intérieur. Le sort permet de générer une charge d'électricité statique dans la zone d'effet, ce qui inflige 2d8 points de dégâts plus 1d8 par niveau du prêtre. La charge se déclenche une fois par tour jusqu'à ce que le sort arrive à son terme.~ +%atsymbol%242=~Électricité statique~ +%atsymbol%241=~Flammes +(Transmutation) +Niveau : 4 +Sphère : Élémentaire (feu) +Portée : champ visuel du lanceur +Durée : 1 round +Temps d'incantation : 7 +Zone d'effet : rayon de 1,20 mètre +Jet de sauvegarde : aucun +Ce sort fait apparaître des flammes causant 1d4 points de dégâts plus 1 point par niveau du prêtre à toutes les créatures comprises dans la zone d'effet. Les créatures subiront les dommages une fois par round quel que soit le moment où elles sont entrées dans la zone d'effet.~ +%atsymbol%240=~Flammes~ +%atsymbol%239=~Faveur d'Ilmater +(Nécromancie) +Niveau : 3 +Sphère : Nécromancie, Protection +Portée : 9 mètres +Durée : instantanée +Temps d'incantation : 6 +Zone d'effet : 1 créature +Jet de sauvegarde : aucun +En lançant ce sort, le personnage échange sa force de vie avec celle de la cible, ce qui échange également leurs blessures physiques. Ce sort fonctionnera uniquement si le lanceur dispose de plus de points de vie que la cible. L'échange est permanent, et le lanceur peut soigner les blessures acquises avec les méthodes habituelles. L'échange peut être fait à distance, dans la limite de la portée du sort. Seuls les points de vie sont échangés, le lanceur ne peut pas "prendre" à la cible d'autres types de dommages, tels que le poison, la maladie, l'ébriété, etc. Ce sort reste sans effet sur les morts-vivants, les créatures artificielles et extra-planaires. Il ne peut être lancé par un personnage d'alignement mauvais.~ +%atsymbol%238=~Faveur d'Ilmater~ +%atsymbol%237=~Blessure moyenne +(Nécromancie) +Niveau : 3 +Sphère : Guérison +Portée : contact +Durée : instantanée +Temps d'incantation : 5 +Zone d'effet : 1 créature +Jet de sauvegarde : demi-dégâts +En lançant ce sort, le personnage peut, en touchant la créature ciblée, lui infliger 14 points de dégâts (jet de sauvegarde contre les sorts pour demi-dégâts). Ce sort reste sans effet sur les morts-vivants, les créatures artificielles et extra-planaires. Il ne peut être lancé par des personnages d'alignement bons.~ +%atsymbol%236=~Blessure moyenne~ +%atsymbol%235=~Protection anti-tempêtes +(Abjuration) +Niveau : 3 +Sphère : Climat, Protection +Portée : personnelle +Durée : 1 tour +Temps d'incantation : 6 +Zone d'effet : le lanceur +Jet de sauvegarde : aucun +Le personnage se retrouve entouré d'une sphère d'énergie noire qui se déplace avec lui. Toutes les attaques de type feu, froid ou électricité lui infligent automatiquement des dégâts réduits de moitié.~ +%atsymbol%234=~Protection anti-tempête~ +%atsymbol%233=~Moisissure +(Transmutation) +Niveau : 3 +Sphère : Flore +Portée : contact +Durée : spéciale +Temps d'incantation : 6 +Zone d'effet : rayon de 3 mètres +Jet de sauvegarde : spécial +Ce sort couvre rapidement la créature touchée par le lanceur d'une moisissure brune à même sa peau. La créature infectée a droit à un jet de sauvegarde contre les sorts. En cas d'échec, l'infection est sévère et les dégâts subis sont les suivants : +1er round : 4d6 points +2e round : 3d6 points +3e round : 2d6 points +4e round : 1d6 points +Si le jet de sauvegarde est réussi, les dégâts sont moins importants : +1er round : 2d6 points +2e round : 1d6 points +3e round : 1d6 points +Chaque round après le premier, la plus proche créature (dans un rayon de 3 mètres) doit réussir un jet de sauvegarde sous peine d'être affectée à son tour. Le processus se poursuit jusqu'à ce que la moisissure soit incapable d'infecter un nouvel hôte dans le temps imparti. Les créatures déjà affectées ne peuvent l'être une nouvelle fois. La moisissure brune meurt rapidement au terme de la durée du sort.~ +%atsymbol%232=~Moisissure~ +%atsymbol%231=~Trombes d'eau +(Évocation) +Niveau : 3 +Sphère : Élémentaire (eau) +Portée : champ visuel du lanceur +Durée : 2 rounds +Temps d'incantation : 6 +Zone d'effet : 5,10 mètres de rayon +Jet de sauvegarde : aucun +Ce sort génère une pluie diluvienne dans la zone d'effet. Toutes les créatures à base de feu ou de froid (ou vivant dans ces éléments) perdent 2d3 points de vie par round. De plus, toutes les créatures comprises dans la zone d'effet ont 50 % de chances par round d'être frappées par la foudre (2d6 points de dégâts, ou deux fois moins en cas de jet de sauvegarde réussi). Les sorts de Lame de feu et de Linceul de flammes, ainsi que l'aura des salamandres, sont éteints par Trombes d'eau.~ +%atsymbol%230=~Trombes d'eau~ +%atsymbol%229=~Croissance d'épines +(Transmutation) +Niveau : 3 +Sphère : Élémentaire (terre) +Portée : champ visuel du lanceur +Durée : 1 tour +Temps d'incantation : 6 +Zone d'effet : 4,50 mètres de rayon +Jet de sauvegarde : aucun +Ce sort transforme la végétation affectée en plantes épineuses. Toute créature pénétrant dans la zone d'effet subit 1d4 points de dégâts tranchants et 1d4 points de dégâts perforants par round, jusqu'au terme du sort.~ +%atsymbol%228=~Croissance d'épines~ +%atsymbol%227=~Cercle d'ossements +(Nécromancie) +Niveau : 3 +Sphère : Création, Garde +Portée : personnelle +Durée : 3 rounds +Temps d'incantation : 3 +Zone d'effet : 1 mètre de rayon +Jet de sauvegarde : aucun +Ce sort fait apparaître une barrière d'ossements flottants qui tourbillonnent rapidement autour du personnage. Quiconque tente de la franchir subit 1d6 points de dégâts contondants et 1d6 points de dégâts tranchants par round. Le personnage ne peut pas se déplacer tant que le sort fait effet. Cercle d'ossements ne peut être lancé par les personnages d'alignement bon.~ +%atsymbol%226=~Cercle d'ossements~ +%atsymbol%225=~Lame de lune +3~ +%atsymbol%224=~Lame de lune~ +%atsymbol%223=~Lame de lune +(Invocation) +Niveau : 3 +Sphère : Combat, Soleil +Portée : personnelle +Durée : 2 tours +Temps d'incantation : 6 +Zone d'effet : le lanceur +Jet de sauvegarde : aucun +Ce sort fait apparaître une épée silencieuse entièrement constituée de clarté lunaire et s'étendant à 1,20 mètre de la main du personnage. Elle est considérée comme une arme +4 afin de déterminer ce qu'elle peut toucher, même si ce bonus ne s'applique pas au TAC0. Comme il s'agit d'une arme dénuée de substance, les bonus de Force du personnage ne s'appliquent ni à l'attaque ni aux dégâts. +La lame de lune absorbe l'énergie de la cible, ce qui se traduit par un total de 1d12 +4 points de dégâts à chaque coup, +1d12 points pour les morts-vivants, qui sont particulièrement vulnérables à ce sort. De plus, la lame a une action négative sur le flux des énergies magiques, avec pour conséquence que tout sort que la cible cherche à lancer lors du prochain round échoue automatiquement.~ +%atsymbol%222=~Lame de lune~ +%atsymbol%221=~Sommeil~ +%atsymbol%220=~Exaltation +(Abjuration) +Niveau : 3 +Sphère : Guérison +Portée : contact +Durée : 1 tour +Temps d'incantation : 9 +Zone d'effet : 1 créature +Jet de sauvegarde : aucun +Ce sort permet au prêtre d'aider et de protéger un compagnon (mais pas lui-même). D'un simple contact, le prêtre fait disparaître les effets de la peur, de la fatigue, de la débilité, de l'inconscience, de l'ébriété, de la confusion et de la rage sanguinaire. De plus, le sujet est protégé contre les sorts et attaques provoquant ces effets jusqu'au terme de la durée indiquée.~ +%atsymbol%219=~Exaltation~ +%atsymbol%218=~Contagion +(Nécromancie) +Niveau : 3 +Sphère : Guérison +Portée : contact +Durée : 8 heures +Temps d'incantation : 9 +Zone d'effet : 1 créature +Jet de sauvegarde : annule +La créature touchée par le prêtre contracte une maladie qui lui fait perdre 5d4 points de Force si elle rate son jet de sauvegarde contre les sorts. Contagion reste sans effet sur les morts-vivants, créatures artificielles et créatures extra-planaires. Ce sort ne peut être jeté par les personnages d'alignement bon.~ +%atsymbol%217=~Contamination~ +%atsymbol%216=~Pénalités de combat~ +%atsymbol%215=~Bonus de combat~ +%atsymbol%214=~Prière +(Conjuration/Convocation) +Niveau : 3 +Sphère : Combat +Portée : personnelle +Durée : 1 round par niveau +Temps d'incantation : 6 +Zone d'effet : 9 mètres de rayon +Jet de sauvegarde : aucun +Prière favorise le prêtre et ses alliés, tout en maudissant leurs ennemis. Tous les jets d'attaque, de dégâts et de sauvegarde des compagnons du prêtre bénéficient d'un bonus de +1, tandis que ses adversaires subissent un malus de -1. Les créatures comprises dans la zone d'effet au moment où le sort est lancé continuent d'être affectées même si elles la quittent. Autrement dit, si le guerrier du groupe décide de poursuivre un gobelin, Prière l'aide toujours.~ +%atsymbol%213=~Prière~ +%atsymbol%212=~Blessure modérée +(Nécromancie) +Niveau : 2 +Sphère : Guérison +Portée : contact +Durée : instantanée +Temps d'incantation : 5 +Zone d'effet : 1 créature +Jet de sauvegarde : demi-dégâts +En lançant ce sort, le personnage peut, en touchant la créature ciblée, lui infliger 11 points de dégâts (jet de sauvegarde contre les sorts pour demi-dégâts). Ce sort reste sans effet sur les morts-vivants, les créatures artificielles et extra-planaires. Il ne peut être lancé par des personnages d'alignement bons.~ +%atsymbol%211=~Blessure modérée~ +%atsymbol%210=~Griffes~ +%atsymbol%209=~Griffes~ +%atsymbol%208=~Griffes +(Transmutation) +Niveau : 2 +Sphère : Combat +Portée : personnelle +Durée : 1 tour +Temps d'incantation : 5 +Zone d'effet : le lanceur +Jet de sauvegarde : aucun +Ce sort transforme les bras du personnage en pattes musclées et dotées de griffes, qui lui confèrent une Force de 18/72 et la faculté de lacérer ses adversaires (2d4 points de dégâts + bonus de Force). Le personnage peut frapper deux fois par round, avec un bonus de +2 à l'attaque.~ +%atsymbol%207=~Griffes~ +%atsymbol%206=~Entouré d'une aura argentée (-2 à la CA)~ +%atsymbol%205=~Lance d'alicorne +(Évocation) +Niveau : 2 +Sphère : Combat +Portée : champ visuel du lanceur +Durée : instantanée +Temps d'incantation : 5 +Zone d'effet : 1 créature +Jet de sauvegarde : spécial +Ce sort fait apparaître une lance argentée et partiellement éthérée en forme d'alicorne (une corne de licorne). Le personnage choisit sa cible, qui va aussitôt la transpercer, lui infligeant 3d6 points de dégâts perforants (ou deux fois moins en cas de jet de sauvegarde réussi). Même si la lance se dissipe instantanément après l'impact, elle laisse une aura argentée autour de la cible, rendant celle-ci plus facile à toucher (-2 à la CA pendant 3 rounds).~ +%atsymbol%204=~Lance d'alicorne~ +%atsymbol%203=~Guéri(e)~ +%atsymbol%202=~Soin des blessures modérées +(Nécromancie) +Niveau : 2 +Sphère : Guérison +Portée : contact +Durée : instantanée +Temps d'incantation : 5 +Zone d'effet : 1 créature +Jet de sauvegarde : aucun +Cette version plus puissante de Soin des blessures légères permet à la créature touchée de récupérer 11 points de vie et de soigner l'ébriété. Ce sort reste sans effet sur les morts-vivants, les créatures artificielles ou extra-planaires.~ +%atsymbol%201=~Soin des blessures modérées~ +%atsymbol%200=~Aveuglé(e)~ +%atsymbol%199=~Soleil ardent +(Évocation) +Niveau : 1 +Sphère : Soleil +Portée : champ visuel du lanceur +Durée : instantanée +Temps d'incantation : 4 +Zone d'effet : 1 créature +Jet de sauvegarde : demi-dégâts +Au terme de l'incantation, un rayon de soleil tombe du ciel et va frapper la cible désignée par le prêtre. La victime réduit les dégâts de moitié si elle réussit un jet de sauvegarde contre les sorts. Si elle est touchée, elle subit 1d6 points de dégâts, +1 par niveau du prêtre. Les morts-vivants et autres créatures vulnérables à la lumière du jour encaissent 1d6 points de dégâts, +2 par niveau du personnage. De plus, victimes sont aveuglées pendant 3 rounds.~ +%atsymbol%198=~Soleil ardent~ +%atsymbol%197=~Blessure légère +(Nécromancie) +Niveau : 1 +Sphère : Guérison +Portée : contact +Durée : instantanée +Temps d'incantation : 5 +Zone d'effet : 1 créature +Jet de sauvegarde : demi-dégâts +Une fois qu'il a lancé ce sort, le prêtre inflige 8 points de dégâts à la première créature qu'il touche (4 points en cas de jet de sauvegarde réussi). Ce sort reste sans effet sur les morts-vivants, les créatures artificielles ou extra-planaires. Il ne peut être lancé par un personnage d'alignement bon.~ +%atsymbol%196=~Blessure légère~ +%atsymbol%195=~Maudit(e)~ +%atsymbol%194=~Imprécation +(Conjuration/Convocation) +Niveau : 1 +Sphère : Générale +Portée : champ visuel du lanceur +Durée : 6 rounds +Temps d'incantation : 1 round +Zone d'effet : rayon de 4,50 mètres +Jet de sauvegarde : aucun +Grâce à ce sort, le prêtre diminue le moral de ses adversaires et pénalise de -1 leurs jets de sauvegarde et d'attaque. Dès que l'incantation s'achève, le sort affecte toutes les créatures se trouvant dans un rayon de 4,50 mètres, dont le centre est choisi par le prêtre (les créatures quittant la zone d'effet sont toujours affectées ; par contre, celles qui y entrent par la suite ne le sont pas).~ +%atsymbol%193=~Imprécation~ +%atsymbol%192=~Å’il de la pierre +Cet Å“il protège le personnage contre une seule attaque pétrifiante. +Il peut également être dépensé pour lancer le sort de magicien de troisième niveau : Immobilisation des personnes, qui immobilise des créatures humanoïdes pendant un round par niveau (jet de sauvegarde contre les sorts pour annuler).~ +%atsymbol%191=~Å’il de la pierre~ +%atsymbol%190=~Å’il de l'âme +Cet Å“il annule un sort causant une mort instantanée (Sort de mort, Doigt de mort, Mot de pouvoir mortel, Mise à mort ou Destruction). +Il peut également être transformé en un Rayon débilitant, similaire au sort de magicien de deuxième niveau, qui abaisse la force de la cible à 5 (jet de sauvegarde contre les sorts pour annuler).~ +%atsymbol%189=~Å’il de l'âme~ +%atsymbol%188=~Å’il de la résistance +Cet Å“il bloque une attaque étourdissante, assourdissante, aveuglante ou de type silence. +Il peut également être dépensé pour lancer le sort de magicien de quatrième niveau Cri, qui inflige 4d6 points de dégâts magiques et assourdit les créatures prises dans un cône de 10,5 mètres (jet de sauvegarde contre les sorts pour diviser les dégâts par deux et annuler la surdité).~ +%atsymbol%187=~Å’il de la résistance~ +%atsymbol%186=~Å’il du venin +Cet Å“il bloque une attaque ou un sort pouvant empoisonner le personnage. +Il peut à la place être dépensé pour empoisonner une créature (20 points de dégâts en 20 secondes, jet de sauvegarde contre le poison pour annuler).~ +%atsymbol%185=~Å’il du venin~ +%atsymbol%184=~Å’il de l'épée +Cet Å“il détourne la première attaque physique infligeant des dégâts au personnage. +L'Å“il peut également être dépensé pour jeter le sort de magicien de premier niveau : Projectile magique, créant un projectile tous les deux niveaux d'expérience après le premier (5 projectiles maximum) qui infligent 1d4 +1 points de dégâts magiques.~ +%atsymbol%183=~Å’il de l'épée~ +%atsymbol%182=~Å’il du mage +Cet Å“il absorbe une attaque de type feu, électricité, froid ou acide. +Il peut également être dépensé pour jeter le sort de magicien de troisième niveau Éclair, qui inflige 1d6 dégâts électriques par niveau (10d6 maximum) à toutes les créatures se trouvant sur son chemin.~ +%atsymbol%181=~Å’il du mage~ +%atsymbol%180=~Å’il de l'esprit +Cet Å“il protège contre les attaques mentales, telles que Charme, Émotion et Terreur. +Il peut être dépensé pour lancer le sort de magicien de premier niveau Charme-personne (durée d'un tour, jet de sauvegarde contre les sorts pour annuler).~ +%atsymbol%179=~Å’il de l'esprit~ +%atsymbol%178=~Vous ne pouvez pas lancer ce sort tant que le précédent fait encore effet.~ +%atsymbol%177=~Cercle d'yeux +(Abjuration) +Niveau : 7 +Portée : personnelle +Durée : 2 tours +Temps d'incantation : 7 +Zone d'effet : le lanceur +Jet de sauvegarde : aucun +Ce sort fait apparaître sept yeux magiques flottant en cercle autour de la tête du personnage. Chacun a une vertu défensive et une autre offensive, mais chaque Å“il perd tout pouvoir dès qu'on s'en sert une fois. On ne peut lancer ce sort une seconde fois tant que le premier continue de faire effet, et ce même si tous les yeux ont disparu. Voici quels sont les pouvoirs de chaque Å“il : +- Å’il de l'esprit : Cet Å“il protège contre les attaques mentales, telles que Charme, Émotion et Terreur. Il peut être dépensé pour lancer le sort de magicien de premier niveau : Charme-personne (durée d'un tour, jet de sauvegarde contre les sorts pour annuler). +- Å’il de l'épée : Cet Å“il détourne la première attaque physique infligeant des dégâts au personnage. L'Å“il peut également être dépensé pour jeter le sort de magicien de premier niveau : Projectile magique, créant un projectile tous les deux niveaux d'expérience après le premier (5 projectiles maximum) qui infligent 1d4 +1 dégâts magiques. +- Å’il du mage : Cet Å“il absorbe une attaque de type feu, électricité, froid ou acide. Il peut également être dépensé pour jeter le sort de magicien de troisième niveau ; Éclair, qui inflige 1d6 dégâts électriques par niveau (10d6 maximum) à toutes les créatures se trouvant sur son chemin. +- Å’il du venin : Cet Å“il bloque une attaque ou un sort pouvant empoisonner le personnage. Il peut à la place être dépensé pour empoisonner une créature (20 points de dégâts en 20 secondes, jet de sauvegarde contre le poison pour annuler). +- Å’il de l'âme : Cet Å“il annule un sort causant une mort instantanée (Sort de mort, Doigt de mort, Mot de pouvoir : mort, Mise à mort ou Destruction). Il peut également être transformé en un Rayon débilitant, similaire au sort de magicien de deuxième niveau, qui abaisse la force de la cible à 5 (jet de sauvegarde contre les sorts pour annuler). +- Å’il de la résistance : Cet Å“il bloque une attaque étourdissante, assourdissante, aveuglante ou de type silence. Il peut également être dépensé pour lancer le sort de magicien de quatrième niveau : Cri, qui inflige 4d6 dégâts magiques et assourdit les créatures prises dans un cône de 10,5 mètres (jet de sauvegarde contre les sorts pour diviser les dégâts par deux et annuler la surdité). +- Å’il de la pierre : Cet Å“il protège le personnage contre une seule attaque pétrifiante. Il peut également être dépensé pour lancer le sort de magicien de troisième niveau : Immobilisation des personnes, qui immobilise des créatures humanoïdes pendant un round par niveau (jet de sauvegarde contre les sorts pour annuler).~ +%atsymbol%176=~Cercle d'yeux~ +%atsymbol%175=~Rage de Malavon +(Invocation) +Niveau : 7 +Portée : personnelle +Durée : instantanée +Temps d'incantation : 1 +Zone d'effet : rayon de 2,10 mètres +Jet de sauvegarde : demi-dégâts +Rage de Malavon a été inventé par un elfe noir du nom de Malavon. Sous l'effet du sort, le corps du magicien projette dans toutes les directions des rayons d'énergie noire, nuisibles pour ses alliés comme pour ses ennemis. Les barbillons magiques infligent 20d4 points de dégâts perforants à tout ce qu'ils touchent. Ce sort est particulièrement utile lorsque l'on se retrouve environné d'adversaires.~ +%atsymbol%174=~Rage de Malavon~ +%atsymbol%173=~Coup vorpal~ +%atsymbol%172=~Mort~ +%atsymbol%171=~Mort-vivant détruit~ +%atsymbol%170=~Créature extra-planaire détruite~ +%atsymbol%169=~Reflets +(Illusion/Fantasme) +Niveau : 6 +Portée : champ visuel du lanceur +Durée : 1 round par niveau +Temps d'incantation : 6 +Zone d'effet : spéciale +Jet de sauvegarde : aucun +Reflets est similaire aux sorts Monstres d'ombre et Demi-ombres, en ce sens qu'il permet de former des créatures illusoires à partir de matière prise au Demi-plan des Ombres. Ces monstres sont plus puissants que ceux qu'appellent les deux sorts mentionnés ci-dessus. Ils obéissent au mage jusqu'au terme de la durée du sort ou jusqu'à ce qu'ils soient détruits.~ +%atsymbol%168=~Reflets~ +%atsymbol%167=~Toucher de la liche~ +%atsymbol%166=~Toucher de la liche~ +%atsymbol%165=~Toucher de la liche +(Nécromancie) +Niveau : 6 +Portée : contact +Durée : 1 round par niveau +Temps d'incantation : 6 +Zone d'effet : le lanceur +Jet de sauvegarde : spécial +Ce sort confère les pouvoirs et les immunités d'une liche au mage. Ce dernier n'a plus rien à craindre de la paralysie ou de la terreur tant que l'enchantement fait effet. Dans le même temps, ses mains luisent d'un éclat vert surnaturel qui inflige 1d10 points de dégâts à toute créature qu'il touche et la paralyse à moins qu'elle ne réussisse son jet de sauvegarde. Ce sort n'affecte pas les morts-vivants. +~ +%atsymbol%164=~Toucher de la liche~ +%atsymbol%163=~Dissipation des effets~ +%atsymbol%162=~Coquille antimagique +(Abjuration) +Niveau : 6 +Portée : personnelle +Durée : 1 tour par niveau +Temps d'incantation : 1 +Zone d'effet : le lanceur +Jet de sauvegarde : aucun +Ce sort entoure le magicien d'une barrière invisible se déplaçant avec lui. Elle l'immunise contre toutes les attaques magiques, mais l'empêche dans le même temps de jeter le moindre sort. Ce sort dissipe également les effets de surdité et de débilité mentale sur le lanceur.~ +%atsymbol%161=~Coquille antimagique~ +%atsymbol%160=~Homme-lézard coriace~ +%atsymbol%159=~Gobelin d'élite~ +%atsymbol%158=~Gobelin d'élite~ +%atsymbol%157=~Demi-ombres +(Illusion/Fantasme) +Niveau : 5 +Portée : champ visuel du lanceur +Durée : 1 round par niveau +Temps d'incantation : 5 +Zone d'effet : spécial +Jet de sauvegarde : aucun +Ce sort est semblable à Monstres d'ombre (4e niveau), si ce n'est que les créatures invoquées sont bien plus puissantes.~ +%atsymbol%156=~Demi-ombres~ +%atsymbol%155=~Arme de troll~ +%atsymbol%154=~Troll~ +%atsymbol%153=~Troll~ +%atsymbol%152=~Monstres d'ombre +(Illusion/Fantasme) +Niveau : 4 +Portée : champ visuel du lanceur +Durée : 1 round par niveau +Temps d'incantation : 4 +Zone d'effet : spécial +Jet de sauvegarde : aucun +Ce sort façonne la matière du Demi-plan de l'Ombre pour créer des monstres illusoires. Jusqu'à 6 créatures peuvent être invoquées, dont le total des dés de vie ne pourra dépasser le niveau du lanceur.~ +%atsymbol%151=~Monstres d'ombre~ +%atsymbol%150=~Hâte~ +%atsymbol%149=~Lenteur~ +%atsymbol%148=~Ralenti(e)~ +%atsymbol%147=~Repli expéditif +(Transmutation) +Niveau : 1 +Portée : personnelle +Durée : 3 rounds +Temps d'incantation : 1 +Zone d'effet : le lanceur +Jet de sauvegarde : aucun +Ce sort double la vitesse de déplacement du sujet pendant un bref instant, ce qui lui permet généralement de s'enfuir. Les autres enchantements affectant la vitesse, comme Hâte et Lenteur, cessent de faire effet jusqu'au terme de la durée de Repli expéditif. Lorsqu'il est sous l'effet de ce sort, le lanceur ne peut ni attaquer, ni incanter, ni utiliser d'objets magiques ou avoir recours à des capacités spéciales... il ne peut que fuir.~ +%atsymbol%146=~Repli expéditif~ +%atsymbol%145=~Épée de Mordenkainen~ +%atsymbol%144=~Épée de Mordenkainen~ +%atsymbol%143=~Épée de Mordenkainen +(Invocation) +Niveau : 7 +Portée : champ visuel du lanceur +Durée : 1 round par niveau +Temps d'incantation : 7 +Zone d'effet : spéciale +Jet de sauvegarde : aucun +Ce sort fait apparaître une épée de force que le magicien peut utiliser par la seule force de son esprit. Elle frappe comme si elle était maniée par un guerrier de la moitié du niveau du mage et, bien que ce dernier la tienne en main, il peut s'en servir pour attaquer n'importe quelle créature se trouvant dans son champ de vision. L'épée ne possède aucun bonus au jet d'attaque, mais elle peut atteindre les créatures uniquement touchées par les armes +2 et inflige 5d6 points de dégâts à chaque coup.~ +%atsymbol%142=~Épée de Mordenkainen~ +%atsymbol%141=~Élémental d'eau~ +%atsymbol%140=~Élémental d'eau~ +%atsymbol%139=~Conjuration d'un élémental d'eau +(Conjuration/Convocation) +Niveau : 5 +Portée : champ visuel du lanceur +Durée : 1 tour par niveau +Temps d'incantation : 9 +Zone d'effet : spéciale +Jet de sauvegarde : aucun +Ce sort invoque un Élémental d'Eau de 8 DV au service du personnage en ouvrant un portail magique vers le Plan Élémentaire de l'Eau. L'Élémental se battra pour le personnage jusqu'à sa destruction ou la fin du sort.~ +%atsymbol%138=~Conjuration d'un élémental d'eau~ +%atsymbol%137=~Élémentaire d'air~ +%atsymbol%136=~Élémentaire d'air~ +%atsymbol%135=~Conjuration d'un élémental d'air +(Conjuration/Convocation) +Niveau : 5 +Portée : champ visuel du lanceur +Durée : 1 tour par niveau +Temps d'incantation : 9 +Zone d'effet : spéciale +Jet de Sauvegarde : aucun +Ce sort invoque un Élémental d'Air de 8 DV au service du personnage en ouvrant un portail magique vers le Plan Élémentaire de l'Air. L'Élémental se battra pour le personnage jusqu'à sa destruction ou la fin du sort.~ +%atsymbol%134=~Conjuration d'un élémental d'air~ +%atsymbol%133=~Élémentaire de feu~ +%atsymbol%132=~Élémental de feu~ +%atsymbol%131=~Conjuration d'un élémental de feu +(Conjuration/Convocation) +Niveau : 5 +Portée : champ visuel du lanceur +Durée : 1 tour par niveau +Temps d'incantation : 9 +Zone d'effet : spéciale +Jet de Sauvegarde : aucun +Ce sort invoque un Élémental de Feu de 8 DV au service du personnage en ouvrant un portail magique vers le Plan Élémentaire du Feu. L'Élémental se battra pour le personnage jusqu'à sa destruction ou la fin du sort.~ +%atsymbol%130=~Conjuration d'un élémental de feu~ +%atsymbol%129=~Élémentaire de terre~ +%atsymbol%128=~Élémental de terre~ +%atsymbol%127=~Conjuration d'un élémental de terre +(Conjuration/Convocation) +Niveau : 5 +Portée : champ visuel du lanceur +Durée : 1 tour par niveau +Temps d'incantation : 9 +Zone d'effet : spéciale +Jet de Sauvegarde : aucun +Ce sort invoque un Élémental de Terre de 8 DV au service du personnage en ouvrant un portail magique vers le Plan Élémentaire de la Terre. L'Élémental se battra pour le personnage jusqu'à sa destruction ou la fin du sort.~ +%atsymbol%126=~Conjuration d'un élémental de terre~ +%atsymbol%125=~Convocation de monstres III +(Conjuration/Convocation) +Niveau : 5 +Portée : 6 mètres +Durée : 4 rounds + 1 round par niveau +Temps d'incantation : 5 +Zone d'effet : spéciale +Jet de sauvegarde : aucun +Ce sort fait apparaître 1d4 monstres de niveau 3. Ils se manifestent dans la limite de portée et le magicien peut leur ordonner d'attaquer ses adversaires jusqu'à ce que la durée du sort arrive à son terme (à moins que les monstres invoqués ne soient tués auparavant).~ +%atsymbol%124=~Convocation de monstres III~ +%atsymbol%123=~Homme-lézard~ +%atsymbol%122=~Homme-lézard~ +%atsymbol%121=~Convocation de monstres II +(Conjuration/Convocation) +Niveau : 4 +Portée : 6 mètres +Durée : 3 rounds + 1 round par niveau +Temps d'incantation : 4 +Zone d'effet : spéciale +Jet de sauvegarde : aucun +Ce sort fait apparaître 1d6 monstres de niveau 2. Ils se manifestent dans la limite de portée et le magicien peut leur ordonner d'attaquer ses adversaires jusqu'à ce que la durée du sort arrive à son terme (à moins que les monstres invoqués ne soient tués auparavant).~ +%atsymbol%120=~Convocation de monstres II~ +%atsymbol%119=~Gobelin~ +%atsymbol%118=~Gobelin~ +%atsymbol%117=~Convocation de monstres I +(Conjuration/Convocation) +Niveau : 3 +Portée : 6 mètres +Durée : 2 rounds + 1 round par niveau +Temps d'incantation : 4 +Zone d'effet : spéciale +Jet de sauvegarde : aucun +Ce sort fait apparaître 2d3 monstres de niveau 1. Ils se manifestent dans la limite de portée et le magicien peut leur ordonner d'attaquer ses adversaires jusqu'à ce que la durée du sort arrive à son terme (à moins que les monstres invoqués ne soient tués auparavant).~ +%atsymbol%116=~Convocation de monstres I~ +%atsymbol%115=~Attaquer~ +%atsymbol%114=~Minotaure~ +%atsymbol%113=~Minotaure~ +%atsymbol%112=~Convocation de monstres V +(Conjuration/Convocation) +Niveau : 7 +Portée : 6 mètres +Durée : 6 rounds + 1 round par niveau +Temps d'incantation : 6 +Zone d'effet : spéciale +Jet de sauvegarde : aucun +Ce sort fait apparaître 1d3 monstres de niveau 5. Ils se manifestent dans la limite de portée et le magicien peut leur ordonner d'attaquer ses adversaires jusqu'à ce que la durée du sort arrive à son terme (à moins que les monstres invoqués ne soient tués auparavant).~ +%atsymbol%111=~Convocation de monstres V~ +%atsymbol%110=~Salamander spear +1d8 piercing +1d6 fire damage +do not translate~ +%atsymbol%109=~Frost salamander spear +1d8 piercing ++1d6 cold +do not trans~ +%atsymbol%108=~Salamandre~ +%atsymbol%107=~Salamandre~ +%atsymbol%106=~Salamandre du givre~ +%atsymbol%105=~Salamandre du givre~ +%atsymbol%104=~Convocation de monstres VI +(Conjuration/Convocation) +Niveau : 8 +Portée : 6 mètres +Durée : 7 rounds + 1 round par niveau +Temps d'incantation : 8 +Zone d'effet : spéciale +Jet de sauvegarde : aucun +Ce sort fait apparaître 1d3 monstres de niveau 6. Ils se manifestent dans la limite de portée et le magicien peut leur ordonner d'attaquer ses adversaires jusqu'à ce que la durée du sort arrive à son terme (à moins que les monstres invoqués ne soient tués auparavant).~ +%atsymbol%103=~Convocation de monstres VI~ +%atsymbol%102=~Attaquer~ +%atsymbol%101=~Ombre des roches~ +%atsymbol%100=~Ombre des roches~ +%atsymbol%99=~Squelette de garde~ +%atsymbol%98=~Squelette de garde~ +%atsymbol%97=~Convocation de monstres VII +(Conjuration/Convocation) +Niveau : 9 +Portée : 6 mètres +Durée : 8 rounds + 1 round par niveau +Temps d'incantation : 9 +Zone d'effet : spéciale +Jet de sauvegarde : aucun +Ce sort fait apparaître 1d2 monstres de niveau 7 ou 8. Ils se manifestent dans la limite de portée et le magicien peut leur ordonner d'attaquer ses adversaires jusqu'à ce que la durée du sort arrive à son terme (à moins que les monstres invoqués ne soient tués auparavant).~ +%atsymbol%96=~Convocation de monstres VII~ +%atsymbol%95=~Convocation de monstres IV +(Conjuration/Convocation) +Niveau : 6 +Portée : 6 mètres +Durée : 5 rounds + 1 round par niveau +Temps d'incantation : 6 +Zone d'effet : spéciale +Jet de sauvegarde : aucun +Ce sort fait apparaître 1d3 monstres de niveau 4. Ils se manifestent dans la limite de portée et le magicien peut leur ordonner d'attaquer ses adversaires jusqu'à ce que la durée du sort arrive à son terme (à moins que les monstres invoqués ne soient tués auparavant).~ +%atsymbol%94=~Convocation de monstres IV~ +%atsymbol%93=~Crâne~ +%atsymbol%92=~Transparence des monstres +Ne pas traduire~ +%atsymbol%91=~Objet de transparence de monstre~ +%atsymbol%90=~Ombre~ +%atsymbol%89=~Ombre~ +%atsymbol%88=~Convocation d'ombres +(Conjuration/Convocation, Nécromancie) +Niveau : 5 +Portée : champ visuel du lanceur +Durée : 1 round + 1 round par niveau +Temps d'incantation : 5 +Zone d'effet : spécial +Jet de sauvegarde : aucun +Ce sort fait apparaître trois ombres disposant chacune de 3 dés de vie. Ces créatures obéissent aux ordres de leur maître et combattent pour lui jusqu'au terme du sort (ou jusqu'à ce qu'elles soient détruites).~ +%atsymbol%87=~Convocation d'ombres~ +%atsymbol%86=~Poing de fer~ +%atsymbol%85=~Poing de fer~ +%atsymbol%84=~Victime d'une grave maladie~ +%atsymbol%83=~Malade~ +%atsymbol%82=~Empoisonné(e)~ +%atsymbol%81=~Poison~ +%atsymbol%80=~Corps de fer +(Transmutation) +Niveau : 8 +Portée : personnelle +Durée : 2 tours +Temps d'incantation : 8 +Zone d'effet : le lanceur +Jet de sauvegarde : aucun +Ce sort transforme le corps du personnage en fer vivant, ce qui lui confère plusieurs pouvoirs distincts. Tant que le sort fait effet, le personnage bénéficie des résistances suivantes : 100 % contre l'électricité, 50 % contre le feu et 25 % contre les attaques contondantes. Il est en outre immunisé contre les sorts affectant la respiration ou la physiologie. De plus, sa Force passe à 25 et il peut donner deux coups de poing par round (2d4 points de dégâts + bonus de Force). Malheureusement, les mouvements du personnage deviennent lents et gourds, ce qui réduit sa vitesse de déplacement de 75 % et l'empêche de lancer le moindre sort tant que Corps de fer fait effet.~ +%atsymbol%79=~Corps de fer~ +%atsymbol%78=~Inconscient(e)~ +%atsymbol%77=~Grand cri +(Évocation) +Niveau : 8 +Portée : personnelle +Durée : instantanée +Temps d'incantation : 1 +Zone d'effet : cône de 5,10 mètres de long et de 15 degrés d'angle +Jet de sauvegarde : demi-dégâts +Au terme de l'incantation, le personnage libère un cri terrible dans un cône de 5,10 mètres de long pour un angle de 15 degrés. L'effort exigé de la part du mage est tel que ce dernier perd 2d4 points de vie et doit réussir un jet de sauvegarde contre les sorts sous peine de perdre connaissance pendant un round. Les créatures ayant 5 DV ou moins meurent instantanément si elles sont prises dans la zone d'effet du Grand cri. Toutes les autres créatures ont droit à un jet de sauvegarde contre les sorts. Celles qui le ratent sont étourdies pendant 2 rounds, assourdies pendant 4 rounds et subissent 4d12 points de dégâts magiques. Celles qui le réussissent sont étourdies pendant 1 round, assourdies pendant 2 rounds et subissent 2d12 points de dégâts magiques.~ +%atsymbol%76=~Grand cri~ +%atsymbol%75=~Charmé(e)~ +%atsymbol%74=~Charme néfaste~ +%atsymbol%73=~Dominé(e)~ +%atsymbol%72=~Échec du test de moral : panique~ +%atsymbol%71=~En état d'ébriété~ +%atsymbol%70=~Confus(e)~ +%atsymbol%69=~Obstination bornée~ +%atsymbol%68=~Immobilisé(e)~ +%atsymbol%67=~Paralysé(e)~ +%atsymbol%66=~Immobilisation~ +%atsymbol%65=~Esprit impénétrable +(Abjuration) +Niveau : 8 +Portée : personnelle +Durée : 24 heures +Temps d'incantation : 1 +Zone d'effet : le lanceur +Jet de sauvegarde : aucun +Esprit impénétrable est le meilleur garant d'intimité qui soit, puisqu'il protège de presque tous les effets mentaux, tels que le charme, le sort de Labyrinthe, la débilité mentale, la confusion, la terreur, l'ébriété, la rage sanguinaire, l'immobilisation et la pétrification. +~ +%atsymbol%64=~Esprit impénétrable~ +%atsymbol%63=~Suffocation +(Transmutation) +Niveau : 7 +Portée : champ visuel du lanceur +Durée : 4 rounds +Temps d'incantation : 7 +Zone d'effet : 2,10 mètres de rayon +Jet de sauvegarde : spécial +Ce sort vide les poumons de toutes les créatures se trouvant dans la zone d'effet. Les êtres qui ne respirent pas sont immunisés contre cette attaque. Les autres subissent les effets suivants : -4 à la Classe d'Armure, -4 aux jets d'attaque, -6 en Dextérité, une attaque de moins par round, vitesse de déplacement réduite de moitié, et 4d8 points de dégâts magiques par round. Un jet de sauvegarde réussi annule les effets sauf 2d8 points de dégâts pour le round en cours. Les effets se dissipent progressivement quand la victime quitte la zone d'effet, mais un round est parfois nécessaire avant de trouver son second souffle.~ +%atsymbol%62=~Suffocation~ +%atsymbol%61=~Tempête acide +(Invocation) +Niveau : 7 +Portée : champ visuel du lanceur +Durée : 1 round par niveau +Temps d'incantation : 7 +Zone d'effet : 3,60 mètres de rayon +Jet de sauvegarde : demi-dégâts +Ce sort déchaîne une violente pluie acide sur la zone d'effet, ce qui inflige 1d4 points de dégâts d'acide par round pendant les trois premiers rounds, 1d6 points pendant les trois suivants, et 1d8 points par round au-delà du sixième. Quitter la zone d'effet ne signifie pas que l'on échappe au sort, car l'acide s'accroche à la peau et toute créature affectée au début du sort continue de subir des dégâts jusqu'à ce que la tempête acide s'achève. Les victimes ont droit à un jet de sauvegarde chaque round après le premier. En cas de succès, les dégâts qu'elles subissent sont réduits de moitié (mais seulement pour le round concerné).~ +%atsymbol%60=~Tempête acide~ +%atsymbol%59=~Résistance de troll +(Nécromancie) +Niveau : 6 +Portée : personnelle +Durée : 2 tours +Temps d'incantation : 6 +Zone d'effet : le lanceur +Jet de sauvegarde : aucun +Ce sort confère au personnage la résistance d'un troll, ce qui lui permet de se régénérer au rythme de 5 points de vie par round.~ +%atsymbol%58=~Résistance de troll~ +%atsymbol%57=~Squelette~ +%atsymbol%56=~Squelette~ +%atsymbol%55=~Destruction d'âme +(Nécromancie) +Niveau : 6 +Portée : champ visuel du lanceur +Durée : instantanée +Temps d'incantation : 5 +Zone d'effet : 2,10 mètres de rayon +Jet de sauvegarde : aucun +Ce sort inflige 3d8 points de dégâts à toutes les créatures vivantes situées à moins de 2,10 mètres à la ronde. De plus, toute créature tuée par Destruction d'âme est aussitôt oblitérée et son énergie vitale est transformée en squelette à 3 DV sous le contrôle du personnage. Pour chaque créature mourant de la sorte, le magicien gagne +1 en force, Dextérité et Constitution (pendant 1 tour).~ +%atsymbol%54=~Destruction d'âme~ +%atsymbol%53=~Dard d'os +3~ +%atsymbol%52=~Dard d'os~ +%atsymbol%51=~Dards d'os +(Nécromancie) +Niveau : 6 +Portée : personnelle +Durée : 5 rounds +Temps d'incantation : 5 +Zone d'effet : le lanceur +Jet de sauvegarde : aucun +Ce sort crée 9 dards pouvant être lancés par le personnage (qui est obligé de les garder en main tant que l'enchantement fait effet). Les dards sont +3, infligent 1d4 points de dégâts chacun, et toute créature touchée doit réussir un jet de sauvegarde contre la mort magique sous peine de perdre 2d6 points de vie supplémentaires et de voir sa Force baisser de 3 points pendant 5 rounds. Le personnage n'a pas besoin de savoir manier les dards pour pouvoir utiliser ce sort.~ +%atsymbol%50=~Dards d'os~ +%atsymbol%49=~Sphère glaciale d'Otiluke +(Transmutation, Invocation) +Niveau : 6 +Portée : champ visuel du lanceur +Durée : instantanée +Temps d'incantation : 6 +Zone d'effet : 1 créature +Jet de sauvegarde : annule +Ce sort projette un rayon glacé contre la cible. Il peut toucher toute créature située dans le champ de vision du magicien et inflige 1d4 +2 points de dégâts de froid par niveau de ce dernier. Si la victime réussit son jet de sauvegarde, elle évite totalement le rayon et ne subit pas le moindre dégât.~ +%atsymbol%48=~Sphère glaciale d'Otiluke~ +%atsymbol%47=~Linceul de flammes +(Évocation) +Niveau : 5 +Portée : champ visuel du lanceur +Durée : 1 round par 2 niveaux (spécial) +Temps d'incantation : 5 +Zone d'effet : rayon de 1,5 mètres +Jet de sauvegarde : annule +La créature affectée par ce sort s'enflamme si elle rate son jet de sauvegarde. Elle subit 2d6 points de dégâts de feu par round et des langues de feu projetées par la victime atteignent toutes les créatures distantes de moins de 1,50 mètres et leur infligent 1d4 points de dégâts de feu (si elles ratent leur jet de sauvegarde, ces dernières se retrouvent également dévorées par les flammes). Le linceul se dissipe si le jeteur de sorts et sa cible ne sont plus dans la même zone. Ce sort est particulièrement utile pour disperser un groupe de trolls ou de salamandres du givre.~ +%atsymbol%46=~Linceul de flammes~ +%atsymbol%45=~Sphère acide +(Conjuration) +Niveau : 4 +Portée : champ visuel du lanceur +Durée : spéciale +Temps d'incantation : 4 +Zone d'effet : rayon de 1,50 mètre +Jet de sauvegarde : spécial +Cette incantation fait apparaître une sphère d'acide vert émeraude, que le personnage peut lancer sur la cible de son choix. La sphère explose et inonde d'acide la créature choisie. Celle-ci perd 1d4 points de vie par niveau du magicien, jusqu'à un maximum de 12d4. Une fois les premiers dégâts encaissés, la victime doit réussir un jet de sauvegarde contre les sorts si elle ne veut pas en subir davantage. En cas d'échec, l'acide continue de la ronger round après round, les dégâts diminuant de deux dés par round. Par exemple, un magicien de niveau 8 inflige 8d4 points de dégâts grâce à ce sort au cours du premier round, 6d4 au deuxième, 4d4 au troisième, 2d4 au quatrième et le sort s'arrête au cinquième round. À chaque round après le premier, la victime a droit à un jet de sauvegarde contre les sorts pour éviter des dégâts supplémentaires. +L'acide asperge toutes les créatures situées à moins de 1,50 mètre de la cible. Toutes doivent réussir un jet de sauvegarde contre la pétrification/métamorphose si elles ne veulent pas subir 1d4 points de dégâts par cinq niveaux du lanceur. Ces dégâts d'aspersion ne sont pas continus.~ +%atsymbol%44=~Sphère acide~ +%atsymbol%43=~Surdité~ +%atsymbol%42=~Cri +(Évocation) +Niveau : 4 +Portée : personnelle +Durée : instantanée +Temps d'incantation : 1 +Zone d'effet : cône de 5,10 mètres de long et de 15 degrés d'angle +Jet de sauvegarde : demi-dégâts +Ce sort confère un pouvoir vocal terrifiant au personnage, lequel peut laisser fuser un cri à déchirer les tympans affectant une zone d'effet en forme de cône. Toute créature prise dans la zone d'effet perd 4d6 points de vie et se retrouve assourdie pendant 9 rounds. Un jet de sauvegarde réussi contre les sorts annule la surdité et réduit les dégâts de moitié.~ +%atsymbol%41=~Cri~ +%atsymbol%40=~Projectiles de force de Mordenkainen +(Évocation) +Niveau : 4 +Portée : champ visuel du lanceur +Durée : instantanée +Temps d'incantation : 4 +Zone d'effet : rayon de 60 centimètres +Jet de sauvegarde : spécial +Ce sort fait apparaître un petit globe d'énergie magique filant de la main tendue du mage pour aller frapper à coup sûr la cible désignée, un peu comme un sort Projectiles magiques. Le personnage crée un projectile au niveau 7, plus un autre tous les trois niveaux supplémentaires (deux au niveau 10, trois au niveau 13, quatre au niveau 16, et ainsi de suite jusqu'à un maximum de sept au niveau 25). Chaque projectile cause 2d4 points de dégâts puis explose, la détonation infligeant 1 point de dégât de commotion par niveau du magicien dans un rayon de 60 centimètres. Par exemple, un mage de niveau 12 ferait apparaître deux projectiles de force, infligeant chacun 2d4+12 points de dégâts magiques. Les créatures touchées ont droit à un jet de sauvegarde contre les sorts pour éviter les dégâts de commotion mais l'impact du projectile lui-même n'est pas soumis à un jet de sauvegarde. Le sort de mage de niveau 1 Bouclier absorbe les projectiles de force sans dommage, y compris les dégâts de commotion.~ +%atsymbol%39=~Projectiles de force de Mordenkainen~ +%atsymbol%38=~Désespoir~ +%atsymbol%37=~Étourdi~ +%atsymbol%36=~Émotion, désespoir +(Enchantement/Charme) +Niveau : 4 +Portée : champ visuel du lanceur +Durée : 1 tour +Temps d'incantation : 4 +Zone d'effet : 2,10 mètres de rayon +Jet de sauvegarde : annule +Ce sort fait naître un grand désespoir dans la zone d'effet. Tous les ennemis échouant leur jet de sauvegarde contre les sorts restent immobiles et ne font rien pendant 1 tour. Au moment du lancement, ce sort annule Émotion, espoir dans la zone d'effet.~ +%atsymbol%35=~Émotion, désespoir~ +%atsymbol%34=~Panique~ +%atsymbol%33=~Émotion, terreur +(Enchantement/Charme) +Niveau : 4 +Portée : champ visuel du lanceur +Durée : 5 rounds +Temps d'incantation : 4 +Zone d'effet : 2,10 mètres de rayon +Jet de sauvegarde : annule +Ce sort terrifie les créatures comprises dans la zone d'effet. En cas de jet de sauvegarde raté, elles s'enfuient pendant 5 rounds. Ce sort dissipe Émotion, courage dans la zone d'effet au moment où il est lancé.~ +%atsymbol%32=~Émotion, terreur~ +%atsymbol%31=~Émotion, espoir +(Enchantement/Charme) +Niveau : 4 +Portée : champ visuel du lanceur +Durée : 1 heure +Temps d'incantation : 4 +Zone d'effet : 2,10 mètres de rayon +Jet de sauvegarde : aucun +Ce sort génère l'espoir chez les créatures comprises dans la zone d'effet. Leur moral s'en ressent et elles bénéficient d'un bonus de +2 à tous leurs jets d'attaque, de dégâts et de sauvegarde. Ce sort dissipe tout sentiment de désespoir dans la zone d'effet au moment où il est lancé.~ +%atsymbol%30=~Émotion, espoir~ +%atsymbol%29=~Émotion, courage +(Enchantement/Charme) +Niveau : 4 +Portée : champ visuel du lanceur +Durée : 1 heure +Temps d'incantation : 4 +Zone d'effet : 2,10 mètres de rayon +Jet de sauvegarde : aucun +Ce sort génère un grand courage chez toutes les créatures comprises dans la zone d'effet. Ces dernières bénéficient alors des bonus suivants : +1 à l'attaque, +3 aux dégâts et +5 points de vie temporaires (ce qui peut leur permettre de dépasser leur maximum). Enfin, le sort dissipe automatiquement la terreur dans la zone d'effet.~ +%atsymbol%28=~Émotion, courage~ +%atsymbol%27=~Berserk~ +%atsymbol%26=~Sang brûlant de Beltyn +(Nécromancie) +Niveau : 4 +Portée : champ visuel du lanceur +Durée : 1 round par 2 niveaux +Temps d'incantation : 4 +Zone d'effet : 1 créature +Jet de sauvegarde : annule +Le sort fait brûler le sang de la cible, ce qui lui inflige 3d4 points de dégâts par round et rend la victime folle de douleur. Chaque round, la victime a droit à un jet de sauvegarde contre les sorts (à -3). Dès qu'elle en réussit un, le sort cesse de faire effet. Il ne fonctionne pas contre les morts-vivants ou les créatures natives des autres plans qui n'ont pas de sang dans les veines (comme les élémentaires). Si la cible résiste au feu, cela réduit ou annule les dégâts provoqués par le sort.~ +%atsymbol%25=~Sang brûlant de Beltyn~ +%atsymbol%24=~Lance de destruction +(Évocation) +Niveau : 3 +Portée : 30 mètres +Durée : instantanée +Temps d'incantation : 3 +Zone d'effet : spéciale +Jet de sauvegarde : demi-dégâts +Ce sort fait apparaître une lance de force partant du doigt du personnage et pouvant être lancée jusqu'à 30 mètres. Toute créature touchée par le rayon d'énergie subit 5d4 points de dégâts, +2 par niveau du magicien (jusqu'à un maximum de +30). Un jet de sauvegarde réussi contre les sorts réduit les dégâts de moitié.~ +%atsymbol%23=~Lance de destruction~ +%atsymbol%22=~Étourdi(e)~ +%atsymbol%21=~Lance de glace +(Invocation) +Niveau : 3 +Portée : champ visuel du lanceur +Durée : instantanée +Temps d'incantation : 3 +Zone d'effet : 1 créature +Jet de sauvegarde : spécial +Ce sort projette une lance de glace sur la cible choisie. Elle touche automatiquement, inflige 5d6 points de dégâts et oblige la victime à réussir un jet de sauvegarde contre les sorts pour ne pas être étourdie pendant 3 rounds.~ +%atsymbol%20=~Lance de glace~ +%atsymbol%19=~Modification de la dextérité~ +%atsymbol%18=~Grâce féline +(Transmutation) +Niveau : 2 +Portée : contact +Durée : 1 heure par niveau +Temps d'incantation : 2 +Zone d'effet : 1 créature +Jet de sauvegarde : aucun +Ce sort augmente la Dextérité du sujet en fonction de la classe de ce dernier : 1d8 points pour un voleur, 1d6 points pour un guerrier ou un mage et 1d4 points pour un prêtre. Grâce féline ne permet pas d'avoir plus de 20 en Dextérité.~ +%atsymbol%17=~Grâce féline~ +%atsymbol%16=~Bâton décuplé~ +%atsymbol%15=~Bâton décuplé~ +%atsymbol%14=~Bâton décuplé +(Invocation) +Niveau : 2 +Portée : personnelle +Durée : 3 rounds + 1 round par niveau +Temps d'incantation : 2 +Zone d'effet : le lanceur +Jet de sauvegarde : aucun +Ce sort fait apparaître un bâton d'énergie dans la main du magicien. Il est considéré comme une arme magique infligeant 1d6 points de dégâts par coup et pouvant toucher les créatures comme s'il était une arme +1. Mais il reste un bâton, que son utilisateur doit savoir manier pour ne pas encourir de pénalité à l'attaque. Au premier coup porté, le bâton a également la possibilité d'absorber 1d2 points de vie de la cible, qui sont aussitôt transférés au mage, mais uniquement pour le soigner (pas pour augmenter ses points de vie au-dessus du maximum).~ +%atsymbol%13=~Bâton décuplé~ +%atsymbol%12=~~ +%atsymbol%11=~Nuée de boules de neige de Snilloc +(Invocation) +Niveau : 2 +Portée : champ visuel du lanceur +Durée : instantanée +Temps d'incantation : 2 +Zone d'effet : 4,50 mètres de rayon +Jet de sauvegarde : demi-dégâts +Ce sort fait apparaître un déluge de boules de neige à partir du point choisi par le magicien. Ces projectiles touchent toutes les créatures prises dans la zone d'effet et leur infligent 1d3 points de dégâts de froid par niveau du personnage, jusqu'à un maximum de 8d3 au niveau 8. Contre les créatures à base de feu (ou qui l'utilisent), le sort cause 1d6 points de dégâts de froid par niveau, jusqu'à un maximum de 8d6 au niveau 8.~ +%atsymbol%10=~~ +%atsymbol%9=~Nuée de boules de neige de Snilloc~ +%atsymbol%8=~L'Å’il de l'esprit bloque un effet magique et se dissipe.~ +%atsymbol%7=~L'Å’il de l'épée bloque un effet magique et se dissipe.~ +%atsymbol%6=~L'Å’il du mage bloque un effet magique et se dissipe.~ +%atsymbol%5=~L'Å’il du venin bloque un effet magique et se dissipe.~ +%atsymbol%4=~L'Å’il de l'âme bloque un effet magique et se dissipe.~ +%atsymbol%3=~L'Å’il de la résistance bloque un effet magique et se dissipe.~ +%atsymbol%2=~L'Å’il de la pierre bloque un effet magique et se dissipe.~ +%atsymbol%1=~Ce sort soigne le personnage de 11 points de vie.~ diff --git a/iwdification/dw_iwdspells_resource/tra/it_it/iwdspells.tra b/iwdification/dw_iwdspells_resource/tra/it_it/iwdspells.tra new file mode 100644 index 0000000..14cc2d4 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/tra/it_it/iwdspells.tra @@ -0,0 +1,1209 @@ +%atsymbol%359=~Coraggio~ +%atsymbol%358=~Speranza~ +%atsymbol%357=~Grazia del Gatto~ +%atsymbol%356=~Giusta Ira dei Fedeli~ +%atsymbol%355=~Preghiera~ +%atsymbol%354=~Furia Sanguinaria~ +%atsymbol%353=~Recitare~ +%atsymbol%352=~Esaltazione~ +%atsymbol%351=~Furia Animale~ +%atsymbol%350=~Corpo di Ferro~ +%atsymbol%349=~Pietrificato~ +%atsymbol%348=~Inviolabilità Sacra della Mente~ +%atsymbol%347=~Dolore~ +%atsymbol%346=~Intermittente~ +%atsymbol%345=~Aiuto~ +%atsymbol%344=~Mente Libera~ +%atsymbol%343=~Trasformazione in Elementale della Terra~ +%atsymbol%342=~Trasformazione in Elementale del Fuoco~ +%atsymbol%341=~Canto di guerra di Sith- Bonus all'Armatura e Rigenerazione~ +%atsymbol%340=~"Canto di Guerra di Sith" +Tutti gli alleati nel raggio di 9 metri ottengono un bonus pari a +2 alla Classe Armatura, 10% di resistenza al danno da taglio, perforante, contundente e da proiettile, e l'abilità di rigenerare 2 Punti Ferita per round.~ +%atsymbol%339=~Canto di Guerra di Sith~ +%atsymbol%338=~Affascinato~ +%atsymbol%337=~Struggimento della sirena - Affascina le creature~ +%atsymbol%336=~"La Brama della Sirena" +Tutti i nemici nel raggio di 9 metri devono effettuare con successo un tiro-salvezza contro Incantesimi o rimanere affascinati, incapaci di agire per 1 round o finché non subiscono un danno.~ +%atsymbol%335=~Struggimento della Sirena~ +%atsymbol%334=~Canzone di Kaudies - Resistenza agli attacchi sonori~ +%atsymbol%333=~"La Canzone di Kaudies" +Tutti gli alleati nel raggio di 9 metri hanno il 50% di possibilità di liberarsi dell'effetto di incantesimi come Silenzio, Grido, Grido Potente, Comando, Comando Maggiore o qualsiasi altro attacco basato sul suono.~ +%atsymbol%332=~Canzone di Kaudies~ +%atsymbol%331=~Melodia di Tymora - Fortuna e bonus alle abilità~ +%atsymbol%330=~"Melodia di Tymora" +Tutti gli alleati nel raggio di 9 metri ottengono un bonus pari a +1 alla fortuna, +3 ai tiri-salvezza, +10 alla conoscenza e un bonus del 10% a tutte le abilità da ladro.~ +%atsymbol%329=~Melodia di Tymora~ +%atsymbol%328=~La storia di Curran Strongheart - Immunità alla paura~ +%atsymbol%327=~"La Leggenda di Curran Strongheart" +Tutti gli alleati nel raggio di 9 metri ottengono l'immunità agli effetti della paura per la durata della canzone ed è rimosso qualsiasi effetto della paura attualmente attivo.~ +%atsymbol%326=~La Storia di Curran Strongheart~ +%atsymbol%325=~La Ballata dei Tre Eroi - Bonus in Combattimento~ +%atsymbol%324=~"La Ballata dei Tre Eroi" +Tutti gli alleati nel raggio di 9 metri ottengono un bonus pari a +1 ai tiri per colpire, +1 al danno e +1 a tutti i tiri-salvezza.~ +%atsymbol%323=~La Ballata dei Tre Eroi~ +%atsymbol%322=~Emette Vapori Acidi~ +%atsymbol%321=~Soggetto ad Avvizzimento~ +%atsymbol%320=~Avvizzire +(Necromanzia) +Livello: 7 +Sfera: Guarigione +Raggio d'azione: Tocco +Durata: 1 round ogni 2 livelli +Tempo di lancio: 7 +Area d'effetto: 1 creatura +Tiro-salvezza: Neg. +Questo potente incantesimo fa avvizzire gli organi della creatura toccata fino a ridurli in polvere a meno che non effettui con successo un tiro-salvezza contro Morte con una penalità pari a -4. La creatura affetta perde 3 Punti Ferita al secondo. L'effetto dura 1 round ogni 2 livelli di esperienza del lanciatore o finché non viene rimosso. Ad esempio, un personaggio di 14° livello infligge alla creatura toccata 18 Punti Ferita a round per 7 round. L'incantesimo non ha effetto su non morti, costrutti o creature extraplanari. Avvizzire non può essere lanciato da personaggi di allineamento buono.~ +%atsymbol%319=~Avvizzire~ +%atsymbol%318=~Litania +(Evocazione/Attrazione) +Livello: 2 +Sfera: Combattimento +Raggio d'azione: Visuale del lanciatore +Durata: 1 turno +Tempo di lancio: 9 +Area d'effetto: Raggio di 18 metri +Tiro-salvezza: Nessuno +Mediante l'incantesimo Litania, il personaggio attira su se stesso e sul suo gruppo una benedizione particolare e provoca danno ai suoi nemici. Non appena il lancio viene completato, tutti gli alleati del personaggio all'interno dell'area d'effetto ricevono un bonus pari a +1 ai loro tiri-salvezza, tiri per colpire, tiri per determinare il danno minimo e il punteggio di guarigione. In aggiunta a ciò, i danni inflitti da mezzi diversi dal danno base di un'arma vengono ridotti di 1. Ad esempio, una palla di fuoco da 6d6 infliggerà 6d5 punti di danno e una freccia di fuoco che infligge 1d6 di danno perforante più 1d2 di danno da fuoco infliggerà invece 1d6 di danno perforante più 1 punto di danno da fuoco. I nemici del lanciatore subiscono tutti gli effetti contrari ai suddetti. +Litanie multiple non sono cumulabili. Questo incantesimo richiede una discreta quantità di concentrazione da parte del personaggio, pertanto questi non può lanciare altri incantesimi per la durata della litania e il suo Fattore-movimento viene dimezzato.~ +%atsymbol%317=~Litania~ +%atsymbol%316=~Fart Repellent for Bombardier Beetles. +Do not translate~ +%atsymbol%315=~Scarabeo Scavatore~ +%atsymbol%314=~Scarabeo Scavatore~ +%atsymbol%313=~Scarabeo Bombardiere~ +%atsymbol%312=~Scarabeo Bombardiere~ +%atsymbol%311=~Insetti Giganti +(Alterazione) +Livello: 4 +Sfera: Animale +Raggio d'azione: Visuale del lanciatore +Durata: 8 ore +Tempo di lancio: 7 +Area d'effetto: Speciale +Tiro-salvezza: Nessuno +Questo incantesimo evoca 2-3 scarabei scavatori o scarabei bombardieri al fianco del lanciatore. Gli scarabei obbediranno ai suoi ordini finché la durata dell'incantesimo non ha termine o finché non vengono uccisi.~ +%atsymbol%310=~Insetti Giganti~ +%atsymbol%309=~Causa Ferite Critiche +(Necromanzia) +Livello: 5 +Sfera: Guarigione +Raggio d'azione: Tocco +Durata: Istantanea +Tempo di lancio: 8 +Area d'effetto: 1 creatura +Tiro-salvezza: 1/2 +Lanciando questo incantesimo e toccando una creatura, il personaggio infligge 27 punti di danno da magia al corpo della creatura (un tiro-salvezza contro Incantesimi effettuato con successo dimezza i danni). Questo incantesimo non ha effetto su non morti, costrutti e creature extraplanari. Non può essere lanciato dai personaggi di allineamento buono.~ +%atsymbol%308=~Causa Ferite Critiche~ +%atsymbol%307=~Causa Ferite Gravi +(Necromanzia) +Livello: 4 +Sfera: Guarigione +Raggio d'azione: Tocco +Durata: Istantanea +Tempo di lancio: 5 +Area d'effetto: 1 creatura +Tiro-salvezza: 1/2 +Lanciando questo incantesimo e toccando una creatura, il personaggio infligge 17 punti di danno al corpo della creatura (un tiro-salvezza contro Incantesimi effettuato con successo dimezza i danni). Questo incantesimo non ha effetto su non morti, costrutti e creature extraplanari. Non può essere lanciato dai personaggi di allineamento buono.~ +%atsymbol%306=~Causa Ferite Gravi~ +%atsymbol%305=~Due Livelli Risucchiati~ +%atsymbol%304=~Risucchio di Energia +(Necromanzia) +Livello: 7 +Sfera: Necromanzia +Raggio d'azione: Tocco +Durata: Permanente +Tempo di lancio: 3 +Area d'effetto: 1 creatura +Tiro-salvezza: Nessuno +Il lancio di questo incantesimo apre un canale fra il Piano dell'Energia Negativa e il piano del personaggio. Questi agisce come condotto fra i due Piani, risucchiando alla vittima energia vitale che viene trasferita nel Piano dell'Energia Negativa e sottraendole 2 livelli di esperienza. Il bersaglio di questo incantesimo perde livelli, Dadi-vita, Punti Ferita e abilità in maniera permanente. Questi livelli possono essere recuperati soltanto grazie all'incantesimo divino Ristorare. Risucchio di Energia non ha effetto su non morti, costrutti o creature extraplanari. Può essere lanciato solo da personaggi di allineamento malvagio.~ +%atsymbol%303=~Risucchio di Energia~ +%atsymbol%302=~Impigliato~ +%atsymbol%301=~Shambling mound~ +%atsymbol%300=~Cumulo Strisciante~ +%atsymbol%299=~Predatore +(Evocazione) +Livello: 7 +Sfera: Vegetale +Raggio d'azione: Visuale del lanciatore +Durata: 8 ore +Tempo di lancio: 9 +Area d'effetto: Speciale +Tiro-salvezza: Nessuno +Questo incantesimo crea due cumuli striscianti da 11 DV. Queste creature aiuteranno volontariamente il lanciatore in combattimento o in qualsiasi altra attività che verrà loro assegnata e che avranno la capacità di portare a termine.~ +%atsymbol%298=~Predatore~ +%atsymbol%297=~Foschia di Eldath +(Invocazione) +Livello: 7 +Sfera: Elementale +Raggio d'azione: Visuale del lanciatore +Durata: Istantanea +Tempo di lancio: 9 +Area d'effetto: Raggio di 2 metri +Tiro-salvezza: Nessuno +Questo incantesimo copre l'area di effetto con una foschia blu argentato: qualsiasi creatura all'interno della foschia sarà guarita da malattie, veleni e curata di 25 Punti Ferita.~ +%atsymbol%296=~Foschia di Eldath~ +%atsymbol%295=~Scudo Maggiore di Lathander +(Evocazione) +Livello: 7 +Sfera: Guardia +Raggio d'azione: Tocco +Durata: 3 round +Tempo di lancio: 9 +Area d'effetto: 1 creatura +Tiro-salvezza: Nessuno +Finché resta attivo, questo incantesimo conferisce ad un bersaglio una Resistenza alla Magia pari a 100% e immunità ai danni. Le creature malvagie non possono essere protette da uno Scudo Maggiore di Lathander. Questo incantesimo può essere lanciato solo da personaggi di allineamento buono.~ +%atsymbol%294=~Scudo Maggiore di Lathander~ +%atsymbol%293=~Distruzione (Necromanzia) +Livello: 7 +Sfera: Guarigione +Raggio di azione: Tocco +Durata: Istantanea +Tempo di lancio: 1 round +Area di effetto: Sacerdote +Tiro-salvezza: Speciale +Questo incantesimo distrugge istantaneamente un bersaglio, riducendolo in piccoli pezzi. Alla vittima è concesso un tiro-salvezza contro morte a -4; se riesce, il bersaglio subisce 8d6 danni invece di essere distrutto. Distruzione può essere lanciato solo da personaggi malvagi. Da notare che un personaggio colpito da un incantesimo di Distruzione non può essere riportato in vita né con un incantesimo Rianimare morti né con Resurrezione.~ +%atsymbol%292=~Distruzione~ +%atsymbol%291=~Incantesimo Inefficace~ +%atsymbol%290=~Inviolabilità Sacra della Mente +(Scongiurazione) +Livello: 7 +Sfera: Protezione +Raggio d'azione: 0 +Durata: 1 turno per livello +Tempo di lancio: 9 +Area d'effetto: Il lanciatore +Tiro-salvezza: Nessuno +Questo incantesimo rafforza la mente del lanciatore contro ogni possibile influenza esterna. Charme, Confusione, Paura, Regressione Mentale, Blocco, Sonno, Berserk e Intossicazione non avranno effetto sul personaggio finché l'incantesimo è attivo.~ +%atsymbol%289=~Inviolabilità Sacra della Mente~ +%atsymbol%288=~Simbolo, Disperazione +(Evocazione/Attrazione) +Livello: 7 +Sfera: Guardia +Raggio d'azione: Visuale del lanciatore +Durata: 2 turni +Tempo di lancio: 3 +Area d'effetto: Raggio di 4,5 metri +Tiro-salvezza: Neg. +Simbolo, Disperazione è un potente incantesimo che consente al personaggio di scrivere un simbolo sul suolo o su un'altra superficie. Il simbolo vi rimarrà finché un avversario non si avvicina troppo ad esso; a quel punto esploderà, costringendo tutti i nemici nell'area d'effetto ad effettuare con successo un tiro-salvezza contro Incantesimi con una penalità pari a -2 per non restare fermi, sopraffatti dallo scoramento e da una sensazione di abbandono. Le vittime dell'incantesimo non si sposteranno per difendersi dagli attacchi. Questo incantesimo annulla gli effetti di Emozione: Speranza se lanciato nell'area in cui esso ha effetto.~ +%atsymbol%287=~Simbolo, Disperazione~ +%atsymbol%286=~Dolori Allucinanti~ +%atsymbol%285=~Simbolo, Dolore +(Evocazione/Attrazione) +Livello: 7 +Sfera: Guardia +Raggio d'azione: Visuale del lanciatore +Durata: 11 turni +Tempo di lancio: 3 +Area d'effetto: Raggio di 4,5 metri +Tiro-salvezza: Neg. +Tutte i nemici nel raggio di 4,5 metri dal Simbolo di Dolore quando viene lanciato devono effettuare un tiro-salvezza contro Incantesimi. Coloro che falliscono sono sopraffatti dal dolore, subendo una penalità pari a -4 ai loro tiri per colpire e -2 alla Destrezza e alla Classe Armatura.~ +%atsymbol%284=~Simbolo, Dolore~ +%atsymbol%283=~Ira Spirituale +(Invocazione) +Livello: 6 +Sfera: Combattimento +Raggio d'azione: Visuale del lanciatore +Durata: Istantanea +Tempo di lancio: 2 +Area d'effetto: Speciale +Tiro-salvezza: 1/2 +Dopo avere completato questo incantesimo, il personaggio diventa la fonte di una potente energia spirituale che si espande da lui in quattro direzioni, come fulmini. Tutte le creature lungo il percorso del fulmine subiscono 4d10 punti di danno da magia (un tiro-salvezza contro Incantesimi effettuato con successo dimezza gli effetti). Le creature dello stesso allineamento morale del lanciatore (buono, neutrale, malvagio) non sono soggette all'incantesimo.~ +%atsymbol%282=~Ira spirituale~ +%atsymbol%281=~Turbine +(Invocazione) +Livello: 6 +Sfera: Elementale (Aria) +Raggio d'azione: Visuale del lanciatore +Durata: Speciale +Tempo di lancio: 9 +Area d'effetto: Speciale +Tiro-salvezza: Speciale +Questo incantesimo crea un piccolo turbine vicino al campo visivo del lanciatore. Il turbine si sposterà in maniera casuale in qualsiasi direzione, ferendo alleati e nemici allo stesso modo. Il lanciatore è immune al suo stesso incantesimo e gli elementali e le creature enormi lo sono altrettanto. Se una creatura entra nel percorso del ciclone, subisce 2d8 punti di danno contundente, 2d8 punti di danno tagliente e deve effettuare con successo un tiro-salvezza contro Soffio o rimanere stordita per 2 round. Le creature con 2 Dadi-vita o meno vengono uccise automaticamente da questo incantesimo. Un massimo di otto bersagli può essere soggetto all'incantesimo, dopodiché il turbine si dissiperà.~ +%atsymbol%280=~Turbine~ +%atsymbol%279=~Scudo di Entropia +(Scongiurazione) +Livello: 6 +Sfera: Protezione +Raggio d'azione: 0 +Durata: 1 round per livello +Tempo di lancio: 9 +Area d'effetto: Il lanciatore +Tiro-salvezza: Nessuno +Quando viene lanciato, questo incantesimo circonda il personaggio con un vortice caotico di energia che blocca o deflette la maggior parte degli attacchi. Ciò conferisce al lanciatore un bonus pari a +6 alla Classe Armatura, un bonus pari a +2 ai tiri-salvezza e il 50% di resistenza all'elettricità, fuoco, freddo e acido. È anche immune all'incantesimo Colonna di Fuoco e agli attacchi basati su proiettili, inclusi quelli creati da magie come Dardo Incantato.~ +%atsymbol%278=~Scudo di Entropia~ +%atsymbol%277=~Causa Ferite Leggere di Massa +(Necromanzia) +Livello: 5 +Sfera: Guarigione +Raggio d'azione: 0 +Durata: Istantanea +Tempo di lancio: 5 +Area d'effetto: Raggio di 4,5 metri +Tiro-salvezza: 1/2 +Lanciando questo incantesimo, il personaggio infligge 1d8+1 punti di danno per livello di esperienza del lanciatore ai nemici nelle vicinanze. Un tiro-salvezza contro Incantesimi effettuato con successo dimezza il danno. Questo incantesimo non ha effetto su non morti, costrutti o creature extraplanari. Può essere lanciato solo da personaggi di allineamento malvagio.~ +%atsymbol%276=~Causa Ferite Leggere di Massa~ +%atsymbol%275=~Furia Animale +(Incantamento) +Livello: 5 +Sfera: Combattimento +Raggio d'azione: Tocco +Durata: 15 round +Tempo di lancio: 8 +Area di effetto: 1 creatura +Tiro-salvezza: Nessuno +Questo incantesimo infonde nel bersaglio una ferocia animale. La creatura riceve una Forza pari a 19, +20 Punti Ferita, +20% al Fattore-movimento e un bonus pari a +2 a tutti i tiri-salvezza. Il bersaglio perde la capacità di lanciare incantesimi mentre Furia Animale è attiva; quando avvista i nemici, li attaccherà immediatamente in mischia, usando qualunque cosa abbia in mano. Mentre questo incantesimo è attivo, c'è il 5% di possibilità per round che il bersaglio cada in stato Berserk, attaccando amici e nemici allo stesso modo.~ +%atsymbol%274=~Furia Animale~ +%atsymbol%273=~Interdizione ai Non morti +(Necromanzia) +Livello: 5 +Sfera: Guardia +Raggio d'azione: 0 +Durata: 1 turno +Tempo di lancio: 7 +Area d'effetto: Raggio di 3 metri +Tiro-salvezza: Nessuno +Questo incantesimo amplifica l'influenza che un personaggio ha sui non morti, sebbene sia legata all'area che lo circonda al momento del lancio e non si sposti. Qualsiasi creatura non morta che entri nell'area d'effetto viene scacciata come se lo avesse fatto il lanciatore dell'incantesimo. Se lo scacciare fallisce, la creatura è immune ad ulteriori tentativi di scacciare da parte dell'incantesimo a meno che non abbandoni e poi rientri nell'area d'effetto.~ +%atsymbol%272=~Interdizione ai Non morti~ +%atsymbol%271=~Scudo di Lathander +(Evocazione) +Livello: 5 +Sfera: Guardia +Raggio d'azione: Tocco +Durata: 2 turni +Tempo di lancio: 8 +Area d'effetto: 1 creatura +Tiro-salvezza: Nessuno +Finché resta attivo, questo incantesimo conferisce ad un bersaglio immunità ai danni. Le creature malvagie non possono essere protette da uno Scudo di Lathander. Questo incantesimo non può essere lanciato da personaggi di allineamento malvagio.~ +%atsymbol%270=~Scudo di Lathander~ +%atsymbol%269=~Rocce Aguzze +(Alterazione, Incantamento) +Livello: 5 +Sfera: Elementale (Terra) +Raggio d'azione: Visuale del lanciatore +Durata: 12 round +Tempo di lancio: 6 +Area d'effetto: Raggio di 2,5 metri +Tiro-salvezza: Speciale +Questo incantesimo deforma le rocce circostanti, rimodellando il terreno in spuntoni acuminati che si mescolano con l'ambiente circostante. Ogni creatura che entra nell'area d'effetto subisce 2d4 punti di danno perforante per round e deve effettuare con successo un tiro-salvezza contro Incantesimi o subire una riduzione del Fattore-movimento del 30%.~ +%atsymbol%268=~Rocce Aguzze~ +%atsymbol%267=~Giusta Ira dei Fedeli +(Incantamento/Charme) +Livello: 5 +Sfera: Combattimento +Raggio d'azione: 0 +Durata: 1 round per livello +Tempo di lancio: 8 +Area d'effetto: Raggio di 5 metri +Tiro-salvezza: Nessuno +Questo incantesimo conferisce una sorta di follia divina agli alleati del lanciatore, migliorando le loro abilità in combattimento. Tutti gli alleati del personaggio all'interno dell'area d'effetto guadagnano un bonus pari a +1 ai tiri per colpire e ai tiri-salvezza, più un bonus pari a 8 Punti Ferita per tutta la durata dell'incantesimo (questi Punti Ferita possono superare i Punti Ferita Massimi del personaggio). In particolare, tutti gli alleati del medesimo allineamento del lanciatore ottengono un attacco addizionale per round (cancellando gli effetti dell'incantesimo Velocità), immunità agli incantesimi di Charme e di Blocco e un bonus pari a +2 ai tiri per colpire, al danno e ai tiri-salvezza. Chiunque sia affetto da Giusta Ira dei Fedeli diventerà stanco quando gli effetti dell'incantesimo termineranno.~ +%atsymbol%266=~Giusta Ira dei Fedeli~ +%atsymbol%265=~Muro di Luce Lunare +(Invocazione) +Livello: 4 +Sfera: Protezione, Sole +Raggio d'azione: Visuale del lanciatore +Durata: 1 turno +Tempo di lancio: 7 +Area d'effetto: Un muro lungo 2,5 metri e largo mezzo metro +Tiro-salvezza: Nessuno +Questo incantesimo invoca uno scintillante arazzo di forza color bianco-blu. Questa parete non è tagliabile, non richiede agganci fisici e può essere facilmente attraversata. Le creature malvagie che la attraversano subiscono 2d10 punti di danno da magia; le creature non morte malvagie subiscono 5d10 punti di danno. Una creatura che attraversa il muro può subirne solo una volta i danni.~ +%atsymbol%264=~Muro di Luce Lunare~ +%atsymbol%263=~Raffica di Spine +(Alterazione) +Livello: 4 +Sfera: Vegetale +Raggio d'azione: 9 metri +Durata: Istantanea +Tempo di lancio: 3 +Area d'effetto: Cono di 5 metri con arco di 90° +Tiro-salvezza: 1/2 +Mediante questo incantesimo, il lanciatore fa sì che una raffica di punte, aculei, rovi e spine scaturisca dalla sua mano. La raffica di spine copre un cono di 5 metri di lunghezza, infliggendo 2d10 punti di danno perforante a tutte le creature nell'area d'effetto o 1d10 punti di danno se un tiro-salvezza contro Morte viene effettuato con successo.~ +%atsymbol%262=~Raffica di Spine~ +%atsymbol%261=~Privo di Sensi~ +%atsymbol%260=~Onda Devastante +(Invocazione) +Livello: 4 +Sfera: Elementale (Acqua) +Raggio d'azione: 30 metri +Durata: Istantanea +Tempo di lancio: 9 +Area d'effetto: Speciale +Tiro-salvezza: Speciale +Questo incantesimo evoca una grande onda d'acqua di 1,5 metri che si muove nella direzione indicata dal lanciatore, colpendo con enorme potenza tutto ciò che si trova sulla sua strada. L'onda infligge 4d10 punti di danno contundente; in aggiunta a ciò, le creature colpite possono essere stordite (25% di possibilità) o rese prive di sensi (5% di possibilità) per 2 round. Se la creatura colpita effettua con successo un tiro-salvezza contro Soffio, i danni vengono dimezzati e la creatura evita di rimanere stordita o di perdere i sensi.~ +%atsymbol%259=~Onda Devastante~ +%atsymbol%258=~Randello di Metallo Stellare~ +%atsymbol%257=~Randello di Metallo Stellare~ +%atsymbol%256=~Randello di Metallo Stellare +(Evocazione) +Livello: 4 +Sfera: Combattimento +Raggio d'azione: 0 +Durata: 3 turni +Tempo di lancio: 7 +Area d'effetto: Il lanciatore +Tiro-salvezza: Nessuno +Questo incantesimo crea una clava magica di ferro meteoritico che infligge 1d6+2 punti di danno contundente, conferisce un bonus pari a +2 ai tiri per colpire e viene considerata come un'arma +4 per determinare ciò che può colpire. I bonus e le penalità di Forza, competenza e specializzazione si applicano normalmente. La clava infligge ulteriori 2d6 punti di danno contundente contro creature innaturali (non morti, elementali, golem, creature extraplanari ecc.).~ +%atsymbol%255=~Randello di Metallo Stellare~ +%atsymbol%254=~Resistenza Infallibile +(Necromanzia) +Livello: 4 +Sfera: Necromanzia +Raggio di azione: Tocco +Durata: Istantanea +Tempo di lancio: 9 +Area di effetto: 1 creatura +Tiro-salvezza: Nessuno +Questo incantesimo ripristina le energie della creatura toccata, eliminando qualsiasi fatica.~ +%atsymbol%253=~Resistenza Infallibile~ +%atsymbol%252=~Nube Pestilenziale +(Alterazione) +Livello: 4 +Sfera: Combattimento, Elementale (Aria) +Raggio d'azione: Visuale del lanciatore +Durata: 4 round +Tempo di lancio: 7 +Area d'effetto: Raggio di 3,5 metri +Tiro-salvezza: Neg. +Questo incantesimo trasforma l'aria in un raggio di 3,5 metri in una fetida nebbia grigiastra. Il lanciatore e le creature non viventi sono immuni agli effetti della nube. Per ogni round di esposizione a quest'aria carica di malattie, una creatura deve effettuare con successo un tiro-salvezza contro Soffio o subire 3 punti di danno da magia, cecità e la perdita di 3 punti di Forza e di Destrezza. Questi effetti durano 1 turno. Nube Pestilenziale può essere lanciato solo da personaggi di allineamento malvagio.~ +%atsymbol%251=~Nube Pestilenziale~ +%atsymbol%250=~Stordito~ +%atsymbol%249=~Guarito~ +%atsymbol%248=~Furia Sanguinaria +(Alterazione) +Livello: 4 +Sfera: Combattimento +Raggio d'azione: Visuale del lanciatore +Durata: 2 turni +Tempo di lancio: 7 +Area d'effetto: 1 creatura +Tiro-salvezza: Nessuno +Questo incantesimo funziona solo sui personaggi giocanti o sulle creature alleate. Quando viene lanciato, il bersaglio di questo incantesimo cade in preda ad una furia berserk, attaccando la creatura più vicina finché questa non muore e spostandosi in seguito verso il bersaglio successivo. Mentre Furia Sanguinaria è attiva, il bersaglio è immune a Charme, Sonno, Paura, Blocco, Stordimento, Confusione, Emozione, incantesimi di simbolo ed effetti simili. In aggiunta a ciò, il bersaglio riceve i seguenti bonus: +2 ai tiri per colpire, +3 al danno, +2 alla Forza, 10 Punti Ferita e +2 al Fattore-movimento. L'incantesimo ha tuttavia diversi svantaggi: i Punti Ferita del bersaglio sono coperti per la durata dell'incantesimo e il bersaglio non può beneficiare di nessun effetto che curi i Punti Ferita. Alla fine della durata dell'incantesimo, il bersaglio diventa affaticato e la sua Forza scende a 3 per 2 turni. Furia Sanguinaria non può avere effetto su creature di allineamento legale e non può essere lanciata da creature del suddetto allineamento.~ +%atsymbol%247=~Furia Sanguinaria~ +%atsymbol%246=~Recitare +(Scongiurazione, Evocazione/Attrazione) +Livello: 4 +Sfera: Combattimento +Raggio d'azione: 0 +Durata: 1 round per livello +Tempo di lancio: 7 +Area d'effetto: Raggio di 7,5 metri +Tiro-salvezza: Nessuno +Recitando un passo o un versetto sacro, il personaggio invoca la benedizione della propria divinità su di sé e sui suoi alleati mentre semina confusione e debolezza sui suoi nemici. Gli alleati del personaggio ottengono un bonus pari a +2 ai loro tiri per colpire e ai loro tiri-salvezza, mentre i suoi nemici ricevono una penalità pari a -2 agli stessi tiri. Recitare non annulla l'incantesimo Preghiera: i due incantesimi possono essere utilizzati insieme e gli effetti sono cumulativi.~ +%atsymbol%245=~Recitare~ +%atsymbol%244=~Scarica di elettricità statica~ +%atsymbol%243=~Scarica Elettrostatica +(Alterazione) +Livello: 4 +Sfera: Tempo atmosferico +Raggio d'azione: 0 +Durata: 1 turno per livello +Tempo di lancio: 9 +Area d'effetto: Visuale del lanciatore +Tiro-salvezza: 1/2 +Scarica Elettrostatica è simile a Invocare il Fulmine, tranne per il fatto che può essere utilizzato anche in luoghi chiusi. Questo incantesimo permette al lanciatore di generare una scarica elettrostatica su una qualunque creatura si trovi all'interno dell'area d'effetto, infliggendo 2d8 punti di danno da elettricità più 1d8 punti di danno addizionale per livello del personaggio (un tiro-salvezza contro Incantesimi effettuato con successo dimezza il danno). La scarica continua a sprigionarsi una volta per turno per tutta la durata dell'incantesimo.~ +%atsymbol%242=~Scarica Elettrostatica~ +%atsymbol%241=~Creare Fuoco +(Alterazione) +Livello: 4 +Sfera: Elementale (Fuoco) +Raggio d'azione: Visuale del lanciatore +Durata: 1 round +Tempo di lancio: 7 +Area d'effetto: Raggio di 1,5 metri +Tiro-salvezza: Nessuno +Quando questo incantesimo viene lanciato, dal bersaglio selezionato esplodono delle fiamme, infliggendo 1d4 punti di danno da fuoco più 1 punto per livello del lanciatore a tutte le creature nel raggio d'effetto dell'incantesimo. Le creature subiranno il danno una volta al round a prescindere da quando entreranno nell'area d'effetto.~ +%atsymbol%240=~Creare Fuoco~ +%atsymbol%239=~Favore di Ilmater +(Necromanzia) +Livello: 3 +Sfera: Necromanzia, Protezione +Raggio d'azione: 9 metri +Durata: Istantaneo +Tempo di lancio: 6 +Area d'effetto: 1 creatura +Tiro-salvezza: Nessuno +Pronunciando questo incantesimo, il personaggio scambia la sua forza vitale con quella del destinatario, scambiando tutte le ferite fisiche. L'incantesimo funzionerà solo se il lanciatore ha più Punti Ferita del bersaglio nel momento in cui si svolge lo scambio. Lo scambio è permanente fino a quando il personaggio non usa altri metodi per curare il danno e può essere effettuato da una certa distanza, sempre rimanendo entro i limiti di raggio d'azione dell'incantesimo. Solo i Punti Ferita vengono scambiati; il lanciatore non può farsi carico di altre condizioni del bersaglio come Malattia, Veleno, Intossicazione o simili afflizioni. +Questo incantesimo non ha effetto su non morti, costrutti e creature extraplanari. Non può essere lanciato da personaggi di allineamento malvagio.~ +%atsymbol%238=~Favore di Ilmater~ +%atsymbol%237=~Causa Ferite Medie +(Necromanzia) +Livello: 3 +Sfera: Guarigione +Raggio d'azione: Tocco +Durata: Istantanea +Tempo di lancio: 5 +Area d'effetto: 1 creatura +Tiro-salvezza: 1/2 +Lanciando questo incantesimo e toccando una creatura, il sacerdote infligge 14 punti di danno (un tiro-salvezza contro Incantesimi effettuato con successo dimezza il danno) al corpo della creatura. Questo incantesimo non ha effetto su non morti, costrutti, o creature extraplanari. Causa Ferite Medie non può essere lanciato da personaggi di allineamento buono.~ +%atsymbol%236=~Causa Ferite Medie~ +%atsymbol%235=~Guscio di Tempesta +(Scongiurazione) +Livello: 3 +Sfera: Protezione, Tempo atmosferico +Raggio d'azione: 0 +Durata: 1 turno +Tempo di lancio: 6 +Area d'effetto: Il lanciatore +Tiro-salvezza: Nessuno +Questo incantesimo circonda il lanciatore con una luminosa sfera di energia perturbante che si sposta con lui. Il Guscio di Tempesta aumenta la Resistenza al Fuoco, Freddo ed Elettricità del lanciatore del 50%.~ +%atsymbol%234=~Guscio di Tempesta~ +%atsymbol%233=~Tocco della Muffa +(Alterazione) +Livello: 3 +Sfera: Vegetale +Raggio d'azione: Tocco +Durata: Speciale +Tempo di lancio: 6 +Area d'effetto: Raggio di 3 metri +Tiro-salvezza: Speciale +Questo incantesimo infetta una creatura toccata dal personaggio con una muffa marrone che si diffonde velocemente. Se la creatura infettata fallisce un tiro-salvezza contro Incantesimi, l'infezione è grave e la creatura subisce danno magico nel seguente modo: +1° round: 4d6 punti di danno +2° round: 3d6 punti di danno +3° round: 2d6 punti di danno +4° round: 1d6 punti di danno +Se il tiro-salvezza viene effettuato con successo, i danni vengono ridotti nel seguente modo: +1° round: 2d6 punti di danno +2° round: 1d6 punti di danno +3° round: 1d6 punti di danno +Ad ogni round dopo il primo, la creatura più vicina in un raggio di 3 metri dalla vittima deve effettuare con successo un tiro-salvezza contro Incantesimi o essere infettata dalla muffa con la massima potenza. Questo processo continua fino a quando la muffa non fallisce nell'infettare una vittima adatta in tempo. Le creature già soggette agli effetti della muffa non possono contrarla di nuovo. La muffa marrone muore rapidamente una volta che l'incantesimo è terminato.~ +%atsymbol%232=~Tocco della Muffa~ +%atsymbol%231=~Scroscio di Pioggia +(Invocazione) +Livello: 3 +Sfera: Elementale (Acqua) +Raggio d'azione: Visuale del lanciatore +Durata: 2 round +Tempo di lancio: 6 +Area d'effetto: Raggio di 5 metri +Tiro-salvezza: Nessuno +Questo incantesimo crea una pioggia magica che riempie l'area d'effetto. Tutte le creature del fuoco e del freddo subiscono 2d3 punti di danno da magia per round. In aggiunta a ciò, tutte le creature nell'area hanno una possibilità del 50% per round di essere colpite da fulmini che infliggono 2d6 punti di danno da elettricità, con un tiro-salvezza contro Incantesimi per dimezzare il danno. Gli incantesimi Lama Fiammeggiante, Sudario Fiammeggiante e le auree delle salamandre vengono estinti da Scroscio di Pioggia.~ +%atsymbol%230=~Scroscio di Pioggia~ +%atsymbol%229=~Crescita di Spine +(Alterazione) +Livello: 3 +Sfera: Elementale (Terra) +Raggio d'azione: Visuale del lanciatore +Durata: 1 turno +Tempo di lancio: 6 +Area d'effetto: Raggio di 4,5 metri +Tiro-salvezza: Nessuno +Questo incantesimo trasforma il terreno circostante in un ammasso di piante spinose. Qualsiasi creatura che entri nell'area subisce 1d4 punti di danno perforante e 1d4 punti di danno tagliente ad ogni round fino al termine dell'incantesimo.~ +%atsymbol%228=~Crescita di Spine~ +%atsymbol%227=~Cerchio di Ossa +(Necromanzia) +Livello: 3 +Sfera: Guardia, Creazione +Raggio d'azione: 0 +Durata: 3 round +Tempo di lancio: 3 round +Area d'effetto: Raggio di 90 centimetri +Tiro-salvezza: Nessuno +Questo incantesimo evoca una barriera di ossa fluttuanti che vortica rapidamente intorno al personaggio. Chiunque entri al suo interno subisce 1d6 punti di danno contundente e 1d6 punti di danno tagliente per round. Il lanciatore non può muoversi per la durata dell'incantesimo. Cerchio di Ossa non può essere lanciato dai personaggi di allineamento buono.~ +%atsymbol%226=~Cerchio di Ossa~ +%atsymbol%225=~Lama di luna~ +%atsymbol%224=~Lama di luna~ +%atsymbol%223=~Lama Lunare +(Invocazione) +Livello: 3 +Sfera: Combattimento, Sole +Raggio d'azione: 0 +Durata: 2 turni +Tempo di lancio: 6 +Area d'effetto: Il lanciatore +Tiro-salvezza: Nessuno +Questo incantesimo evoca un silente costrutto privo di peso, simile ad una spada e fatto di luce lunare che si estende fino a 120 centimetri dalla mano del personaggio. La lama lunare viene considerata un'arma +4 per determinare quali creature possa danneggiare, sebbene il bonus non venga applicato ai tiri per colpire. Inoltre, a causa della natura inconsistente della lama lunare, non vengono applicati i bonus della Forza per le armi da mischia. +Il colpo di una lama lunare risucchia la forza vitale del bersaglio, infliggendo 1d12+4 punti di danno da magia più 1d12 danni aggiuntivi ai non morti, i quali sono particolarmente sensibili ad essa. Un colpo messo a segno disturba temporaneamente la magia, provocando il fallimento di qualsiasi incantesimo lanciato dal bersaglio nel round successivo.~ +%atsymbol%222=~Lama Lunare~ +%atsymbol%221=~Sonno~ +%atsymbol%220=~Esaltazione +(Scongiurazione) +Livello: 3 +Sfera: Guarigione +Raggio d'azione: Tocco +Durata: 1 turno +Tempo di lancio: 9 +Area d'effetto: 1 creatura +Tiro-salvezza: Nessuno +Questo incantesimo consente al personaggio di soccorrere e di proteggere un qualsiasi individuo tranne se stesso. Con un tocco, il lanciatore rimuove effetti quali Paura, Sonno, Regressione Mentale, Incoscienza, Intossicazione, Berserk e Confusione. Inoltre, il destinatario viene protetto contro incantesimi e altri attacchi che causano questi effetti per tutta la durata dell'incantesimo.~ +%atsymbol%219=~Esaltazione~ +%atsymbol%218=~Causa Malattia +(Necromanzia) +Livello: 3 +Sfera: Guarigione +Raggio d'azione: Tocco +Durata: 8 ore +Tempo di lancio: 9 +Area d'effetto: 1 creatura +Tiro-salvezza: Neg. +Questo incantesimo infligge ad una creatura toccata dal personaggio una malattia che sottrae al bersaglio 5d4 punti di Forza. Un tiro-salvezza contro Incantesimi effettuato con successo nega gli effetti. Questo incantesimo non ha effetto su non morti, costrutti e creature extraplanari. Non può essere lanciato dai personaggi di allineamento buono.~ +%atsymbol%217=~Causa Malattia~ +%atsymbol%216=~Penalità in Combattimento~ +%atsymbol%215=~Bonus in Combattimento~ +%atsymbol%214=~Preghiera +(Evocazione/Attrazione) +Livello: 3 +Sfera: Combattimento +Raggio d'azione: 0 +Durata: 1 round per livello +Tempo di lancio: 6 +Area d'effetto: Raggio di 9 metri +Tiro-salvezza: Nessuno +Preghiera concede un beneficio al personaggio e ai suoi alleati e maledice i suoi nemici. Tutti gli attacchi, i danni e i tiri-salvezza delle creature alleate ottengono un bonus pari a +1, mentre quelli dei nemici subiscono una penalità pari a -1. Qualunque creatura si trovi nell'area d'effetto quando l'incantesimo viene lanciato continuerà ad esserne affetta anche dopo averla lasciata; pertanto, se i guerrieri vogliono inseguire il goblin che sta scappando, gli effetti della preghiera li seguiranno.~ +%atsymbol%213=~Preghiera~ +%atsymbol%212=~Causa Ferite Moderate +(Necromanzia) +Livello: 2 +Sfera: Guarigione +Raggio d'azione: Tocco +Durata: Istantanea +Tempo di lancio: 5 +Area d'effetto: 1 creatura +Tiro-salvezza: 1/2 +Lanciando questo incantesimo e toccando una creatura, il personaggio infligge 11 punti di danno al corpo della creatura (un tiro-salvezza contro Incantesimi effettuato con successo dimezza i danni). Questo incantesimo non ha effetto su non morti, costrutti e creature extraplanari. Non può essere lanciato dai personaggi di allineamento buono.~ +%atsymbol%211=~Causa Ferite Moderate~ +%atsymbol%210=~Artigli della Bestia~ +%atsymbol%209=~Artigli della Bestia~ +%atsymbol%208=~Artigli della Bestia +(Alterazione) +Livello: 2 +Sfera: Combattimento +Raggio d'azione: 0 +Durata: 1 turno +Tempo di lancio: 5 +Area di effetto: Il lanciatore +Tiro-salvezza: Nessuno +Questo incantesimo trasforma le mani del lanciatore negli artigli di una belva feroce, fornendo al personaggio una Forza pari a 18/72 e la capacità di graffiare un avversario per 2d4 punti di danno tagliente (+ il bonus derivante dalla Forza). Il lanciatore può attaccare due volte per round con gli artigli della bestia con un bonus pari a +2 ai tiri per colpire.~ +%atsymbol%207=~Artigli della Bestia~ +%atsymbol%206=~Circondato da un Alone Argentato (penalità alla CA di 2)~ +%atsymbol%205=~Lancia dell'Unicorno +(Invocazione) +Livello: 2 +Sfera: Combattimento +Raggio d'azione: Visuale del lanciatore +Durata: Istantanea +Tempo di lancio: 5 +Area d'effetto: 1 creatura +Tiro-salvezza: Speciale +Questo incantesimo crea una lancia parzialmente eterea con riflessi argentati dall'aspetto simile al corno di un unicorno. Il lanciatore sceglie un bersaglio e la lancia dell'unicorno viene immediatamente scagliata contro di esso, infliggendo 3d6 punti di danno perforante dimezzabili con un tiro-salvezza contro Incantesimi effettuato con successo. Sebbene la lancia dell'unicorno si dissolva dopo aver colpito, lascia sempre un alone argentato intorno al bersaglio che lo rende più facile da vedere e da colpire, infliggendogli una penalità pari a -2 alla sua Classe Armatura per 3 round.~ +%atsymbol%204=~Lancia dell'Unicorno~ +%atsymbol%203=~Guarito~ +%atsymbol%202=~Cura Ferite Moderate +(Necromanzia) +Livello: 2 +Sfera: Guarigione +Raggio d'azione: Tocco +Durata: Istantanea +Tempo di lancio: 5 +Area d'effetto: 1 creatura +Tiro-salvezza: Nessuno +Una versione più potente dell'incantesimo di 1° livello Cura Ferite Leggere, Cura Ferite Medie guarisce 11 Punti Ferita e cura l'Intossicazione. Questo incantesimo non ha effetto su non morti, costrutti o creature extraplanari.~ +%atsymbol%201=~Cura Ferite Moderate~ +%atsymbol%200=~Accecato~ +%atsymbol%199=~Bruciatura Solare +(Invocazione) +Livello: 1 +Sfera: Sole +Raggio d'azione: Visuale del lanciatore +Durata: Istantanea +Tempo di lancio: 4 +Area d'effetto: 1 creatura +Tiro-salvezza: 1/2 +Quando questo incantesimo viene lanciato, un brillante raggio di calore bruciante scende giù dal cielo e colpisce un bersaglio a scelta del personaggio. Qualsiasi creatura colpita dal raggio subisce 1d6 punti di danno più 1 punto per livello del lanciatore; tuttavia, se il bersaglio è un non morto o una creatura vulnerabile alla luce splendente, il danno è pari 1d6 punti più 2 danni per livello del lanciatore. Oltre a subire danni, le vittime rimangono accecate per 3 round. Al bersaglio è concesso un tiro-salvezza contro Incantesimi per dimezzare il danno ed evitare la cecità.~ +%atsymbol%198=~Bruciatura Solare~ +%atsymbol%197=~Causa Ferite Leggere +(Necromanzia) +Livello: 1 +Sfera: Guarigione +Raggio d'azione: Tocco +Durata: Istantanea +Tempo di lancio: 5 +Area d'effetto: 1 creatura +Tiro-salvezza: 1/2 +Lanciando questo incantesimo e toccando una creatura, il personaggio infligge 8 punti di danno al corpo della creatura (un tiro-salvezza contro Incantesimi effettuato con successo dimezza i danni). Questo incantesimo non ha effetto su non morti, costrutti e creature extraplanari. Non può essere lanciato dai personaggi di allineamento buono.~ +%atsymbol%196=~Causa Ferite Leggere~ +%atsymbol%195=~Maledetto~ +%atsymbol%194=~Maledizione +(Evocazione/Attrazione) +Livello: 1 +Sfera: Tutte +Raggio d'azione: Visuale del lanciatore +Durata: 6 round +Tempo di lancio: 9 +Area d'effetto: Raggio di 4,5 metri +Tiro-salvezza: Nessuno +Quando mormora l'incantesimo Maledizione, il personaggio abbassa il morale dei nemici e infligge una penalità pari a -1 ai loro tiri-salvezza e ai loro tiri per colpire. Nell'istante in cui il lancio dell'incantesimo viene completato, esso influenza tutte le creature in un raggio di 4,5 metri centrato nel punto scelto dal personaggio. Le creature colpite dall'incantesimo che lasciano l'area sono ancora soggette ai suoi effetti; coloro che vi entrano in seguito non lo sono.~ +%atsymbol%193=~Maledizione~ +%atsymbol%192=~Occhio di Pietra +Questa sfera difende l'incantatore da un singolo attacco di pietrificazione. +Alternativamente può anche essere usata come incantesimo arcano di livello 3 Blocca Persone, immobilizzando creature umanoidi di taglia umana o più piccola per 1 round/livello (tiro-salvezza contro Incantesimi nega gli effetti).~ +%atsymbol%191=~Occhio di Pietra~ +%atsymbol%190=~Occhio dello Spirito +Questa sfera blocca gli attacchi magici che causano istantaneamente la morte (Incantesimo della Morte, Dito della Morte, Parola del Potere: Uccidere, Togliere la Vita, Disintegrazione). +Alternativamente l'incantatore può anche scegliere di usare il potere della sfera come l'incantesimo arcano di livello 2 Raggio di Indebolimento, riducendo la forza del bersaglio al valore di 5 (tiro-salvezza contro Incantesimi nega gli effetti).~ +%atsymbol%189=~Occhio dello Spirito~ +%atsymbol%188=~Occhio della Forza d'Animo +Questa sfera blocca per una sola volta gli effetti di stordimento, sordità, cecità o silenzio. +Alternativamente può anche essere usata come incantesimo arcano di livello 4 Grido, causando 4d6 danni magici e assordando tutte le creature nel raggio di 11 metri dall'incantatore (tiro-salvezza contro Incantesimi dimezza i danni e nega la sordità).~ +%atsymbol%187=~Occhio della Tempra~ +%atsymbol%186=~Occhio del Veleno +Questa sfera blocca ogni attacco o azione che potrebbe avvelenare l'incantatore. +La sfera può essere usata come l'incantesimo divino di livello 4 Veleno, causando 20 punti di danno a una creatura nell'arco di 20 secondi (Tiro-salvezza contro Veleno nega gli effetti).~ +%atsymbol%185=~Occhio del Veleno~ +%atsymbol%184=~Occhio della Spada +Questa sfera deflette il primo attacco fisico andato a segno contro l'incantatore. +La sfera può essere usata come l'incantesimo arcano di livello 1 Dardo Incantato, creando sino a cinque proiettili (uno ogni due livelli di esperienza dopo il primo) che causano ognuno 1d4+1 danni al bersaglio quando vanno a segno.~ +%atsymbol%183=~Occhio della Spada~ +%atsymbol%182=~Occhio del Mago +Questa sfera assorbe un attacco d'energia da fuoco, elettricità, da freddo o acido. +La sfera può essere usata come l'incantesimo arcano di livello 3 Fulmine, causando 1d6 danni elettrici per livello (fino a un massimo di 10d6) a tutte le creature sulla sua traiettoria.~ +%atsymbol%181=~Occhio del Mago~ +%atsymbol%180=~Occhio della Mente +Questa sfera protegge l'incantatore da attacchi mentali come charme, emozione e paura. +La sfera può essere usata come l'incantesimo arcano di livello 1 Charme, ponendo una creatura umanoide sotto il controllo dell'incantatore per 1 turno (tiro-salvezza contro Incantesimi nega gli effetti).~ +%atsymbol%179=~Occhio della Mente~ +%atsymbol%178=~Non puoi lanciare questo incantesimo finché l'attuale lancio non è terminato.~ +%atsymbol%177=~Sette Occhi +(Scongiurazione) +Livello: 7 +Raggio d'azione: 0 +Durata: 2 turni +Tempo di lancio: 7 +Area d'effetto: Il lanciatore +Tiro-salvezza: Nessuno +Questo incantesimo evoca sette sfere magiche che fluttuano intorno alla testa del lanciatore. Ogni occhio ha un'abilità offensiva e difensiva; se una volta che l'una o l'altra viene usata, l'occhio perde il suo potere. I poteri di ciascun occhio sono descritti di seguito. +Occhio della Mente: Questo occhio protegge il personaggio dagli attacchi mentali come Charme, Emozione e Paura. L'occhio può essere impiegato come l'incantesimo arcano di 1° livello Charme, portando una creatura umanoide sotto il controllo del lanciatore (un tiro-salvezza contro Incantesimi nega l'effetto). +Occhio della Spada: Questo occhio devia il primo attacco fisico che colpisce il lanciatore. L'occhio può essere impiegato come l'incantesimo arcano di 1° livello Dardo Incantato, creando sino a cinque dardi (uno ogni 2 livelli di esperienza dopo il 1°), ciascuno dei quali infligge 1d4+1 punti di danno da magia. +Occhio del Mago: Questo occhio assorbe una manifestazione di danno da fuoco, elettricità, freddo o acido. L'occhio può essere impiegato come l'incantesimo arcano di 3° Fulmine, infliggendo 1d6 punti di danno da elettricità per livello (sino a un massimo di 10d6) a tutte le creature lungo il suo percorso. +Occhio del Veleno: Questo occhio blocca un attacco o un effetto che potrebbe avvelenare il lanciatore. L'occhio può essere impiegato come l'incantesimo divino di 4° livello Veleno, infliggendo 20 punti di danno ad una creatura per 20 secondi (un tiro-salvezza contro Veleno effettuato con successo nega gli effetti). +Occhio dello Spirito: Questo occhio blocca un attacco magico di morte istantanea (Incantesimo della Morte, Dito della Morte, Parola del Potere: Uccidere, Togliere la Vita, Distruzione). L'occhio può essere impiegato come l'incantesimo arcano di 2° livello Raggio di Indebolimento, riducendo la Forza del bersaglio a 5 (un tiro-salvezza contro Incantesimi nega gli effetti). +Occhio della Tempra: Questo occhio blocca un effetto di Stordimento, Sordità, Cecità o Silenzio. L'occhio può essere impiegato come l'incantesimo arcano di 4° livello Grido, infliggendo 4d6 punti di danno da magia e assordando le creature in un cono di 9 metri (un tiro-salvezza contro Incantesimi effettuato con successo dimezza il danno e nega la sordità). +Occhio di Pietra: Questo occhio protegge il lanciatore da un singolo attacco di Pietrificazione. L'occhio può essere impiegato come l'incantesimo arcano di 3° livello Blocca Persone, rendendo immobili umanoidi di taglia normale o più piccola per 1 round per livello (un tiro-salvezza contro Incantesimi effettuato con successo nega gli effetti).~ +%atsymbol%176=~Sette Occhi~ +%atsymbol%175=~Furia di Malavon +(Apparizione) +Livello: 7 +Raggio d'azione: 0 +Durata: Istantanea +Tempo di lancio: 1 +Area d'effetto: 2 metri +Tiro-salvezza: 1/2 +Furia di Malavon fu creata dallo stregone drow Malavon. Questo incantesimo scaglia dardi di pura energia dal corpo del lanciatore in ogni direzione, ferendo sia i nemici sia gli alleati. Le piccole saette magiche infliggono 20d4 punti di danno perforante a chiunque si trovi sulla traiettoria. Questo incantesimo è particolarmente utile quando il personaggio è circondato dai nemici.~ +%atsymbol%174=~Furia di Malavon~ +%atsymbol%173=~Colpo vorpal~ +%atsymbol%172=~Morte~ +%atsymbol%171=~Non morto distrutto~ +%atsymbol%170=~Planare esterno distrutto~ +%atsymbol%169=~Ombre +(Illusione/Visione) +Livello: 6 +Raggio d'azione: Visuale del lanciatore +Durata: 1 round per livello +Tempo di lancio: 6 +Area d'effetto: Speciale +Tiro-salvezza: Nessuno +Ombre è simile agli incantesimi Mostri d'Ombra e Mostri d'Ombra Potenziati. Permette al lanciatore di plasmare materia dal Semipiano delle Ombre in illusioni di mostri. Le ombre sono più forti di quelle evocate con gli incantesimi Mostri d'Ombra e Mostri d'Ombra Potenziati e obbediranno al lanciatore fino al termine dell'incantesimo o finché non vengono distrutte.~ +%atsymbol%168=~Ombre~ +%atsymbol%167=~Tocco del Lich~ +%atsymbol%166=~Tocco del Lich~ +%atsymbol%165=~Tocco del Lich +(Necromanzia) +Livello: 6 +Raggio d'azione: Tocco +Durata: 1 round per livello +Tempo di lancio: 6 +Area d'effetto: Il lanciatore +Tiro-salvezza: Speciale +Questo incantesimo conferisce i poteri e le immunità di un lich al lanciatore. Il personaggio diventa immune a Paralisi e Paura per tutta la durata dell'incantesimo e le sue mani irradiano una sovrannaturale luce blu che infligge 1d10 punti di danno da freddo al bersaglio, paralizzandolo se fallisce un tiro-salvezza contro Paralisi. Questo incantesimo non ha alcun effetto sui non morti.~ +%atsymbol%164=~Tocco del Lich~ +%atsymbol%163=~Dissolvi Effetti~ +%atsymbol%162=~Barriera Anti-magia +(Scongiurazione) +Livello: 6 +Raggio d'azione: 0 +Durata: 1 turno per livello +Tempo di lancio: 1 +Area d'effetto: Il lanciatore +Tiro-salvezza: Nessuno +Questo incantesimo circonda il lanciatore con una barriera invisibile che si sposta con lui. Tale barriera lo rende immune a qualunque attacco magico, ma gli impedisce di lanciare incantesimi all'esterno. +Barriera Anti-magia dissolve anche Sordità e Regressione Mentale del personaggio.~ +%atsymbol%161=~Barriera Anti-magia~ +%atsymbol%160=~Uomo-lucertola Robusto~ +%atsymbol%159=~Goblin Élite~ +%atsymbol%158=~Goblin Élite~ +%atsymbol%157=~Mostri d'Ombra Potenziati +(Illusione/Visione) +Livello: 5 +Raggio d'azione: Visuale del lanciatore +Durata: 1 round per livello +Tempo di lancio: 5 +Area d'effetto: Speciale +Tiro-salvezza: Nessuno +Questo incantesimo è simile a quello di 4° livello Mostri d'Ombra, tranne per il fatto che le creature evocate sono molto più potenti.~ +%atsymbol%156=~Mostri d'Ombra Potenziati~ +%atsymbol%155=~Arma Troll~ +%atsymbol%154=~Troll~ +%atsymbol%153=~Troll~ +%atsymbol%152=~Mostri d'Ombra +(Illusione/Visione) +Livello: 4 +Raggio d'azione: Visuale del lanciatore +Durata: 1 round per livello +Tempo di lancio: 4 +Area d'effetto: Speciale +Tiro-salvezza: Nessuno +Questo incantesimo modella in mostri illusori materiale del Semipiano delle Ombre. Fino a sei mostri possono essere evocati in una sola volta, ma il totale dei loro Dadi-vita di norma non supererà il livello del lanciatore.~ +%atsymbol%151=~Mostri d'Ombra~ +%atsymbol%150=~Velocizzato~ +%atsymbol%149=~Lentezza~ +%atsymbol%148=~Rallentato~ +%atsymbol%147=~Ritirata Rapida +(Alterazione) +Livello: 1 +Raggio d'azione: 0 +Durata: 3 round +Tempo di lancio: 1 +Area d'effetto: Il lanciatore +Tiro-salvezza: Nessuno +Questo incantesimo raddoppia il normale Fattore-movimento del personaggio per un breve periodo di tempo... di solito abbastanza a lungo da scappare. Altri effetti che alterano il movimento, come Velocità e Lentezza, non possono avere effetto sul lanciatore mentre questo incantesimo è attivo. Finché gli effetti di Ritirata Rapida sono attivi, il personaggio non può attaccare, lanciare incantesimi o usare abilità speciali... Può solo scappare.~ +%atsymbol%146=~Ritirata Rapida~ +%atsymbol%145=~Spada di Mordenkainen~ +%atsymbol%144=~Spada di Mordenkainen~ +%atsymbol%143=~Spada di Mordenkainen +(Apparizione) +Livello: 7 +Raggio d'azione: Visuale del lanciatore +Durata: 1 round per livello +Tempo di lancio: 7 +Area d'effetto: Speciale +Tiro-salvezza: Nessuno +Questo incantesimo evoca un campo di forza luminoso a forma di spada che può essere mentalmente manovrato dal lanciatore. Colpisce come se fosse brandita da un guerriero il cui livello è la metà di quello del lanciatore e, nonostante sia tenuta nella mano del lanciatore, può colpire creature in qualsiasi punto nella visuale del personaggio. Benché la spada non abbia bonus al danno, può ferire creature normalmente colpibili solo da armi +2 o meno ed infligge 5d6 punti di danno tagliente ad ogni colpo.~ +%atsymbol%142=~Spada di Mordenkainen~ +%atsymbol%141=~Elementale dell'Acqua~ +%atsymbol%140=~Elementale dell'Acqua~ +%atsymbol%139=~Evocare Elementale dell'Acqua +(Evocazione/Attrazione) +Livello: 5 +Raggio d'azione: Visuale del lanciatore +Durata: 1 turno per livello +Tempo di lancio: 9 +Area d'effetto: Speciale +Tiro-salvezza: Nessuno +Questo incantesimo permette al lanciatore di evocare un elementale con 8 DV dal Piano Elementale dell'Acqua e di sottometterlo alla sua volontà. Questo elementale combatterà al fianco del personaggio fino al termine dell'incantesimo o finché non viene distrutto.~ +%atsymbol%138=~Evocare Elementale dell'Acqua~ +%atsymbol%137=~Elementale dell'Aria~ +%atsymbol%136=~Elementale dell'Aria~ +%atsymbol%135=~Evocare Elementale dell'Aria +(Evocazione/Attrazione) +Livello: 5 +Raggio d'azione: Visuale del lanciatore +Durata: 1 turno per livello +Tempo di lancio: 9 +Area d'effetto: Speciale +Tiro-salvezza: Nessuno +Questo incantesimo consente al lanciatore di evocare un elementale con 8 Dadi-vita dal Piano Elementale dell'Aria e di legarlo alla sua volontà. Questa creatura combatterà al suo fianco sino al termine dell'incantesimo o finché non verrà distrutta.~ +%atsymbol%134=~Evocare Elementale dell'Aria~ +%atsymbol%133=~Elementale del Fuoco~ +%atsymbol%132=~Elementale del Fuoco~ +%atsymbol%131=~Evocare Elementale del Fuoco +(Evocazione/Attrazione) +Livello: 5 +Raggio d'azione: Campo visivo dello stregone +Durata: 1 turno per livello +Tempo di lancio: 1 round +Area d'effetto: Speciale +Tiro-salvezza: Nessuno +Questo incantesimo permette allo stregone di evocare un elementale dal Piano Elementale del Fuoco e di sottometterlo al suo volere. Questo elementale combatterà per lo stregone fino al termine dell'incantesimo o fino alla sua distruzione.~ +%atsymbol%130=~Evocare Elementale del Fuoco~ +%atsymbol%129=~Elementale della Terra~ +%atsymbol%128=~Elementale della Terra~ +%atsymbol%127=~Evocare Elementale della Terra +(Evocazione/Attrazione) +Livello: 5 +Raggio d'azione: Visuale del lanciatore +Durata: 1 turno per livello +Tempo di lancio: 9 +Area d'effetto: Speciale +Tiro-salvezza: Nessuno +Questo incantesimo consente al lanciatore di evocare un elementale con 8 Dadi-vita dal Piano Elementale della Terra e di legarlo alla sua volontà. Questa creatura combatterà al suo fianco sino al termine dell'incantesimo o finché non verrà distrutta.~ +%atsymbol%126=~Evocare Elementale della Terra~ +%atsymbol%125=~Evocare Mostri III +(Evocazione/Attrazione) +Livello: 5 +Raggio d'azione: 6 metri +Durata: 4 round + 1 round per livello +Tempo di lancio: 5 +Area d'effetto: Speciale +Tiro-salvezza: Nessuno +Con il lancio di questo incantesimo, il personaggio evoca 1d4 mostri di 3° livello. Questi appaiono all'interno del raggio d'azione dell'incantesimo e attaccano gli avversari del lanciatore per tutta la durata dell'incantesimo o finché non vengono sconfitti.~ +%atsymbol%124=~Evocare Mostri III~ +%atsymbol%123=~Uomo-lucertola~ +%atsymbol%122=~Uomo-lucertola~ +%atsymbol%121=~Evocare Mostri II +(Evocazione/Attrazione) +Livello: 4 +Raggio d'azione: 6 metri +Durata: 3 round + 1 round per livello +Tempo di lancio: 4 +Area d'effetto: Speciale +Tiro-salvezza: Nessuno +Con il lancio di questo incantesimo, il personaggio evoca 1d6 mostri di 2° livello. Questi appaiono all'interno del raggio d'azione dell'incantesimo e attaccano gli avversari del lanciatore per tutta la durata dell'incantesimo o finché non vengono sconfitti.~ +%atsymbol%120=~Evocare Mostri II~ +%atsymbol%119=~Goblin~ +%atsymbol%118=~Goblin~ +%atsymbol%117=~Evocare Mostri I +(Evocazione/Attrazione) +Livello: 3 +Raggio d'azione: 6 metri +Durata: 2 round + 1 round per livello +Tempo di lancio: 3 +Area d'effetto: Speciale +Tiro-salvezza: Nessuno +Con il lancio di questo incantesimo, il personaggio evoca 2d3 mostri di 1° livello. Questi appaiono all'interno del raggio d'azione dell'incantesimo e attaccano gli avversari del lanciatore per tutta la durata dell'incantesimo o finché non vengono sconfitti.~ +%atsymbol%116=~Evocare Mostri I~ +%atsymbol%115=~Attacca~ +%atsymbol%114=~Minotauro~ +%atsymbol%113=~Minotauro~ +%atsymbol%112=~Evocare Mostri V +(Evocazione/Attrazione) +Livello: 7 +Raggio d'azione: 6 metri +Durata: 6 round + 1 round per livello +Tempo di lancio: 7 +Area d'effetto: Speciale +Tiro-salvezza: Nessuno +Con il lancio di questo incantesimo, il personaggio evoca 1d3 mostri di 5° livello. Questi appaiono all'interno del raggio d'azione dell'incantesimo e attaccano gli avversari del lanciatore per tutta la durata dell'incantesimo o finché non vengono sconfitti.~ +%atsymbol%111=~Evocare Mostri V~ +%atsymbol%110=~Salamander spear +1d8 piercing +1d6 fire damage +do not translate~ +%atsymbol%109=~Frost salamander spear +1d8 piercing ++1d6 cold +do not trans~ +%atsymbol%108=~Salamandra~ +%atsymbol%107=~Salamandra~ +%atsymbol%106=~Salamandra del Gelo~ +%atsymbol%105=~Salamandra del Gelo~ +%atsymbol%104=~Evocare Mostri VI +(Evocazione/Attrazione) +Livello: 8 +Raggio d'azione: 6 metri +Durata: 7 round + 1 round per livello +Tempo di lancio: 8 +Area d'effetto: Speciale +Tiro-salvezza: Nessuno +Con il lancio di questo incantesimo, il personaggio evoca 1d3 mostri di 6° livello. Questi appaiono all'interno del raggio d'azione dell'incantesimo e attaccano gli avversari del lanciatore per tutta la durata dell'incantesimo o finché non vengono sconfitti.~ +%atsymbol%103=~Evocare Mostri VI~ +%atsymbol%102=~Attacca~ +%atsymbol%101=~Umber Hulk~ +%atsymbol%100=~Umber Hulk~ +%atsymbol%99=~Scheletro Guardiaossa~ +%atsymbol%98=~Scheletro Guardiaossa~ +%atsymbol%97=~Evocare Mostri VII +(Evocazione/Attrazione) +Livello: 9 +Raggio d'azione: 6 metri +Durata: 8 round + 1 round per livello +Tempo di lancio: 9 +Area d'effetto: Speciale +Tiro-salvezza: Nessuno +Con il lancio di questo incantesimo, il personaggio evoca 1d2 mostri di 7° o di 8° livello. Questi appaiono all'interno del raggio d'azione dell'incantesimo e attaccano gli avversari del lanciatore per tutta la durata dell'incantesimo o finché non vengono sconfitti.~ +%atsymbol%96=~Evocare Mostri VII~ +%atsymbol%95=~Evocare Mostri IV +(Evocazione/Attrazione) +Livello: 6 +Raggio d'azione: 6 metri +Durata: 5 round + 1 round per livello +Tempo di lancio: 6 +Area d'effetto: Speciale +Tiro-salvezza: Nessuno +Con il lancio di questo incantesimo, il personaggio evoca 1d3 mostri di 4° livello. Questi appaiono all'interno del raggio d'azione dell'incantesimo e attaccano gli avversari del lanciatore per tutta la durata dell'incantesimo o finché non vengono sconfitti.~ +%atsymbol%94=~Evocare Mostri IV~ +%atsymbol%93=~Teschio~ +%atsymbol%92=~Monster Transparency +Do not translate~ +%atsymbol%91=~Oggetto Trasparente del Mostro~ +%atsymbol%90=~Ombra~ +%atsymbol%89=~Ombra~ +%atsymbol%88=~Evocare Ombre +(Evocazione/Attrazione, Necromanzia) +Livello: 5 +Raggio d'azione: Visuale del lanciatore +Durata: 1 round + 1 round per livello +Tempo di lancio: 5 +Area d'effetto: Speciale +Tiro-salvezza: Nessuno +Questo incantesimo evoca 4 Dadi-vita di ombre. Le ombre obbediranno agli ordini del lanciatore, attaccando i suoi nemici o eseguendo azioni finché non vengono uccise o l'incantesimo non ha termine.~ +%atsymbol%87=~Evocare Ombre~ +%atsymbol%86=~Pugno di Ferro~ +%atsymbol%85=~Pugno di Ferro~ +%atsymbol%84=~Colpito da una terribile malattia~ +%atsymbol%83=~Malato~ +%atsymbol%82=~Avvelenato~ +%atsymbol%81=~Veleno~ +%atsymbol%80=~Corpo di Ferro +(Alterazione) +Livello: 8 +Raggio d'azione: 0 +Durata: 2 turni +Tempo di lancio: 8 +Area d'effetto: Il lanciatore +Tiro-salvezza: Nessuno +Questo incantesimo trasforma il corpo del lanciatore in ferro animato, conferendogli diverse potenti resistenze e capacità. Quando questo incantesimo è attivo, il personaggio ha una Resistenza all'Elettricità e al Veleno del 100%, al Fuoco del 50% e ai danni contundenti del 25%. Gli incantesimi che colpiscono la respirazione o la fisiologia del lanciatore vengono ignorati. Inoltre, la sua Forza viene impostata a 25 ed egli può attaccare due volte per round con pugni di ferro infliggendo 2d4 punti di danno più il relativo bonus derivante dalla Forza. Sfortunatamente, i movimenti del lanciatore diventano lenti e goffi, riducendo del 25% il suo Fattore-movimento rispetto al normale, e non gli sarà possibile lanciare incantesimi mentre Corpo di Ferro è ancora attivo.~ +%atsymbol%79=~Corpo di Ferro~ +%atsymbol%78=~Privo di Sensi~ +%atsymbol%77=~Grido Potente +(Invocazione) +Livello: 8 +Raggio d'azione: 0 +Durata: Istantanea +Tempo di lancio: 1 +Area d'effetto: Cono di 5 metri con arco di 15° +Tiro-salvezza: 1/2 +Mormorando questo incantesimo, il personaggio rilascia una forza stordente dalla sua bocca lungo un cono di 5 metri. Grido Potente è estremamente faticoso e pericoloso per chi lo usa. Il grido risucchia 2d4 Punti Ferita dal lanciatore, il quale deve effettuare con successo un tiro-salvezza contro Incantesimi per non perdere i sensi per un turno. Le creature con 5 Dadi-vita o meno colte nell'area di Grido Potente muoiono subito. Tutte le altre creature all'interno dell'area d'effetto devono effettuare con successo un tiro-salvezza contro Incantesimi. Chi non lo supera viene stordito per 2 round, assordato per 4 round e subisce 4d12 punti di danno da magia. Chi effettua con successo il tiro-salvezza viene stordito per 1 round, assordato per 2 round e subisce 2d12 punti di danno da magia.~ +%atsymbol%76=~Grido Potente~ +%atsymbol%75=~Charmato~ +%atsymbol%74=~Charmato all'Estremo~ +%atsymbol%73=~Dominato~ +%atsymbol%72=~Fallimento Morale: Panico~ +%atsymbol%71=~Intossicato~ +%atsymbol%70=~In Preda alla Confusione~ +%atsymbol%69=~Pensiero Fisso~ +%atsymbol%68=~Bloccato~ +%atsymbol%67=~Paralizzato~ +%atsymbol%66=~Bloccato~ +%atsymbol%65=~Mente Libera +(Scongiurazione) +Livello: 8 +Raggio d'azione: 0 +Durata: 24 ore +Tempo di lancio: 1 +Area d'effetto: Il lanciatore +Tiro-salvezza: Nessuno +In difesa del proprio autocontrollo e della propria riservatezza, Mente Libera protegge la mente di una creatura da quasi tutti gli effetti mentali - Charme, Labirinto, Regressione Mentale, Confusione, Paura, Intossicazione, Berserk, Blocco e Pietrificazione.~ +%atsymbol%64=~Mente Libera~ +%atsymbol%63=~Soffocare +(Alterazione) +Livello: 7 +Raggio d'azione: Visuale del lanciatore +Durata: 4 round +Tempo di lancio: 7 +Area d'effetto: Raggio di 2 metri +Tiro-salvezza: Speciale +Questo incantesimo toglie il respiro a tutte le creature all'interno dell'area d'effetto. Le creature che non respirano non sono influenzate. Le creature soffocate subiscono 4d8 punti di danno da magia per round e soffrono le seguenti penalità: -4 alla Classe Armatura, -4 ai tiri per colpire, -6 alla Destrezza, un attacco in meno per round e Fattore-movimento dimezzato. Un tiro-salvezza effettuato con successo nega tutti gli effetti tranne 2d8 punti di danno per 1 round. Gli effetti cominciamo a svanire quando la creatura si sposta al di fuori dell'area d'effetto, sebbene possa essere necessario 1 round perché un personaggio recuperi il fiato.~ +%atsymbol%62=~Soffocare~ +%atsymbol%61=~Tempesta Acida +(Apparizione) +Livello: 7 +Raggio d'azione: Visuale del lanciatore +Durata: 1 round per livello +Tempo di lancio: 7 +Area d'effetto: Raggio di 3,5 metri +Tiro-salvezza: 1/2 +Questo incantesimo sprigiona una colata d'acido sull'area d'effetto, infliggendo 1d4 punti di danno da acido per i primi 3 round, 1d6 punti di danno da acido per i 3 successivi round e 1d8 punti di danno da acido per ogni round ulteriore. Uscire dall'area d'effetto non arresta gli effetti dell'acido: esso aderisce alla pelle e ogni creatura nell'area d'effetto al momento del lancio di Tempesta Acida continua a subirne i danni fino al termine dell'incantesimo. Le creature effettuano un tiro-salvezza contro Incantesimi per ogni round dopo che sono state colpite dalla nube; se viene effettuato con successo, subiscono metà danno (solo per quel round).~ +%atsymbol%60=~Tempesta Acida~ +%atsymbol%59=~Tempra del Troll +(Necromanzia) +Livello: 6 +Raggio d'azione: 0 +Durata: 2 turni +Tempo di lancio: 6 +Area d'effetto: Il lanciatore +Tiro-salvezza: Nessuno +Questo incantesimo impregna il lanciatore con la robustezza di un troll, permettendogli di rigenerare 5 Punti Ferita per round fino al massimo dei suoi Punti Ferita.~ +%atsymbol%58=~Tempra del Troll~ +%atsymbol%57=~Scheletro~ +%atsymbol%56=~Scheletro~ +%atsymbol%55=~Divora Anima +(Necromanzia) +Livello: 6 +Raggio d'azione: Visuale del lanciatore +Durata: Istantanea +Tempo di lancio: 5 +Area d'effetto: Raggio di 2 metri +Tiro-salvezza: Nessuno +Questo incantesimo infligge 3d8 punti di danno da magia a tutte le creature viventi in un raggio di 3 metri. Qualsiasi creatura che muoia a causa di questi danni viene distrutta e il suo corpo viene trasformato in uno scheletro con 3 Dadi-vita agli ordini del lanciatore. Inoltre, per ogni creatura che muore in questa maniera, il personaggio riceve un bonus pari a +1 a Forza, Destrezza e Costituzione per 1 turno. Divora Anima non ha effetto su non morti, costrutti e creature elementali.~ +%atsymbol%54=~Divora Anima~ +%atsymbol%53=~Dardo d'Osso~ +%atsymbol%52=~Dardo d'Osso~ +%atsymbol%51=~Dardi d'Osso +(Necromanzia) +Livello: 6 +Raggio d'azione: 0 +Durata: 5 round +Tempo di lancio: 5 +Area d'effetto: Il lanciatore +Tiro-salvezza: Nessuno +Questo incantesimo crea nove dardi che possono essere utilizzati dal lanciatore e che non possono essere disarmati finché l'incantesimo è attivo. I dardi sono armi +3, infliggono 1d4+3 punti di danno da proiettile e qualsiasi creatura colpita da un dardo deve effettuare con successo un tiro-salvezza contro Morte o subire altri 2d6 punti di danno da magia e vedere la propria Forza ridotta di 3 punti per 5 round. La riduzione del punteggio di Forza non è cumulativa; fallire un altro tiro-salvezza mentre la riduzione è in atto non ne prolungherà la durata. La competenza del lanciatore nell'uso dei dardi (o la sua mancanza) non ha effetti sulla possibilità dei dardi di colpire un bersaglio.~ +%atsymbol%50=~Dardi d'Osso~ +%atsymbol%49=~Sfera Congelante di Otiluke +(Alterazione, Apparizione) +Livello: 6 +Raggio d'azione: Visuale del lanciatore +Durata: Istantanea +Tempo di lancio: 6 +Area d'effetto: 1 creatura +Tiro-salvezza: Neg. +Questo incantesimo scaglia una sfera fredda contro una creatura che infligge 1d4+2 punti di danno da freddo per livello del lanciatore. Se il bersaglio effettua con successo un tiro-salvezza contro Incantesimi, schiva la sfera ed evita del tutto il danno.~ +%atsymbol%48=~Sfera Congelante di Otiluke~ +%atsymbol%47=~Sudario Fiammeggiante +(Invocazione) +Livello: 5 +Raggio d'azione: Visuale del lanciatore +Durata: 1 round ogni 2 livelli (speciale) +Tempo di lancio: 5 +Area d'effetto: Raggio di 1,5 metri +Tiro-salvezza: Neg. +Questo incantesimo fa sì che una creatura sia avviluppata dalle fiamme a meno che non effettui con successo un tiro-salvezza contro Incantesimi. La creatura brucia, subendo 2d6 punti di danno da fuoco ad ogni round, e lingue di fiamme si sprigionano dalla essa, facendo sì che qualsiasi creatura in un raggio di 1,5 metri subisca 1d4 punti di danno da fuoco derivante dalle fiamme. Chiunque venga colpito dalle fiamme della vittima deve a sua volta effettuare con successo un tiro-salvezza contro Incantesimi per evitare di acquisire lui stesso il sudario. Questo incantesimo è particolarmente utile per disperdere gruppi di troll o di salamandre del gelo.~ +%atsymbol%46=~Sudario Fiammeggiante~ +%atsymbol%45=~Sfera al Vetriolo +(Evocazione) +Livello: 4 +Raggio d'azione: Visuale del lanciatore +Durata: Speciale +Tempo di lancio: 4 +Area d'effetto: Raggio di 1,5 metri +Tiro-salvezza: Speciale +Questo incantesimo evoca una sfera di un brillante acido smeraldino che il lanciatore può indirizzare per colpire qualsiasi bersaglio entro il raggio di azione. Quando raggiunge il suo bersaglio, la sfera esplode e ricopre la vittima di un potente acido. La vittima subisce 1d4 punti di danno da acido per livello del lanciatore, fino ad un massimo di 12d4 punti di danno. Dopo il danno iniziale, la vittima deve effettuare un tiro-salvezza contro Incantesimi per evitare ulteriori danni. Se non viene effettuato con successo, la vittima continua a subire danni da acido nei round seguenti, subendo due dadi in meno di danno ad ogni round. Per esempio, con questo incantesimo un personaggio di 8° livello infligge 8d4 punti di danno il primo round, 6d4 il secondo round, 4d4 il terzo round, 2d4 il quarto round; l'incantesimo termina al quinto round. Ogni round la vittima ha diritto ad un tiro-salvezza contro Incantesimi per evitare ulteriori punti di danno. +La sfera al vetriolo spruzza inoltre acido in un raggio di 3 metri intorno al bersaglio primario. Qualsiasi creatura entro il raggio dello spruzzo deve effettuare con successo un tiro-salvezza contro Pietrificazione/Metamorfosi o subire 1d4 punti di danno ogni 5 livelli dell'incantatore. Lo spruzzo non causa danno continuativo.~ +%atsymbol%44=~Sfera al Vetriolo~ +%atsymbol%43=~Assordare~ +%atsymbol%42=~Grido +(Invocazione) +Livello: 4 +Raggio d'azione: 0 +Durata: Istantanea +Tempo di lancio: 1 +Area d'effetto: Cono di 5 metri con arco di 15° +Tiro-salvezza: Speciale +Grido conferisce al lanciatore enormi poteri vocali, permettendogli di emettere dalla sua bocca un ruggito spaccatimpani in un'area d'effetto a cono. Qualsiasi creatura all'interno di quest'area viene assordata per 2d6 round e subisce 4d6 punti di danno da magia. Un tiro-salvezza contro Incantesimi effettuato con successo nega la sordità e dimezza i danni.~ +%atsymbol%41=~Grido~ +%atsymbol%40=~Proiettili di Forza di Mordenkainen +(Invocazione) +Livello: 4 +Raggio d'azione: Visuale del lanciatore +Durata: Istantanea +Tempo di lancio: 4 +Area d'effetto: Raggio di mezzo metro +Tiro-salvezza: Speciale +Questo incantesimo crea una lucente sfera di energia magica che parte dalle mani del lanciatore per colpire un bersaglio, proprio come l'incantesimo Dardo Incantato. Il personaggio crea un proiettile al 7° livello e un proiettile addizionale ogni tre livelli dopo il 7° - in pratica, due proiettili al 10° livello, tre al 13°, quattro al 16° e così via, fino ad un massimo di sette proiettili al 25° livello. Ogni proiettile infligge 2d4 punti di danno ad un bersaglio e poi scoppia in un'esplosione concussiva dal raggio di mezzo metro, infliggendo 1 punto di danno per livello del lanciatore - per esempio, un personaggio di 12° livello potrebbe evocare 2 proiettili di forza, ognuno dei quali infliggerebbe 2d4+12 punti di danno. Le creature che subiscono danni possono tentare un tiro-salvezza contro Incantesimi per evitare il danno da concussione, ma l'impatto iniziale del proiettile non permette alcun tiro-salvezza. L'incantesimo di 1° livello da stregone "Scudo" assorbirà i proiettili di forza, compresi i danni da concussione.~ +%atsymbol%39=~Proiettili di Forza di Mordenkainen~ +%atsymbol%38=~Disperazione~ +%atsymbol%37=~Stordito~ +%atsymbol%36=~Emozione: Disperazione +(Incantamento/Charme) +Livello: 4 +Raggio d'azione: Visuale del lanciatore +Durata: 1 turno +Tempo di lancio: 4 +Area d'effetto: Raggio di 2 metri +Tiro-salvezza: Neg. +Questo incantesimo crea un'emozione di disperazione all'interno dell'area d'effetto. Tutti i nemici che falliscono un tiro-salvezza contro Incantesimi staranno fermi senza far nulla per 1 turno. Questo incantesimo annulla gli effetti di Emozione: Speranza se lanciato nell'area in cui esso ha effetto.~ +%atsymbol%35=~Emozione: Disperazione~ +%atsymbol%34=~Panico~ +%atsymbol%33=~Emozione: Paura +(Incantamento/Charme) +Livello: 4 +Raggio d'azione: Visuale del lanciatore +Durata: 5 round +Tempo di lancio: 4 +Area d'effetto: Raggio di 2 metri +Tiro-salvezza: Neg. +Questo incantesimo crea un'emozione di paura all'interno dell'area d'effetto. Tutte i nemici che non effettuano con successo il proprio tiro-salvezza contro Incantesimi fuggiranno per 5 round. Questo incantesimo annulla gli effetti di Emozione: Disperazione se lanciato nell'area in cui esso ha effetto.~ +%atsymbol%32=~Emozione: Paura~ +%atsymbol%31=~Emozione: Speranza +(Incantamento/Charme) +Livello: 4 +Raggio d'azione: Visuale del lanciatore +Durata: 1 ora +Tempo di lancio: 4 +Area d'effetto: Raggio di 2 metri +Tiro-salvezza: Nessuno +Questo incantesimo crea un'emozione di speranza all'interno dell'area d'effetto. Tutte le creature influenzate dall'incantesimo ottengono un aumento del morale e un bonus pari a +2 ai loro tiri per colpire, ai danni e ai tiri-salvezza. Questo incantesimo annulla tutti gli effetti di disperazione se lanciato nell'area in cui essi hanno effetto.~ +%atsymbol%30=~Emozione: Speranza~ +%atsymbol%29=~Emozione: Coraggio +(Incantamento/Charme) +Livello: 4 +Raggio d'azione: Visuale del lanciatore +Durata: 1 ora +Tempo di lancio: 4 +Area d'effetto: Raggio di 2 metri +Tiro-salvezza: Nessuno +Questo incantesimo crea un'emozione di coraggio all'interno dell'area d'effetto. Tutte le creature influenzate dall'incantesimo ottengono un bonus pari a +1 ai tiri per colpire, +3 ai danni e 5 Punti Ferita temporanei (che possono essere aggiunti ai Punti Ferita Massimi). Questo incantesimo annulla tutti gli effetti di Paura presenti nell'area d'effetto al momento del lancio.~ +%atsymbol%28=~Emozione: Coraggio~ +%atsymbol%27=~Berserk~ +%atsymbol%26=~Sangue Bruciante di Beltyn +(Necromanzia) +Livello: 4 +Raggio d'azione: Visuale del lanciatore +Durata: 1 round ogni 2 livelli +Tempo di lancio: 4 +Area d'effetto: 1 creatura +Tiro-salvezza: Neg. +Questo incantesimo trasforma il sangue di un bersaglio in fiamma, causando 3d4 punti di danno per round e mandando in stato berserk il nemico per il dolore. L'avversario ottiene un tiro-salvezza contro Incantesimi ad ogni round; se lo effettua con successo, i danni e lo stato berserk vengono negati. Questo incantesimo non funziona contro i non morti e le creature extraplanari che non hanno sangue (come gli elementali). Se la vittima è resistente al fuoco, tale resistenza abbasserà o annullerà il danno causato da questo incantesimo.~ +%atsymbol%25=~Sangue Bruciante di Beltyn~ +%atsymbol%24=~Lancia di Distruzione +(Invocazione) +Livello: 3 +Raggio d'azione: 30 metri +Durata: Istantanea +Tempo di lancio: 3 +Area di effetto: Speciale +Tiro-salvezza: 1/2 +Questo incantesimo scaglia una lancia di forza che si estende dal lanciatore fino ad un punto a 30 metri di distanza. Qualsiasi creatura lungo il percorso della lancia subisce 5d4 punti di danno contundente più 2 punti di danno per livello del lanciatore (sino a un massimo di 30). Le vittime possono dimezzare il danno effettuando con successo un tiro-salvezza contro Incantesimi.~ +%atsymbol%23=~Lancia di Distruzione~ +%atsymbol%22=~Stordito~ +%atsymbol%21=~Lancia di Ghiaccio +(Apparizione) +Livello: 3 +Raggio d'azione: Visuale del lanciatore +Durata: Istantanea +Tempo di lancio: 3 +Area d'effetto: 1 creatura +Tiro-salvezza: Speciale +Questo incantesimo scaglia una lancia magica di ghiaccio contro un bersaglio scelto dal personaggio. Colpisce automaticamente infliggendo 5d6 punti di danno da freddo e costringendo la vittima ad effettuare un tiro-salvezza contro Incantesimi con successo per evitare di essere stordita per 3 round.~ +%atsymbol%20=~Lancia di Ghiaccio~ +%atsymbol%19=~Modificatore alla Destrezza~ +%atsymbol%18=~Grazia del Gatto +(Alterazione) +Livello: 2 +Raggio d'azione: Tocco +Durata: 1 ora per livello +Tempo di lancio: 2 +Area d'effetto: 1 creatura +Tiro-salvezza: Nessuno +Questo incantesimo aumenta magicamente la Destrezza del bersaglio. L'ammontare dipende dalla classe del bersaglio: i furfanti ricevono 1d8 punti, i combattenti e i maghi 1d6 punti e i sacerdoti 1d4 punti. Se il personaggio ha più di una classe, viene utilizzata quella con il dado-vita maggiore. Grazia del Gatto non può aumentare la Destrezza del bersaglio oltre il 20.~ +%atsymbol%17=~Grazia del Gatto~ +%atsymbol%16=~Bastone d'Energia~ +%atsymbol%15=~Bastone d'Energia~ +%atsymbol%14=~Bastone d'Energia +(Apparizione) +Livello: 2 +Raggio d'azione: 0 +Durata: 3 round + 1 round per livello +Tempo di lancio: 2 +Area d'effetto: Il lanciatore +Tiro-salvezza: Nessuno +Questo incantesimo crea un bastone di energia magica nelle mani del personaggio. Viene considerato un'arma magica che infligge 1d6 punti di danno per colpo e che può ferire le creature che richiedono armi +1 per essere colpite. Resta comunque un bastone, pertanto se il lanciatore non è competente nell'uso di queste armi, allora il Bastone d'Energia viene usato con una penalità. Il bastone ha anche il potere di risucchiare 1d2 Punti Ferita al bersaglio ad ogni colpo messo a segno. Questi Punti Ferita vengono aggiunti a quelli del personaggio, ma possono solo curare il danno che ha subito; non aumenteranno i suoi Punti Ferita oltre il valore massimo.~ +%atsymbol%13=~Bastone d'Energia~ +%atsymbol%12=~~ +%atsymbol%11=~Sciame di Palle di Neve di Snilloc +(Apparizione) +Livello: 2 +Raggio d'azione: Visuale del lanciatore +Durata: Istantanea +Tempo di lancio: 2 +Area d'effetto: Raggio di 4,5 metri +Tiro-salvezza: 1/2 +Questo incantesimo fa sì che uno spruzzo di palle di neve esploda in un punto entro il raggio d'azione. Le palle di neve colpiranno ogni cosa all'interno dell'area d'effetto, provocando 1d3 punti di danno da freddo per livello del personaggio, fino a un massimo di 8d3 punti di danno all'8° livello. Contro le creature del fuoco infligge 1d6 punti di danno da freddo per livello, sino ad un massimo di 8d6 punti di danno all'8° livello.~ +%atsymbol%10=~~ +%atsymbol%9=~Sciame di Palle di Neve di Snilloc~ +%atsymbol%8=~Occhio della Mente blocca l'effetto e si dissolve.~ +%atsymbol%7=~Occhio della Spada blocca l'effetto e si dissolve.~ +%atsymbol%6=~Occhio del Mago blocca l'effetto e si dissolve.~ +%atsymbol%5=~Occhio del Veleno blocca l'effetto e si dissolve.~ +%atsymbol%4=~Occhio dello Spirito blocca l'effetto e si dissolve.~ +%atsymbol%3=~Occhio della Tempra blocca l'effetto e si dissolve.~ +%atsymbol%2=~Occhio di Pietra blocca l'effetto e si dissolve.~ +%atsymbol%1=~Questo incantesimo guarisce 11 Punti Ferita del personaggio.~ diff --git a/iwdification/dw_iwdspells_resource/tra/ko_kr/iwdspells.tra b/iwdification/dw_iwdspells_resource/tra/ko_kr/iwdspells.tra new file mode 100644 index 0000000..0bb1600 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/tra/ko_kr/iwdspells.tra @@ -0,0 +1,1211 @@ +%atsymbol%359=~용기~ +%atsymbol%358=~í¬ë§~ +%atsymbol%357=~ê³ ì–‘ì´ì˜ 우아함~ +%atsymbol%356=~ë…실한 ì‹ ë„ì˜ ê³ ê²°í•œ 분노~ +%atsymbol%355=~기ë„~ +%atsymbol%354=~í”¼ì˜ ë¶„ë…¸~ +%atsymbol%353=~낭송~ +%atsymbol%352=~찬양~ +%atsymbol%351=~ë™ë¬¼ì˜ 분노~ +%atsymbol%350=~ê°•ì² ì˜ ëª¸~ +%atsymbol%349=~Petrified~ +%atsymbol%348=~침범ë˜ì§€ 않는 거룩한 ì •ì‹ ~ +%atsymbol%347=~고통~ +%atsymbol%346=~페ì´ì¦ˆë¨~ +%atsymbol%345=~지ì›~ +%atsymbol%344=~ë§ˆìŒ ë¹„ìš°ê¸°~ +%atsymbol%343=~ëŒ€ì§€ì˜ ì •ë ¹ìœ¼ë¡œ 형태 변경~ +%atsymbol%342=~ë¶ˆì˜ ì •ë ¹ìœ¼ë¡œ 형태 변경~ +%atsymbol%341=~ì‹œìŠ¤ì˜ ì „ìŸ ì†¡ê°€ - ë°©ì–´ë„ ë³´ë„ˆìŠ¤ì™€ ìž¬ìƒ íš¨ê³¼~ +%atsymbol%340=~"ì‹œìŠ¤ì˜ ì „ìŸ ì†¡ê°€" +30 피트 반경 ì•ˆì— ìžˆëŠ” 모든 ë™ë£Œë“¤ì€ ë°©ì–´ë„ì— +2ì˜ ë³´ë„ˆìŠ¤ë¥¼ 받고, 베기, 찌르기, 부수기, 발사체 í”¼í•´ì— ëŒ€í•´ +10%ì˜ ì €í•­ë ¥ì„ ê°–ëŠ”ë‹¤. 그리고 ë¼ìš´ë“œë‹¹ 2ì ì˜ ìƒëª…ì ì„ 재ìƒí•œë‹¤.~ +%atsymbol%339=~ì‹œìŠ¤ì˜ ì „ìŸ ì†¡ê°€~ +%atsymbol%338=~노예ìƒíƒœ~ +%atsymbol%337=~사ì´ë Œì˜ 사모곡 - ì ë“¤ì„ 현혹시킴~ +%atsymbol%336=~"사ì´ë Œì˜ 사모곡" +30 피트 반경 ì•ˆì— ìžˆëŠ” 모든 ì ë“¤ì€ ì£¼ë¬¸ì— ëŒ€í•œ 내성 굴림 실패시 1ë¼ìš´ë“œê°€ 지나거나 피해를 입기 전까지 매혹ëœë‹¤.~ +%atsymbol%335=~사ì´ë Œì˜ 사모곡~ +%atsymbol%334=~ì¹´ìš°ë”” ê°€ë¬¸ì˜ ë…¸ëž˜ - 소리 ê³µê²©ì— ëŒ€í•œ 내성 부여~ +%atsymbol%333=~"ì¹´ìš°ë”” ê°€ë¬¸ì˜ ë…¸ëž˜" +30 피트 반경 ì•ˆì— ìžˆëŠ” 모든 ë™ë£Œë“¤ì€ 50% 확률로 침묵, 외침, ìƒê¸‰ 외침, 명령, ìƒê¸‰ 명령, ë˜ëŠ” 다른 모든 소리 기반 ê³µê²©ì„ ë¬´ì‹œí•œë‹¤.~ +%atsymbol%332=~ì¹´ìš°ë”” ê°€ë¬¸ì˜ ë…¸ëž˜~ +%atsymbol%331=~티모ë¼ì˜ 멜로디 - 행운과 기술 보너스를 줌.~ +%atsymbol%330=~"티모ë¼ì˜ 멜로디" +30 피트 반경 ì•ˆì— ìžˆëŠ” 모든 ë™ë£Œë“¤ì€ í–‰ìš´ì— +1, 내성 êµ´ë¦¼ì— +3, 전승 지ì‹ì— +10, 모든 씨프 ê¸°ìˆ ì— +10ì˜ ë³´ë„ˆìŠ¤ë¥¼ 얻게 ëœë‹¤.~ +%atsymbol%329=~티모ë¼ì˜ 멜로디~ +%atsymbol%328=~커란 ìŠ¤íŠ¸ë¡±í•˜íŠ¸ì˜ ì´ì•¼ê¸° - ê³µí¬ì— ë©´ì—­~ +%atsymbol%327=~"커란 ìŠ¤íŠ¸ë¡±í•˜íŠ¸ì˜ ì´ì•¼ê¸°" +30 피트 반경 ì•ˆì— ìžˆëŠ” 모든 ë™ë£Œë“¤ì€ 노래가 지ì†ë˜ëŠ” ë™ì•ˆ ê³µí¬ íš¨ê³¼ì— ëŒ€í•œ ë©´ì—­ë ¥ì„ ì–»ëŠ”ë‹¤. 그리고 걸려있는 ê³µí¬ íš¨ê³¼ëŠ” 제거ëœë‹¤.~ +%atsymbol%326=~커란 ìŠ¤í† ë¡±í•˜íŠ¸ì˜ ì´ì•¼ê¸°~ +%atsymbol%325=~세 ì˜ì›…ì˜ ë°œë¼ë“œ - 전투 보너스~ +%atsymbol%324=~"세 ì˜ì›…ì˜ ë°œë¼ë“œ" +30 피트 반경 ì•ˆì— ìžˆëŠ” 모든 ë™ë£Œë“¤ì€ 공격, 피해, 내성 êµ´ë¦¼ì— +1ì˜ ë³´ë„ˆìŠ¤ë¥¼ 얻게 ëœë‹¤.~ +%atsymbol%323=~세 ì˜ì›…ì˜ ë°œë¼ë“œ~ +%atsymbol%322=~산성 ì¦ê¸° 방출~ +%atsymbol%321=~시들어ê°~ +%atsymbol%320=~시듦 +(네í¬ë¡œë§¨ì‹œ) +레벨: 7 +분야: 치유 +시전 거리: ì ‘ì´‰ +ì§€ì† ì‹œê°„: 1 ë¼ìš´ë“œ/2 레벨 +시전 시간: 7 +효과 범위: í•œ ìƒëª…ì²´ +내성 굴림: 무시 +ì´ ê°•ë ¥í•œ ì£¼ë¬¸ì€ ì ‘ì´‰í•œ ìƒëª…ì²´ì˜ ìž¥ê¸°ì˜ ê¸°ëŠ¥ì„ ë©ˆì¶”ê³  부패하게 한다. ì´ë¥¼ 피하려면 -4 페ë„í‹°ë¡œ 죽ìŒì— 대한 ë‚´ì„±êµ´ë¦¼ì„ í•´ì•¼ 한다. ì£¼ë¬¸ì— ê±¸ë¦° ìƒë¬¼ì€ 매 초당 3ì ì˜ ìƒëª…ì ì„ 잃는다. ì´ íš¨ê³¼ëŠ” í•´ì œë˜ì§€ 않는 í•œ, 시전ìžì˜ 2 레벨당 1 ë¼ìš´ë“œ ë™ì•ˆ 지ì†ëœë‹¤. 예를 들어, 14 레벨 성ì§ìžëŠ” 7 ë¼ìš´ë“œ ë™ì•ˆ 매 ë¼ìš´ë“œë§ˆë‹¤ 18ì ì˜ ìƒëª…ì ì„ 잃게 만든다. ì´ ì£¼ë¬¸ì€ ì–¸ë°ë“œ, 주조물, 다른 ì°¨ì›ì—ì„œ 온 ìƒëª…ì²´ì—게는 효과가 없다. ì˜¤ì§ ì•… ì„±í–¥ì˜ ìºë¦­í„°ë§Œ 시전할 수 있다.~ +%atsymbol%319=~시듦~ +%atsymbol%318=~성가 +(컨저레ì´ì…˜/서모ë‹) +레벨: 2 +분야: 전투 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 1í„´ +시전 시간: 9 +효과 범위: 60피트 반경 +내성 굴림: ì—†ìŒ +성가 주문으로 성ì§ìžëŠ” ìžì‹ ê³¼ ì¼í–‰ì—게는 특별한 ì€í˜œë¥¼, ì ì—게는 해를 입힌다. 성가 ì£¼ë¬¸ì´ ì™„ë£Œë  ë•Œ, 효과 범위 ì•ˆì— ìžˆëŠ” 성ì§ìžì˜ 모든 ë™ë£ŒëŠ” 공격 굴림, 최소 피해 굴림, 그리고 내성 êµ´ë¦¼ì— +1 보너스를 받으며 ë¬´ê¸°ì˜ ê¸°ë³¸ 피해를 제외한 모든 íš¨ê³¼ì˜ í”¼í•´ 주사위 êµ´ë¦¼ë„ 1 ê°ì†Œí•œë‹¤. 예를 들면, 6d6ì ì˜ 화염구는 6d5ì ì˜ 피해를 줄 것ì´ë©° 1d8+2ì ì˜ 베기 í”¼í•´ì— 1d3ì ì˜ 화염 피해를 입히는 화염 롱 소드는 1d8+2ì ì˜ 베기 í”¼í•´ì— 1d2ì ì˜ 화염 피해를 줄 것ì´ë‹¤. 성ì§ìžì˜ ì ì€ ì •ë°˜ëŒ€ì˜ íš¨ê³¼ë¥¼ 겪는다. +성가를 여러 번 ì‚¬ìš©í•´ë„ íš¨ê³¼ëŠ” 중첩ë˜ì§€ 않는다. ì´ ì£¼ë¬¸ì€ ì‹œì „ìžì˜ ìƒë‹¹í•œ ì§‘ì¤‘ì´ í•„ìš”í•˜ë¯€ë¡œ, 성ì§ìžëŠ” ì„±ê°€ì˜ ì§€ì† ì‹œê°„ ë™ì•ˆ ì–´ë–¤ ì£¼ë¬¸ë„ ì‹œì „í•  수 없으며 ì´ë™ ì†ë„ë„ ë°˜ìœ¼ë¡œ ëŠë ¤ì§„다.~ +%atsymbol%317=~성가~ +%atsymbol%316=~Fart Repellent for Bombardier Beetles. +Do not translate~ +%atsymbol%315=~천공 딱정벌레~ +%atsymbol%314=~천공 딱정벌레~ +%atsymbol%313=~í­ê²© 딱정벌레~ +%atsymbol%312=~í­ê²© 딱정벌레~ +%atsymbol%311=~거대 곤충 +(얼터레ì´ì…˜) +레벨: 4 +분야: ë™ë¬¼ +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 8 시간 +시전 시간: 7 +효과 범위: 특수 +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ 2-3 ë§ˆë¦¬ì˜ ì²œê³µ 딱정벌레 ë˜ëŠ” í­ê²© 딱정벌레를 ì‹œì „ìž ì˜†ì— ì†Œí™˜í•œë‹¤. ë”±ì •ë²Œë ˆë“¤ì€ ì£¼ë¬¸ íš¨ë ¥ì´ ë나거나 ì£½ì„ ë•Œê¹Œì§€ 시전ìžì—게 복종할 것ì´ë‹¤.~ +%atsymbol%310=~거대곤충~ +%atsymbol%309=~ì¹˜ëª…ìƒ ìž…ížˆê¸° +(네í¬ë¡œë§¨ì‹œ) +레벨: 5 +분야: 치유 +시전 거리: ì ‘ì´‰ +ì§€ì† ì‹œê°„: 순간 +시전 시간: 8 +효과 범위: í•œ ìƒëª…ì²´ +내성 굴림: 1/2 +ì´ ì£¼ë¬¸ì€ ì¹˜ëª…ìƒ ì¹˜ë£Œì˜ ì—­ì£¼ë¬¸ìœ¼ë¡œ, 접촉한 ìƒëª…체를 치유하는 대신 역으로 피해를 입힌다. 성ì§ìžê°€ ì ì—게 접촉하는 ë° ì„±ê³µí•˜ë©´, ê·¸ 대ìƒì€ 27ì ì˜ 피해를 입게 ëœë‹¤ (ì£¼ë¬¸ì— ëŒ€í•œ 내성굴림 성공시 절반). ì–¸ë°ë“œ, 주조물, 다른 ì°¨ì›ì—ì„œ 온 존재ì—게는 효과가 없다. ì„  ì„±í–¥ì˜ ìºë¦­í„°ëŠ” 시전하지 못한다~ +%atsymbol%308=~ì¹˜ëª…ìƒ ìž…ížˆê¸°~ +%atsymbol%307=~ì¤‘ìƒ ìž…ížˆê¸° +(네í¬ë¡œë§¨ì‹œ) +레벨: 4 +분야: 치유 +시전 거리: ì ‘ì´‰ +ì§€ì† ì‹œê°„: 순간 +시전 시간: 5 +효과 범위: í•œ ìƒëª…ì²´ +내성 굴림: 1/2 +ì´ ì£¼ë¬¸ì€ ì¤‘ìƒ ì¹˜ë£Œì˜ ì—­ì£¼ë¬¸ìœ¼ë¡œ, 접촉한 ìƒëª…체를 치유하는 대신 역으로 피해를 입힌다. 성ì§ìžê°€ ì ì—게 접촉하는 ë° ì„±ê³µí•˜ë©´, ê·¸ 대ìƒì€ 17ì ì˜ 피해를 입게 ëœë‹¤ (ì£¼ë¬¸ì— ëŒ€í•œ 내성굴림 성공시 절반). ì–¸ë°ë“œ, 주조물, 다른 ì°¨ì›ì—ì„œ 온 존재ì—게는 효과가 없다. ì„  ì„±í–¥ì˜ ìºë¦­í„°ëŠ” 시전하지 못한다~ +%atsymbol%306=~ì¤‘ìƒ ìž…ížˆê¸°~ +%atsymbol%305=~2 레벨 í¡ìˆ˜ë¨~ +%atsymbol%304=~ì—너지 í¡ìˆ˜ +(네í¬ë¡œë§¨ì‹œ) +레벨: 7 +분야: 네í¬ë¡œë§¨í‹± +시전 거리: ì ‘ì´‰ +ì§€ì† ì‹œê°„: ì˜êµ¬ì  +시전 시간: 3 +효과 범위: í•œ ìƒëª…ì²´ +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì„ ì‹œì „í•˜ë©´, 시전ìžì˜ ì°¨ì›ê³¼ ìŒì˜ ì—너지 ì°¨ì›ì„ 연결하는 통로가 열린다. 주문 시전ìžëŠ” ë‘ ì°¨ì›ì˜ 전달ìžê°€ ë˜ì–´, í¬ìƒìžë¡œë¶€í„° ìƒëª…ë ¥ì„ ë¹¨ì•„ë“¤ì—¬, ìŒì˜ ì—너지 ì°¨ì›ìœ¼ë¡œ 전송한다. ê·¸ ê²°ê³¼ í¬ìƒìžëŠ” ë ˆë²¨ì´ 2 단계 하ë½í•˜ê²Œ ëœë‹¤. ì£¼ë¬¸ì˜ ëŒ€ìƒì€ 레벨, HD, ìƒëª…ì , 그리고 기타 ëŠ¥ë ¥ë“¤ì„ ì˜êµ¬ížˆ 잃게 ëœë‹¤. 잃어버린 ë ˆë²¨ì€ ì„±ì§ìžì˜ 회복 주문으로만 회복할 수 있다. ì´ ì£¼ë¬¸ì€ ì–¸ë°ë“œ, 주조물, 다른 ì°¨ì›ì˜ ìƒëª…ì²´ì—게는 효과가 없다. ì˜¤ì§ ì•… ì„±í–¥ì˜ ìºë¦­í„°ë§Œ 시전할 수 있다.~ +%atsymbol%303=~ì—너지 í¡ìˆ˜~ +%atsymbol%302=~휘ê°ê¹€~ +%atsymbol%301=~ì„ë¸”ë§ ë§ˆìš´ë“œ~ +%atsymbol%300=~ì„ë¸”ë§ ë§ˆìš´ë“œ~ +%atsymbol%299=~추ì ìž +(컨저레ì´ì…˜) +레벨: 7 +분야: ì‹ë¬¼ +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 8 시간 +시전 시간: 9 +효과 범위: 특수 +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ ë‘ ë§ˆë¦¬ì˜ 11 히트 다ì´ìŠ¤ì˜ ì„ë¸”ë§ ë§ˆìš´ë“œë¥¼ 만들어 낸다. ì´ ìƒëª…ì²´ë“¤ì€ ì „íˆ¬ì—서나 ì§€ì‹œë°›ì€ ì–´ë–¤ 임무ì—서든 ëŠ¥ë ¥ì´ ë‹¿ëŠ” 대로 ê¸°êº¼ì´ ì‹œì „ìžë¥¼ ë„와줄 것ì´ë‹¤.~ +%atsymbol%298=~추ì ìž~ +%atsymbol%297=~ì—˜ë‹¤ìŠ¤ì˜ ì•ˆê°œ +(ì¸ë³´ì¼€ì´ì…˜) +레벨: 7 +분야: ì •ë ¹ +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 순간 +시전 시간: 9 +효과 범위: 14 피트 반경 +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ íš¨ê³¼ 범위 전체를 ì€ì²­ìƒ‰ì˜ 안개로 ë®ëŠ”다. ì´ ì•ˆê°œ ì†ì˜ 모든 ìƒëª…체는 질병ì´ë‚˜ ë…ì´ ì¹˜ë£Œë˜ë©°, 25ì ì˜ ìƒëª…ì ì´ 회복ëœë‹¤.~ +%atsymbol%296=~ì—˜ë‹¤ìŠ¤ì˜ ì•ˆê°œ~ +%atsymbol%295=~ìƒê¸‰ ë¼ìƒŒë”ì˜ ë°©íŒ¨ +(컨저레ì´ì…˜) +레벨: 7 +분야: 수호 +시전 거리: ì ‘ì´‰ +ì§€ì† ì‹œê°„: 3 ë¼ìš´ë“œ +시전 시간: 9 +효과 범위: í•œ ìƒëª…ì²´ +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€, ì§€ì† ì‹œê°„ ë™ì•ˆ í•œ ìƒëª…ì²´ì—게 100%ì˜ ë§ˆë²• 저항과, 모든 í”¼í•´ì— ëŒ€í•œ ë©´ì—­ ëŠ¥ë ¥ì„ ë¶€ì—¬í•´ 준다. ì•…í•œ ìºë¦­í„°ëŠ” ìƒê¸‰ ë¼ìƒŒë”ì˜ ë°©íŒ¨ë¡œ ë³´í˜¸ë°›ì„ ìˆ˜ 없으며, ì´ ì£¼ë¬¸ì€ ì˜¤ì§ ì„  ì„±í–¥ì˜ ìºë¦­í„°ë§Œ 사용할 수 있다.~ +%atsymbol%294=~ìƒê¸‰ ë¼ìƒŒë”ì˜ ë°©íŒ¨~ +%atsymbol%293=~파괴 +(네í¬ë¡œë§¨ì‹œ) +레벨: 7 +분야: 치유 +시전 거리: ì ‘ì´‰ +ì§€ì† ì‹œê°„: 순간 +시전 시간: 9 +효과 범위: ì‹œì „ìž +내성 굴림: 특수 +ì´ ì£¼ë¬¸ì€ ì¦‰ì‹œ ìƒëŒ€ë¥¼ 파괴하여, ì¡°ê°ì¡°ê°ìœ¼ë¡œ 분쇄해 버린다. ì´ ì£¼ë¬¸ì˜ í¬ìƒìžëŠ” -4 페ë„티를 받고 죽ìŒì— 대한 내성 êµ´ë¦¼ì„ ì‹œë„í•  수 있으며, 성공한다면 파괴ë˜ëŠ” 대신 8d6ì ì˜ 마법 피해를 입게 ëœë‹¤. 파괴 ì£¼ë¬¸ì€ ì˜¤ì§ ì•… 성향 ìºë¦­í„°ë§Œ 사용할 수 있다. 파괴 ì£¼ë¬¸ì— í¬ìƒëœ ìºë¦­í„°ëŠ” ì£½ì€ ìž ì†Œìƒ ì£¼ë¬¸ì´ë‚˜ 부활 주문으로 ë˜ì‚´ì•„ë‚  수 없다는 ì ì— 유ì˜í•´ì•¼ 한다.~ +%atsymbol%292=~파괴~ +%atsymbol%291=~주문 효과없ìŒ~ +%atsymbol%290=~침범ë˜ì§€ 않는 거룩한 ì •ì‹  +(앱저레ì´ì…˜) +레벨: 7 +분야: ë°©ì–´ +시전 거리: 0 +ì§€ì† ì‹œê°„: 1 í„´/레벨 +시전 시간: 9 +효과 범위: ì‹œì „ìž +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ ì™¸ë¶€ì˜ ì–´ë– í•œ ì˜í–¥ì— ëŒ€í•´ì„œë„ ì €í•­í•  수 있ë„ë¡ ì‹œì „ìžì˜ 마ìŒì„ 튼튼하게 만든다. 시전ìžì— 대한 현혹, 명령, 혼란, 지배, ê³µí¬, 정신박약, ì†ë°•, 수면, 사ì´ì˜¤ë‹‰ ë“±ì˜ ê³µê²©ì€ ì´ ì£¼ë¬¸ì´ íš¨ë ¥ì„ ë°œíœ˜í•˜ê³  있는 í•œ 실패할 것ì´ë‹¤.~ +%atsymbol%289=~침범ë˜ì§€ 않는 거룩한 ì •ì‹ ~ +%atsymbol%288=~ìƒì§•, ì ˆë§ +(컨저레ì´ì…˜/서모ë‹) +레벨: 7 +분야: 수호 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 2í„´ +시전 시간: 3 +효과 범위: 30피트 반경 +내성 굴림: 무시 +ìƒì§•, ì ˆë§ ì£¼ë¬¸ì€ ì„±ì§ìžê°€ 땅바닥ì´ë‚˜ 여타 다른 표면 ìœ„ì— ìƒì§•ì„ 새길 수 있ë„ë¡ í•˜ëŠ” 강력한 마법ì´ë‹¤. ìƒì§•ì€ 누군가가 너무 ê°€ê¹Œì´ ì ‘ê·¼í•˜ë©´ í­ë°œí•˜ë©°, ì´ë•Œ 효과 범위 ì•ˆì— ìžˆëŠ” 모든 ì ì€ -2 페ë„티를 ë°›ì€ ì±„ë¡œ ì£¼ë¬¸ì— ëŒ€í•œ 내성 êµ´ë¦¼ì„ í•˜ì—¬ 실패하는 경우 낙담하고 í¬ê¸°í•œ ìƒíƒœê°€ ë˜ì–´ ì œìžë¦¬ì— 멈춰 선다. ì´ë ‡ê²Œ ëœ ìžëŠ” 무슨 ê³µê²©ì„ ë°›ë“  ìžì‹ ì„ 방어하려 하지 ì•Šì„ ê²ƒì´ë‹¤. ì´ ì£¼ë¬¸ì€ ì‹œì „ë˜ì—ˆì„ ì‹œ 범위 ì•ˆì— ìžˆëŠ” ê°ì • 조종, í¬ë§ì˜ 효과를 ìƒì‡„한다.~ +%atsymbol%287=~ìƒì§•, ì ˆë§~ +%atsymbol%286=~고통받ìŒ~ +%atsymbol%285=~ìƒì§•, 고통 +(컨저레ì´ì…˜/서모ë‹) +레벨: 7 +분야: 수호 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 11 í„´ +시전 시간: 3 +효과 범위: 30 피트 반경 +내성 굴림: 무시 +ìƒì§•, 고통 ì£¼ë¬¸ì´ ì‹œì „ëœ ì§€ì—­ì˜ 30 피트 반경 ì•ˆì˜ ëª¨ë“  ìƒëª…체는 ì£¼ë¬¸ì— ëŒ€í•œ 내성 êµ´ë¦¼ì„ í•´ì•¼ 한다. 내성 êµ´ë¦¼ì— ì‹¤íŒ¨í•œ ìžëŠ” ê·¹ë„ì˜ ê³ í†µì— ì••ë„ë˜ì–´ 명중 êµ´ë¦¼ì— -4 페ë„í‹°, 민첩 ëŠ¥ë ¥ì¹˜ì— -2 페ë„í‹°, ë°©ì–´ë„ì— -2 페ë„티를 받게 ëœë‹¤.~ +%atsymbol%284=~ìƒì§•, 고통~ +%atsymbol%283=~ì˜ì ì¸ 분노 +(ì¸ë³´ì¼€ì´ì…˜) +레벨: 6 +분야: 전투 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 순간 +시전 시간: 2 +효과 범위: 특수 +내성 굴림: 1/2 +ì´ ì£¼ë¬¸ì„ ëë‚´ë©´, 성ì§ìžëŠ” ì˜ì ì¸ ì—너지를 ëŒì–´ë“¤ì´ëŠ” ì´ˆì ì´ ë˜ì–´, ê·¸ íž˜ì„ 4ê°œì˜ ë°©í–¥ìœ¼ë¡œ 번개 화살처럼 발사한다. í™”ì‚´ì˜ ê²½ë¡œì— ìžˆëŠ” 모든 ìƒëª…체는 4d10ì ì˜ 마법 피해(ì£¼ë¬¸ì— ëŒ€í•œ 내성 êµ´ë¦¼ì— ì„±ê³µí•˜ë©´ 절반)를 입는다. 시전ìžì™€ ê°™ì€ ì„±í–¥(ì„ , 중립, ì•…)ì˜ ìƒëª…ì²´ë“¤ì€ ì´ ì£¼ë¬¸ì— ì˜í–¥ì„ 받지 않는다.~ +%atsymbol%282=~ì˜ì ì¸ 분노~ +%atsymbol%281=~회오리바람 +(ì¸ë³´ì¼€ì´ì…˜) +레벨: 6 +분야: ì •ë ¹ 공기 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 특수 +시전 시간: 9 +효과 범위: 특수 +내성 굴림: 특수 +ì´ ì£¼ë¬¸ì€ ì‹œì „ìž ì£¼ë³€ì— ìž‘ì€ íšŒì˜¤ë¦¬ë°”ëžŒì„ ë§Œë“¤ì–´ë‚¸ë‹¤. ì´ íšŒì˜¤ë¦¬ë°”ëžŒì€ ë¶ˆê·œì¹™ì ìœ¼ë¡œ ì£¼ë³€ì„ ë‚ ì•„ë‹¤ë‹ˆë©° ì ê³¼ ì•„êµ°ì„ êµ¬ë³„í•˜ì§€ ì•Šê³  피해를 입힌다. 시전ìžëŠ” ìžì‹ ì˜ ì£¼ë¬¸ì— ë©´ì—­ì´ë©°, ì •ë ¹ì´ë‚˜ 다른 거대한 ìƒëª…체들ì—ê²Œë„ ì˜í–¥ì´ 없다. 만약 ì–´ë–¤ 대ìƒì´ íšŒì˜¤ë¦¬ë°”ëžŒì˜ ì§„ë¡œì— ê±¸ë ¤ 들었다면, 그는 2d8ì ì˜ 부수기 피해와 2d8ì ì˜ 베기 피해를 입게 ë˜ë©°, ë¸Œë ˆì“°ì— ëŒ€í•œ 내성 êµ´ë¦¼ì— ì‹¤íŒ¨í•˜ë©´ 2ë¼ìš´ë“œ ë™ì•ˆ 기절한다. 2 히트 다ì´ìŠ¤ ì´í•˜ì˜ ìƒëª…체는 ì´ ì£¼ë¬¸ì— ì˜í•´ ìžë™ì ìœ¼ë¡œ 죽게 ëœë‹¤. 최대 ì—¬ëŸ ê°œì˜ ê°œì²´ê¹Œì§€ ì˜í–¥ì„ 받게 ë˜ë©°, ê·¸ 후 íšŒì˜¤ë¦¬ë°”ëžŒì€ ì‚¬ë¼ì§ˆ 것ì´ë‹¤.~ +%atsymbol%280=~회오리바람~ +%atsymbol%279=~엔트로피 방패 +(앱저레ì´ì…˜) +레벨: 6 +분야: ë°©ì–´ +시전 거리: 0 +ì§€ì† ì‹œê°„: 1 ë¼ìš´ë“œ/레벨 +시전 시간: 9 +효과 범위: ì‹œì „ìž +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì´ ì‹œì „ë˜ë©´, ë°©ì–´ì ì¸ ì—ë„ˆì§€ì˜ ì†Œìš©ëŒì´ê°€ 시전ìžì˜ 주위를 ê°ì‹¸ ë§Žì€ ê³µê²©ì„ ë§‰ê±°ë‚˜ 튕겨낸다. ì´ê²ƒì€ 성ì§ìžì˜ ë°©ì–´ë„ì— +6ì˜ ë³´ë„ˆìŠ¤ë¥¼ 주고, 내성 êµ´ë¦¼ì— +2ì˜ ë³´ë„ˆìŠ¤ë¥¼ 주며, 전기, 불, 냉기, ì‚°ì— ëŒ€í•´ 50%ì˜ ì €í•­ë ¥ì„ ì¤€ë‹¤. ë˜í•œ 성ì§ìžëŠ” 화염 강타와 ë°œì‚¬ì²´ì— ê¸°ë°˜í•œ 모든 ê³µê²©ì— ë©´ì—­ì´ ëœë‹¤. ì´ì—는 마법 발사체와 ê°™ì€ ì£¼ë¬¸ì— ì˜í•œ ë°œì‚¬ì²´ë„ í¬í•¨ëœë‹¤.~ +%atsymbol%278=~엔트로피 방패~ +%atsymbol%277=~집단 ìƒì²˜ 입히기 +(네í¬ë¡œë§¨ì‹œ) +레벨: 5 +분야: 치유 +시전 거리: 0 +ì§€ì† ì‹œê°„: 순간 +시전 시간: 5 +효과 범위: 30 피드 반경 +내성 굴림: 1/2 +ì´ ì£¼ë¬¸ì„ ì‹œì „í•˜ë©´, 시전ìžë¥¼ 중심으로 30 피트 반경 ë‚´ì— ìžˆëŠ” 모든 ì ë“¤ì€ 레벨 당 1d8 + 1 ì ì˜ 피해를 입는다. ì£¼ë¬¸ì— ëŒ€í•œ 내성 êµ´ë¦¼ì— ì„±ê³µí•˜ë©´ ì ˆë°˜ì˜ í”¼í•´ë§Œì„ ìž…ëŠ”ë‹¤. ì´ ì£¼ë¬¸ì€ ì–¸ë°ë“œ, 주조물, í˜¹ì€ ë‹¤ë¥¸ ì°¨ì›ì˜ ìƒëª…ì²´ì—게는 효과가 없다. ì˜¤ì§ ì•… ì„±í–¥ì˜ ìºë¦­í„°ë§Œ 시전할 수 있다.~ +%atsymbol%276=~집단 ìƒì²˜ 입히기~ +%atsymbol%275=~ë™ë¬¼ì˜ 분노 +(ì¸ì±ˆíŠ¸ë¨¼íŠ¸) +레벨: 5 +분야: 전투 +시전 거리: ì ‘ì´‰ +ì§€ì† ì‹œê°„: 15 ë¼ìš´ë“œ +시전 시간: 8 +효과 범위: í•œ ìƒëª…ì²´ +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ ëŒ€ìƒì—게 ë™ë¬¼ê³¼ ê°™ì€ ë§¹ë ¬í•¨ì„ ë¶€ì—¬í•´ 준다. 대ìƒì€ íž˜ì´ 19ê°€ ë˜ë©°, 20ì ì˜ ìƒëª…ì ì„ 추가로 얻게 ë˜ê³ , ì´ë™ ì†ë„ê°€ 20% 빨ë¼ì§€ë©°, 모든 내성 êµ´ë¦¼ì— +2ì˜ ë³´ë„ˆìŠ¤ë¥¼ 받는다. ë™ë¬¼ì˜ 분노 ì£¼ë¬¸ì´ íš¨ë ¥ì„ ë°œíœ˜í•˜ëŠ” ë™ì•ˆ 대ìƒì€ ì£¼ë¬¸ì„ ì‚¬ìš©í•  수 없게 ëœë‹¤. 대ìƒì€ ì ì´ ëˆˆì— ë“¤ì–´ì˜¬ 경우 ì†ì— ì¥ê³  있는 무기를 사용하여 ì¦‰ê° ê·¼ì ‘ ê³µê²©ì— ë“¤ì–´ê°€ê²Œ ëœë‹¤. ì´ ì£¼ë¬¸ì´ íš¨ë ¥ì„ ë°œíœ˜í•˜ëŠ” ë™ì•ˆ, 대ìƒì€ 매 ë¼ìš´ë“œë‹¹ 5%ì˜ í™•ë¥ ë¡œ ê´‘í­í™”ë˜ì–´ ì ê³¼ ì•„êµ°ì„ ê°€ë¦¬ì§€ ì•Šê³  마구 공격해 댈 ê°€ëŠ¥ì„±ì´ ìžˆë‹¤.~ +%atsymbol%274=~ë™ë¬¼ì˜ 분노~ +%atsymbol%273=~ì–¸ë°ë“œ 결계 +(네í¬ë¡œë§¨ì‹œ) +레벨: 5 +분야: 구역 +시전 거리: 0 +ì§€ì† ì‹œê°„: 1 í„´ +시전 시간: 7 +효과 범위: 20 피트 반경 +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ ì„±ì§ìžì˜ ì–¸ë°ë“œì— 대한 ì˜í–¥ë ¥ì„ 확대해 준다. ì´ ë²”ìœ„ëŠ” 성ì§ìžê°€ ì£¼ë¬¸ì„ ì‹œì „í•  ë•Œì˜ ì£¼ë³€ìœ¼ë¡œ ê³ ì •ë˜ë©°, 성ì§ìžì˜ 움ì§ìž„ì— ë”°ë¼ ì›€ì§ì´ì§€ 않는다. ì´ ë²”ìœ„ ë‚´ì— ë“¤ì–´ì˜¨ 모든 ì–¸ë°ë“œëŠ” 성ì§ìžì— ì˜í•´ ì–¸ë°ë“œ 퇴치를 당한 것과 ê°™ì€ íš¨ê³¼ë¥¼ 받는다. 만약 ì´ ì–¸ë°ë“œ 퇴치가 실패하면 ì–¸ë°ë“œëŠ” ë” ì´ìƒì˜ ì–¸ë°ë“œ 퇴치 ì‹œë„ì— ì˜í–¥ì„ 받지 않으며, ì´ëŠ” ê·¸ ì–¸ë°ë“œê°€ 효과 범위를 벗어났다가 다시 들어올 때까지 지ì†ëœë‹¤.~ +%atsymbol%272=~ì–¸ë°ë“œ 결계~ +%atsymbol%271=~ë¼ìƒŒë”ì˜ ë°©íŒ¨ +(컨저레ì´ì…˜) +레벨: 5 +분야: 수호 +시전 거리: ì ‘ì´‰ +ì§€ì† ì‹œê°„: 2 ë¼ìš´ë“œ +시전 시간: 8 +효과 범위: í•œ ìƒëª…ì²´ +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ ì§€ì† ì‹œê°„ì´ ìœ ì§€ë˜ëŠ” ë™ì•ˆ, ìƒëŒ€ì—게 í”¼í•´ì— ëŒ€í•œ 완벽한 ë©´ì—­ì„±ì„ ë¶€ì—¬í•´ 준다. ì•…í•œ ìºë¦­í„°ëŠ” ë¼ìƒŒë”ì˜ ë°©íŒ¨ì— ì˜í•´ ë³´í˜¸ë°›ì„ ìˆ˜ 없다. ì•… ì„±í–¥ì˜ ìºë¦­í„°ëŠ” ë¼ìƒŒë”ì˜ ë°©íŒ¨ë¥¼ 시전할 수 없다.~ +%atsymbol%270=~ë¼ìƒŒë”ì˜ ë°©íŒ¨~ +%atsymbol%269=~가시 바위 +(얼터레ì´ì…˜, ì¸ì±ˆíŠ¸ë¨¼íŠ¸) +레벨: 5 +분야: ì •ë ¹ 대지 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 12 ë¼ìš´ë“œ +시전 시간: 6 +효과 범위: 18 피트 반경 +내성 굴림: 특수 +ì´ ì£¼ë¬¸ì€ ì£¼ë³€ì˜ ë°”ìœ„ë¥¼ 뒤틀어서 ë°°ê²½ 지형과 뒤섞ì´ëŠ” 가시 형ìƒìœ¼ë¡œ 바꿔버린다. ì´ ì§€ì—­ì— ë“¤ì–´ê°€ëŠ” 모든 ìƒëª…체는 매 ë¼ìš´ë“œë§ˆë‹¤ 2d4ì ì˜ 찌르기 피해를 ìž…ê³ , ì£¼ë¬¸ì— ëŒ€í•œ 내성 êµ´ë¦¼ì— ì‹¤íŒ¨í•˜ë©´ ì´ë™ ì†ë„ê°€ 30% ëŠë ¤ì§„다.~ +%atsymbol%268=~가시 바위~ +%atsymbol%267=~ë…실한 ì‹ ë„ì˜ ê³ ê²°í•œ 분노 +(ì¸ì±ˆíŠ¸ë¨¼íŠ¸/현혹) +레벨: 5 +분야: 전투 +시전 거리: 0 +ì§€ì† ì‹œê°„: 1 ë¼ìš´ë“œ/레벨 +시전 시간: 8 +효과 범위: 35 피트 반경 +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ ì„±ì§ìžì˜ ë™ë£Œë“¤ì—게 신성한 ê´‘ê¸°ì˜ ëª¨ìŠµì„ ë¶€ì—¬í•´ì„œ ê·¸ë“¤ì˜ ì „íˆ¬ ëŠ¥ë ¥ì„ ë†’ì—¬ì¤€ë‹¤. 효과 범위 ë‚´ì— ìžˆëŠ” 성ì§ìžì˜ 모든 ë™ë£ŒëŠ” 명중과 내성 êµ´ë¦¼ì— +1ì˜ ë³´ë„ˆìŠ¤ë¥¼ 받으며, ì£¼ë¬¸ì˜ ì§€ì† ì‹œê°„ ë™ì•ˆ 8ì ì˜ ìƒëª…ì ì„ 추가로 얻는다(ì´ ìƒëª…ì ì€ 최대치 ì´ìƒìœ¼ë¡œ ì–»ì„ ìˆ˜ 있다). ë˜í•œ, 성ì§ìžì™€ ê°™ì€ ì„±í–¥ì˜ ë™ë£ŒëŠ” 매 ë¼ìš´ë“œë‹¹ í•œ ë²ˆì˜ ì¶”ê°€ ê³µê²©ì„ í•  수 있고(ê°€ì† ì£¼ë¬¸ì„ ì·¨ì†Œí•¨), 명중, 피해, 내성 êµ´ë¦¼ì— +2ì˜ ë³´ë„ˆìŠ¤ë¥¼ 받으며, 현혹과 ì†ë°• ì£¼ë¬¸ì— ë©´ì—­ì´ ëœë‹¤. ì´ ì£¼ë¬¸ì— ì˜í–¥ì„ ë°›ì€ ëª¨ë“  ë™ë£ŒëŠ” ì£¼ë¬¸ì˜ íš¨ê³¼ê°€ ë나면 피로해진다.~ +%atsymbol%266=~ë…실한 ì‹ ë„ì˜ ê³ ê²°í•œ 분노~ +%atsymbol%265=~ë‹¬ë¹›ì˜ ë²½ +(ì¸ë³´ì¼€ì´ì…˜) +레벨: 4 +분야: ë°©ì–´, 태양 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 1 í„´ +시전 시간: 7 +효과 범위: 20 피트 길ì´, 5 피트 ë„“ì´ì˜ ë²½ +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ ì²­ë°±ìƒ‰ì˜ íž˜ìœ¼ë¡œ ì´ë£¨ì–´ì§„ 빛나는 ìž¥ë§‰ì„ ë§Œë“¤ì–´ 낸다. ì´ ë²½ì€ ì†ìœ¼ë¡œ 만질 수 없으며, 물리ì ì¸ ë¶€ì°©ë¬¼ì´ í•„ìš”í•˜ì§€ë„ ì•Šê³ , 쉽게 통과할 수 있다. ì•…í•œ ìƒëª…체는 ì´ ë²½ì„ í†µê³¼í•  ë•Œ 2d10ì ì˜ 마법 피해를 입게 ë˜ë©°, ì•…í•œ ì–¸ë°ë“œëŠ” 5d10ì ì˜ 피해를 받는다. ì´ ë²½ì„ í†µê³¼í•œ ìƒëª…체는 ì˜¤ì§ í•œ 번만 피해를 입는다.~ +%atsymbol%264=~ë‹¬ë¹›ì˜ ë²½~ +%atsymbol%263=~가시 분사 +(얼터레ì´ì…˜) +레벨: 4 +분야: ì‹ë¬¼ +시전 거리: 30 피트 +ì§€ì† ì‹œê°„: 순간 +시전 시간: 3 +효과 범위: 35 피트 90ë„ ì›ë¿” +내성 굴림: 1/2 +ì´ ì£¼ë¬¸ì„ ì´ìš©í•˜ë©´, 시전ìžëŠ” ê·¸ì˜ ì†ì—서부터 뾰족한 침ì´ë‚˜ 가시를 분사할 수 있게 ëœë‹¤. ì´ ì£¼ë¬¸ì€ 35피트 길ì´, 90ë„ ë¶€ì±„ê¼´ 모양으로 í¼ì ¸ 나가며, 2d10ì ì˜ 찌르기 피해를 준다. 만약 범위 ë‚´ì˜ ëª©í‘œê°€ 죽ìŒì— 대한 내성 êµ´ë¦¼ì— ì„±ê³µí•˜ë©´, 피해는 1d10으로 줄어들 것ì´ë‹¤.~ +%atsymbol%262=~가시 분사~ +%atsymbol%261=~모르겠는ë°.~ +%atsymbol%260=~파괴ì ì¸ íŒŒë„ +(ì¸ë³´ì¼€ì´ì…˜) +레벨: 4 +분야: ì •ë ¹ 물 +시전 거리: 100 피트 +ì§€ì† ì‹œê°„: 순간 +시전 시간: 9 +효과 범위: 특수 +내성 굴림: 특수 +ì´ ì£¼ë¬¸ì€ ì‹œì „ìžê°€ ì˜ë„í•œ 방향으로 나아가며 ê·¸ ì•žì˜ ì ë“¤ì„ ë®ì¹˜ëŠ” 강력한 5피트 너비 ë¬¼ì˜ íŒŒë„를 만들어낸다. ì´ íŒŒë„는 4d10ì ì˜ 부수기 피해를 주며, 추가ì ìœ¼ë¡œ 25%ì˜ í™•ë¥ ë¡œ 2 ë¼ìš´ë“œê°„ ë§ˆë¹„ë  ìˆ˜ë„ ìžˆê³ , 5%ì˜ í™•ë¥ ë¡œ ì˜ì‹ë¶ˆëª…ì— ë¹ ì§ˆ ìˆ˜ë„ ìžˆë‹¤. 만약 목표가 ë¸Œë ˆì“°ì— ëŒ€í•œ 내성 êµ´ë¦¼ì— ì„±ê³µí•˜ë©´, 피해는 절반으로 줄어들고, 마비나 ì˜ì‹ë¶ˆëª… 효과는 받지 않는다.~ +%atsymbol%259=~파괴ì ì¸ 파ë„~ +%atsymbol%258=~스타 메탈 곤봉~ +%atsymbol%257=~스타 메탈 곤봉~ +%atsymbol%256=~스타 메탈 곤봉 +(컨저레ì´ì…˜) +레벨: 4 +분야: 전투 +시전 거리: 0 +ì§€ì† ì‹œê°„: 3 í„´ +시전 시간: 7 +효과 범위: ì‹œì „ìž +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ ìš´ì„ì—ì„œ ì œë ¨ëœ ì‡ ë¡œ 만들어진 듯한, 1d6+2ì ì˜ 부수기 피해를 주고 ëª…ì¤‘ì— +2 보너스를 주는 í´ëŸ½ì„ 만들어 낸다. ë˜í•œ +4 무기ì—만 맞는 ìƒëŒ€ì—ê²Œë„ í”¼í•´ë¥¼ 줄 수 있다. ì´ í´ëŸ½ì€ 힘, 숙련ë„, 그리고 ì „ë¬¸í™”ì— ì˜í•œ 보너스나 페ë„티를 받는다. ë˜í•œ ì´ í´ëŸ½ì€ 비ìžì—°ì ì¸ ì (ì–¸ë°ë“œ, ì •ë ¹, 골렘, 외부 ì°¨ì›ì˜ ìƒëª…ì²´ 등)ì—게는 추가ì ìœ¼ë¡œ 2d6ì ì˜ 부수기 피해를 입힌다.~ +%atsymbol%255=~스타 메탈 곤봉~ +%atsymbol%254=~변함없는 지구력 +(네í¬ë¡œë§¨ì‹œ) +레벨: 4 +분야: 네í¬ë¡œë§¨í‹± +시전 거리: ì ‘ì´‰ +ì§€ì† ì‹œê°„: 순간 +시전 시간: 9 +효과 범위: í•œ ìƒëª…ì²´ +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ ì ‘ì´‰í•œ ìƒëª…ì²´ì˜ ì›ê¸°ë¥¼ 회복시켜, 모든 피로를 제거해준다.~ +%atsymbol%253=~변함없는 지구력~ +%atsymbol%252=~ì „ì—¼ë³‘ì˜ êµ¬ë¦„ +(얼터레ì´ì…˜) +레벨: 4 +분야: 전투, ì •ë ¹ 공기 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 4 ë¼ìš´ë“œ +시전 시간: 7 +효과 범위: 24 피드 반경 +내성 굴림: 무시 +ì´ ì£¼ë¬¸ì€ 24피트 ë°˜ê²½ì˜ ë²”ìœ„ ë‚´ì— ìžˆëŠ” 공기를 íšŒìƒ‰ì˜ êµ¬ì—­ì§ˆë‚˜ëŠ” 안개로 바꿔버린다. ì‹œì „ìž ìžì‹ ê³¼ 살아있지 ì•Šì€ ì¡´ìž¬ë“¤ì€ ì´ êµ¬ë¦„ì˜ íš¨ê³¼ì— ì˜í–¥ì„ 받지 않는다. ì´ ì§ˆë³‘ì— ì˜¤ì—¼ëœ ê³µê¸°ì— ì ‘ì´‰í•œ ìƒëŒ€ëŠ”, 1ë¼ìš´ë“œë‹¹ 힘과 ë¯¼ì²©ì´ 3씩 떨어지며, 3ì ì”©ì˜ 피해를 ìž…ê³ , ëˆˆì´ ë©€ê²Œ ëœë‹¤. ì´ íš¨ê³¼ëŠ” 1í„´ê°„ 지ì†ë˜ëŠ” 것ì´ë‹¤, ë¸Œë ˆì“°ì— ëŒ€í•œ 내성 굴림 성공시 무시. ì „ì—¼ë³‘ì˜ êµ¬ë¦„ì€ ì˜¤ì§ ì•…í•œ ìºë¦­í„°ë§Œ 사용할 수 있는 주문ì´ë‹¤.~ +%atsymbol%251=~ì „ì—¼ë³‘ì˜ êµ¬ë¦„~ +%atsymbol%250=~기절~ +%atsymbol%249=~치료ë¨~ +%atsymbol%248=~í”¼ì˜ ë¶„ë…¸ +(얼터레ì´ì…˜) +레벨: 4 +분야: 전투 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 2 í„´ +시전 시간: 7 +효과 범위: í•œ ìƒëª…ì²´ +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ ì˜¤ì§ í”Œë ˆì´ì–´ ìºë¦­í„°ë‚˜ ë™ë£Œì—게만 사용할 수 있다. ì´ ì£¼ë¬¸ì„ ì‚¬ìš©í•˜ë©´, 대ìƒì€ ê´‘í­í™”ë˜ì–´, ìžë™ì ìœ¼ë¡œ 가장 가까운 ìƒëª…체를 ì£½ì¼ ë•Œê¹Œì§€ 공격하게 ëœë‹¤. 그런 다ìŒ, ìžë™ìœ¼ë¡œ ë‹¤ìŒ ëª©í‘œì—게로 ì´ë™í•œë‹¤. í”¼ì˜ ë¶„ë…¸ ì£¼ë¬¸ì˜ ì˜í–¥ì„ 받는 ë™ì•ˆ, 대ìƒì€ 현혹, 수면, ê³µí¬, ì†ë°•, 기절, 혼란, ê°ì • 조종, ìƒì§• ì£¼ë¬¸ì— ë©´ì—­ì„ ê°€ì§€ê²Œ ëœë‹¤. ë˜í•œ, 대ìƒì€ ëª…ì¤‘ì— +2, í”¼í•´ì— +3ì˜ ë³´ë„ˆìŠ¤ë¥¼ 받으며, íž˜ì´ 2 ì¦ê°€í•˜ê³ , 추가로 10ì ì˜ ìƒëª…ì ì„ 얻게 ë˜ë©°, ì´ë™ ì†ë„ê°€ +2 ì¦ê°€í•œë‹¤. 그러나 ì´ ì£¼ë¬¸ì—는 몇 가지 ë¶€ìž‘ìš©ë„ ìžˆë‹¤. ì´ ì£¼ë¬¸ì´ ì§€ì†ë˜ëŠ” ë™ì•ˆ, 대ìƒì—게는 ì–´ë– í•œ 치료 ì£¼ë¬¸ë„ í†µí•˜ì§€ 않는다. ë˜í•œ ì£¼ë¬¸ì˜ ì§€ì† ì‹œê°„ì´ ë나면 대ìƒì€ 피로한 ìƒíƒœê°€ ë˜ë©°, 2í„´ ë™ì•ˆ íž˜ì´ 3으로 ê°ì†Œí•œë‹¤. í”¼ì˜ ë¶„ë…¸ëŠ” 질서 ì„±í–¥ì˜ ìºë¦­í„°ì—게는 ì˜í–¥ì„ 주지 않으며, 질서 ì„±í–¥ì˜ ìºë¦­í„°ëŠ” 시전할 ìˆ˜ë„ ì—†ë‹¤.~ +%atsymbol%247=~í”¼ì˜ ë¶„ë…¸~ +%atsymbol%246=~낭송 +(앱저레ì´ì…˜, ì¸ë³´ì¼€ì´ì…˜/ì´ë³´ì¼€ì´ì…˜) +레벨: 4 +분야: 전투 +시전 거리: 0 +ì§€ì† ì‹œê°„: 1 ë¼ìš´ë“œ/레벨 +시전 시간: 7 +효과 범위: 60 피트 반경 +내성 굴림: ì—†ìŒ +신성한 구절ì´ë‚˜ 선언서를 낭송함으로ì¨, 성ì§ìžëŠ” ê·¸ì˜ ì‹ ê²©ì˜ ì¶•ë³µì„ ë™ë£Œì™€ ìžì‹ ì—게 내리고, ì ì„ 혼란시키고 약화시킨다. 성ì§ìžì˜ ë™ë£ŒëŠ” 공격과 내성 êµ´ë¦¼ì— +2 보너스를 받고, ì ì€ 공격과 내성 êµ´ë¦¼ì— -2 페ë„티를 받는다. 낭송 ì£¼ë¬¸ì€ ê¸°ë„ ì£¼ë¬¸ì„ ìƒì‡„시키지 않는다. 즉, ë‘ ì£¼ë¬¸ì´ í•¨ê»˜ 걸리면 ê·¸ 효과가 누ì ëœë‹¤.~ +%atsymbol%245=~낭송~ +%atsymbol%244=~정전기 방출~ +%atsymbol%243=~정전하 +(얼터레ì´ì…˜) +레벨: 4 +분야: ê¸°ìƒ +시전 거리: 0 +ì§€ì† ì‹œê°„: 1 í„´/레벨 +시전 시간: 9 +효과 범위: 시전ìžì˜ 시야 ë‚´ +내성 굴림: 1/2 +정전하 ì£¼ë¬¸ì€ ì‹¤ë‚´ì—ì„œë„ ì‚¬ìš©í•  수 있다는 ì ì„ 제외하면 낙뢰 주문과 비슷하다. ì´ ì£¼ë¬¸ì€ ì‹œì „ìžê°€ 효과 범위 ë‚´ì˜ ìƒëª…ì²´ 주위로 ì •ì „ê¸°ì˜ ì „í•˜ë¥¼ ìƒì„±í•  수 있게 한다. ì´ ì „í•˜ëŠ” 2d8 ì ì˜ 전기 피해를 입히며, 추가로 시전ìžì˜ 레벨당 1d8 ì ì˜ 피해를 준다 (ì£¼ë¬¸ì— ëŒ€í•œ 내성 굴림 성공시 절반). 주문 ì§€ì† ì‹œê°„ì´ ëë‚  때까지 매 턴당 í•œ 번씩 전하가 방출ëœë‹¤.~ +%atsymbol%242=~정전하~ +%atsymbol%241=~화염 제조 +(얼터레ì´ì…˜) +레벨: 4 +분야: ì •ë ¹ 화염 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 1 ë¼ìš´ë“œ +시전 시간: 7 +효과 범위: 8 피트 반경 +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì„ ì‚¬ìš©í•˜ë©´, 목표 지ì ì—ì„œ ë¶ˆê½ƒì´ ë¶„ì¶œí•´ì„œ 효과 범위 ë‚´ì˜ ëª¨ë“  ìƒëª…ì²´ì—게 1d4ì ì˜ 화염 í”¼í•´ì— ì‹œì „ìžì˜ 레벨당 1ì ì˜ 피해를 입힌다. ìƒëª…체는 언제 효과 범위 ë‚´ì— ë“¤ì–´ì™”ëŠ”ì§€ì— ê´€ê³„ ì—†ì´ ë¼ìš´ë“œë‹¹ í•œ ë²ˆì˜ í”¼í•´ë¥¼ ìž…ì„ ê²ƒì´ë‹¤.~ +%atsymbol%240=~화염 제조~ +%atsymbol%239=~ì¼ë©”ì´í„°ì˜ í˜¸ì˜ +(네í¬ë¡œë§¨ì‹œ) +레벨: 3 +분야: 네í¬ë¡œë§¨í‹±, ë°©ì–´ +시전 거리: 30 피트 +ì§€ì† ì‹œê°„: 순간 +시전 시간: 6 +효과 범위: í•œ ìƒëª…ì²´ +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì„ ì‹œì „í•˜ë©´ 시전ìžëŠ” 모든 ë¬¼ë¦¬ì  ìƒí•´ë¥¼ í¬í•¨í•´ 대ìƒê³¼ ìžì‹ ì˜ ìƒëª…ë ¥ì„ êµí™˜í•œë‹¤. ì´ ì£¼ë¬¸ì€ ì‹œì „ìžê°€ 대ìƒë³´ë‹¤ ë§Žì€ ìƒëª…ì ì„ 가지고 있어야만 ìž‘ë™í•œë‹¤. êµí™˜ì€ 시전ìžê°€ ì •ìƒì ìœ¼ë¡œ 피해를 치유할 때까지 ì˜êµ¬ì ì´ë‹¤. êµí™˜ì€ 주문 시전 범위를 초과하지 않는 거리 ë‚´ì—ì„œ 수행할 수 있다. ì˜¤ì§ ìƒëª…ì ë§Œ êµí™˜ë˜ë©°, 시전ìžëŠ” 질병, ë…, 숙취나 다른 유사한 ê³ í†µì€ ëŒ€ìƒê³¼ êµí™˜í•  수 없다. +ì´ ì£¼ë¬¸ì€ ì•… 성향 ìºë¦­í„°ëŠ” 시전할 수 없으며, ì–¸ë°ë“œ, 주조물, 다른 ì°¨ì›ì—ì„œ 온 ìƒëª…ì²´ì—게는 효과가 없다.~ +%atsymbol%238=~ì¼ë©”ì´í„°ì˜ 호ì˜~ +%atsymbol%237=~중급 ìƒì²˜ 입히기 +(네í¬ë¡œë§¨ì‹œ) +레벨: 3 +분야: 치유 +시전 거리: ì ‘ì´‰ +ì§€ì† ì‹œê°„: 순간 +시전 시간: 5 +효과 범위: í•œ ìƒëª…ì²´ +내성 굴림: 1/2 +ì´ ì£¼ë¬¸ì„ ì‹œì „í•˜ê³  í•œ ìƒëª…ì²´ì—게 접촉하면, 사제는 ê·¸ ìƒëª…ì²´ì˜ ëª¸ì— 14ì ì˜ 피해(내성 êµ´ë¦¼ì— ì„±ê³µí•˜ë©´ 절반.)를 줄 수 있다. ì´ ì£¼ë¬¸ì€ ì–¸ë°ë“œë‚˜ 주조물, í˜¹ì€ ë‹¤ë¥¸ ì°¨ì›ì˜ ìƒëª…ì²´ì—게는 íš¨ë ¥ì´ ì—†ë‹¤. ì„ í•œ ìºë¦­í„°ëŠ” 중급 ìƒì²˜ 입히기를 사용할 수 없다.~ +%atsymbol%236=~중급 ìƒì²˜ 입히기~ +%atsymbol%235=~í­í’ì˜ ë³´í˜¸ë§‰ +(앱저레ì´ì…˜) +레벨: 3 +분야: ë°©ì–´, 날씨 +시전 거리: 0 +ì§€ì† ì‹œê°„: 1 í„´ +시전 시간: 6 +효과 범위: ì‹œì „ìž +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ ì‹œì „ìž ì£¼ë³€ì— íŒŒê´´ì ì¸ ì—너지를 가진 ë°ì€ 구체를 만들어낸다. ì´ êµ¬ì²´ëŠ” 시전ìžë¥¼ ë”°ë¼ì„œ ê°™ì´ ì›€ì§ì¸ë‹¤. ì´ í­í’ì˜ ë³´í˜¸ë§‰ì€ ì‹œì „ìžì˜ 불, 냉기, 전기 í”¼í•´ì— ëŒ€í•œ ì €í•­ë ¥ì„ 50% ì¦ê°€ì‹œì¼œ 준다.~ +%atsymbol%234=~í­í’ì˜ ë³´í˜¸ë§‰~ +%atsymbol%233=~ê³°íŒ¡ì´ ì ‘ì´‰ +(얼터레ì´ì…˜) +레벨: 3 +분야: ì‹ë¬¼ +시전 거리: ì ‘ì´‰ +ì§€ì† ì‹œê°„: 특수 +시전 시간: 6 +효과 범위: 10 피트 반경 +내성 굴림: 특수 +ì´ ì£¼ë¬¸ì€ ì‹œì „ìžê°€ 접촉한 í•œ ìƒëª…체를, 빠르게 확산ë˜ëŠ” 갈색 곰팡ì´ì— 오염ë˜ë„ë¡ ë§Œë“ ë‹¤. ì´ë ‡ê²Œ ì˜¤ì—¼ëœ ìƒëŒ€ëŠ” ì£¼ë¬¸ì— ëŒ€í•œ 내성 êµ´ë¦¼ì„ í•´ì•¼ 하며, 만약 내성 êµ´ë¦¼ì— ì‹¤íŒ¨í•˜ë©´ 심ê°í•˜ê²Œ ì˜¤ì—¼ëœ ê²ƒì´ ë˜ì–´ 아래와 ê°™ì€ í”¼í•´ë¥¼ 입게 ëœë‹¤: +첫 번째 ë¼ìš´ë“œ: 4d6 피해. +ë‘ ë²ˆì§¸ ë¼ìš´ë“œ: 3d6 피해. +세 번째 ë¼ìš´ë“œ: 2d6 피해. +네 번째 ë¼ìš´ë“œ: 1d6 피해. +만약 내성 êµ´ë¦¼ì— ì„±ê³µí–ˆë‹¤ë©´, 피해는 아래처럼 줄어든다: +첫 번째 ë¼ìš´ë“œ: 2d6 피해. +ë‘ ë²ˆì§¸ ë¼ìš´ë“œ: 1d6 피해. +세 번째 ë¼ìš´ë“œ: 1d6 피해. +첫 번째 ë¼ìš´ë“œê°€ 지나고 ë‚œ 다ìŒì˜ ê° ë¼ìš´ë“œë§ˆë‹¤, ì£¼ë¬¸ì˜ í”¼í•´ìžì—게서 10피트 반경 ì•ˆì— ìžˆëŠ” 가장 가까운 ìƒëª…체는 ì£¼ë¬¸ì— ëŒ€í•œ 내성 êµ´ë¦¼ì„ í•´ì•¼ 한다. 만약 실패하면, 그는 ë˜‘ê°™ì´ ê³°íŒ¡ì´ì— 오염ëœë‹¤. ì´ë ‡ê²Œ ì˜¤ì—¼ëœ ìƒëŒ€ëŠ” 다시 처ìŒë¶€í„° 내성 êµ´ë¦¼ì„ í•´ì•¼ 한다. ì´ëŸ¬í•œ 오염 과정ì€, 곰팡ì´ê°€ ì ì ˆí•œ 숙주를 ë”ì´ìƒ 찾지 못할 때까지 계ì†ëœë‹¤. ì´ë¯¸ 곰팡ì´ì— ì˜¤ì—¼ëœ ëŒ€ìƒì€ 다시 오염ë˜ì§€ 않는다. ì£¼ë¬¸ì´ ì‚¬ë¼ì§€ê³  나면, ì´ ê°ˆìƒ‰ 곰팡ì´ë“¤ì€ 아주 빨리 사ë¼ì§ˆ 것ì´ë‹¤.~ +%atsymbol%232=~ê³°íŒ¡ì´ ì ‘ì´‰~ +%atsymbol%231=~í­ìš° +(ì¸ë³´ì¼€ì´ì…˜) +레벨: 3 +분야: ì •ë ¹ 물 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 2 ë¼ìš´ë“œ +시전 시간: 6 +효과 범위: 35 피트 반경 +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ íš¨ê³¼ 범위 내를 완전히 젖게 하는 마법ì ì¸ 비를 만들어 낸다. 냉기, í˜¹ì€ ë¶ˆë¡œ ì´ë£¨ì–´ì§„ 환경ì—ì„œ 살아가는 모든 ìƒëª…체는, 매 ë¼ìš´ë“œë‹¹ 2d3ì ì˜ 마법 피해를 입는다. ë˜í•œ, 효과 범위 ë‚´ì— ìžˆëŠ” 모든 ìƒëª…체는 매 ë¼ìš´ë“œë§ˆë‹¤ 50%ì˜ í™•ë¥ ë¡œ 2d6ì ì˜ 피해를 주는 ë²ˆê°œì— ë§žê²Œ ëœë‹¤. ì´ ë²ˆê°œëŠ” ì£¼ë¬¸ì— ëŒ€í•œ 내성 êµ´ë¦¼ì— ì„±ê³µí•  경우 ì ˆë°˜ì˜ í”¼í•´ë§Œì„ ìž…ížŒë‹¤. 화염 칼날 주문, í™”ì—¼ì˜ ìž¥ë§‰, í˜¹ì€ ìƒëŸ¬ë§¨ë”ì˜ ì˜¤ë¼ ë“±ì€ í­ìš° ì£¼ë¬¸ì— ì˜í•´ 사ë¼ì§„다.~ +%atsymbol%230=~í­ìš°~ +%atsymbol%229=~가시 성장 +(얼터레ì´ì…˜) +레벨: 3 +분야: ì •ë ¹ 대지 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 1 í„´ +시전 시간: 6 +효과 범위: 30 피트 반경 +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ ì£¼ë³€ ì§€í˜•ì„ ê°€ì‹œê°€ ë‹ì•„ë‚œ ì‹ë¬¼ë¡œ 변화시킨다. 범위 ì•ˆì— ë“¤ì–´ì˜¤ëŠ” 모든 ìƒëª…체는 ì£¼ë¬¸ì´ ì§€ì†ë˜ëŠ” ë™ì•ˆ 매 ë¼ìš´ë“œë§ˆë‹¤ 1d4ì ì˜ 찌르기 피해와 1d4ì ì˜ 베기 피해를 입게 ëœë‹¤.~ +%atsymbol%228=~가시 성장~ +%atsymbol%227=~ë¼ˆì˜ ì› +(네í¬ë¡œë§¨ì‹œ) +레벨: 3 +분야: 수호, 창조 +시전 거리: 0 +ì§€ì† ì‹œê°„: 3 ë¼ìš´ë“œ +시전 시간: 3 +효과 범위: 3 피트 반경 +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ ì‹œì „ìžì˜ 주위를 빠르게 회전하는 ë¼ˆì˜ ë°©ì–´ë§‰ì„ ë§Œë“¤ì–´ ë‚´ë©°, 시전ìžëŠ” ì£¼ë¬¸ì˜ ì§€ì† ì‹œê°„ ë™ì•ˆ 움ì§ì¼ 수 없다. ì´ ë¼ˆì˜ ì§„ë¡œë¥¼ 침범하는 ìžëŠ” 누구나 1d6ì˜ ë¶€ìˆ˜ê¸° 피해와 ë¼ìš´ë“œ 당 1d6ì˜ ë² ê¸° 피해를 입는다. ì„  ì„±í–¥ì˜ ìºë¦­í„°ëŠ” ë¼ˆì˜ ì›ì„ 시전할 수 없다.~ +%atsymbol%226=~ë¼ˆì˜ ì›~ +%atsymbol%225=~문블레ì´ë“œ~ +%atsymbol%224=~문블레ì´ë“œ~ +%atsymbol%223=~문블레ì´ë“œ +(ì¸ë³´ì¼€ì´ì…˜) +레벨: 3 +분야: 전투, 태양 +시전 거리: 0 +ì§€ì† ì‹œê°„: 2 í„´ +시전 시간: 6 +효과 범위: ì‹œì „ìž +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ ë‹¬ë¹›ì„ ëª¨ì•„ 조용하고, ë¬´ê²Œë„ ì—†ëŠ” 4피트 길ì´ì˜ ê²€ 형태로 바꾸어준다. ì´ëŠ” 시전ìžì˜ ì†ì—ì„œ ìƒê²¨ë‚˜ë©°, +4 무기ì—만 맞는 ìƒëŒ€ë„ 명중시킬 수 있다. 그러나 실제 THAC0ì—는 보너스를 주지 않는다. ë˜í•œ 문블레ì´ë“œì˜ 비 ë¬¼ë¦¬ì  íŠ¹ì„± 때문ì—, íž˜ì— ì˜í•œ 근접전 ë³´ë„ˆìŠ¤ë„ ì ìš©ë˜ì§€ 않는다. +문블레ì´ë“œì˜ ê³µê²©ì€ ìƒëŒ€ì˜ ìƒëª…ë ¥ì„ í¡ìˆ˜í•˜ë©°, 1d12+4ì ì˜ 마법 피해를 입힌다. ë˜í•œ ê·¸ ìƒëŒ€ê°€ ì–¸ë°ë“œì´ê±°ë‚˜ ë¹›ì— íŠ¹ížˆ 민ê°í•˜ë‹¤ë©´, 추가로 1d12ì ì˜ 피해를 ë” ìž…ê²Œ ëœë‹¤. ë˜í•œ ì´ ê³µê²©ì— ëª…ì¤‘ëœ ìƒëŒ€ëŠ” ì¼ì‹œì ìœ¼ë¡œ ë§ˆë²•ì´ í˜¼ëž€ìŠ¤ëŸ¬ì›Œì ¸, ë‹¤ìŒ ë¼ìš´ë“œì— 사용하는 ë§ˆë²•ì€ ìžë™ì ìœ¼ë¡œ 실패하게 ëœë‹¤.~ +%atsymbol%222=~문블레ì´ë“œ~ +%atsymbol%221=~ìž ì´ ë“¬~ +%atsymbol%220=~찬양 +(앱저레ì´ì…˜) +레벨: 3 +분야: 치유 +시전 거리: ì ‘ì´‰ +ì§€ì† ì‹œê°„: 1 í„´ +시전 시간: 9 +효과 범위: í•œ ìƒëª…ì²´ +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ í•œ ìƒëª…체를 ë•ê¸° 위해서 사용ë˜ê³¤ 하지만, 사제 ìžì‹ ì—게 사용할 수는 없다. 시전 ìƒëŒ€ì™€ 접촉하면, 그는 ê³µí¬, 수면, 정신박약, ì˜ì‹ë¶ˆëª…, ì¤‘ë… ë“±ì— ì˜í•œ 효과ì—ì„œ 벗어나게 ë˜ë©°, ë™ì‹œì— ê´‘í­í™”나 ì •ì‹ ì  í˜¼ëž€ë„ ê·¹ë³µí•  수 있게 ëœë‹¤. ë˜í•œ, ì£¼ë¬¸ì˜ íš¨ê³¼ë¥¼ ë°›ì€ ìžëŠ” ì£¼ë¬¸ì˜ ì§€ì† ì‹œê°„ ë™ì•ˆ 그러한 효과를 불러 ì¼ìœ¼í‚¤ëŠ” ì£¼ë¬¸ì— ëŒ€í•´ 보호받게 ëœë‹¤.~ +%atsymbol%219=~찬양~ +%atsymbol%218=~질병 유발 +(네í¬ë¡œë§¨ì‹œ) +레벨: 3 +분야: 치유 +시전 거리: ì ‘ì´‰ +ì§€ì† ì‹œê°„: 8 시간 +시전 시간: 9 +효과 범위: í•œ ìƒëª…ì²´ +내성 굴림: 무시 +ì´ ì£¼ë¬¸ì€ ì‚¬ì œê°€ 접촉한 í•œ ìƒëŒ€ë¥¼ 질병으로 오염시켜, ê·¸ì˜ íž˜ì„ 5d4ì  ë‚´ë ¤ê°€ê²Œ 만든다. ì£¼ë¬¸ì— ëŒ€í•œ 내성 êµ´ë¦¼ì— ì„±ê³µí•˜ë©´, ì´ íš¨ê³¼ëŠ” 무효화ëœë‹¤. ì´ ì£¼ë¬¸ì€ ì–¸ë°ë“œ, 주조물, í˜¹ì€ ë‹¤ë¥¸ ì°¨ì›ì˜ ìƒëª…ì²´ì—게는 íš¨ë ¥ì´ ì—†ë‹¤. ì„  ì„±í–¥ì˜ ìºë¦­í„°ëŠ” ì´ ì£¼ë¬¸ì„ ì‚¬ìš©í•  수 없다.~ +%atsymbol%217=~질병 유발~ +%atsymbol%216=~전투 페ë„í‹°~ +%atsymbol%215=~전투 보너스~ +%atsymbol%214=~ê¸°ë„ +(컨저레ì´ì…˜/서모ë‹) +레벨: 3 +분야: 전투 +시전 거리: 0 +ì§€ì† ì‹œê°„: 1 ë¼ìš´ë“œ/레벨 +시전 시간: 6 +효과 범위: 60 피트 반경 +내성 굴림: ì—†ìŒ +ê¸°ë„ ì£¼ë¬¸ì€ ì„±ì§ìžì™€ ê·¸ì˜ ë™ë£Œë“¤ì—게 ì¶•ë³µì„ ë‚´ë¦¬ê³ , ì ì—게는 저주를 건다. ë™ë£Œë“¤ì€ 모든 공격, 피해, 내성 êµ´ë¦¼ì— +1ì˜ ë³´ë„ˆìŠ¤ë¥¼ 받고, ì ì€ 모든 공격, 피해, 내성 êµ´ë¦¼ì— -1ì˜ íŽ˜ë„티를 받는다. ì£¼ë¬¸ì´ ë°œë™ë  ë•Œ 효과 범위 ë‚´ì— ìžˆë˜ ëª¨ë“  ìƒëª…체는 ê·¸ ì§€ì—­ì„ ë²—ì–´ë‚˜ë„ ê³„ì†ì ìœ¼ë¡œ ì£¼ë¬¸ì˜ íš¨ë ¥ì„ ë°›ëŠ”ë‹¤. 만약 파ì´í„°ê°€ ë„ë§ì¹˜ëŠ” ê³ ë¸”ë¦°ì„ ì«“ì•„ê°„ë‹¤ê³  í•´ë„ ê¸°ë„ ì£¼ë¬¸ì˜ íš¨ê³¼ëŠ” 그를 ë”°ë¼ê°ˆ 것ì´ë‹¤.~ +%atsymbol%213=~기ë„~ +%atsymbol%212=~보통 ìƒì²˜ 입히기 +(네í¬ë¡œë§¨ì‹œ) +레벨: 2 +분야: 치유 +시전 거리: ì ‘ì´‰ +ì§€ì† ì‹œê°„: 순간 +시전 시간: 5 +효과 범위: í•œ ìƒëª…ì²´ +내성 굴림: 1/2 +ì´ ì£¼ë¬¸ì„ ì‹œì „í•˜ê³  í•œ ìƒëª…ì²´ì—게 접촉하면, 사제는 ê·¸ ìƒëª…ì²´ì˜ ëª¸ì— 11ì ì˜ 피해(내성 êµ´ë¦¼ì— ì„±ê³µí•˜ë©´ 절반.)를 줄 수 있다. ì´ ì£¼ë¬¸ì€ ì–¸ë°ë“œë‚˜ 주조물, í˜¹ì€ ë‹¤ë¥¸ ì°¨ì›ì˜ ìƒëª…ì²´ì—게는 íš¨ë ¥ì´ ì—†ë‹¤. ì„ í•œ ìºë¦­í„°ëŠ” 보통 ìƒì²˜ 입히기를 사용할 수 없다.~ +%atsymbol%211=~보통 ìƒì²˜ 입히기~ +%atsymbol%210=~ì•¼ìˆ˜ì˜ ë°œí†±~ +%atsymbol%209=~ì•¼ìˆ˜ì˜ ë°œí†±~ +%atsymbol%208=~ì•¼ìˆ˜ì˜ ë°œí†± +(얼터레ì´ì…˜) +레벨: 2 +분야: 전투 +시전 거리: 0 +ì§€ì† ì‹œê°„: 1 í„´ +시전 시간: 5 +효과 범위: ì‹œì „ìž +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ ì‹œì „ìžì˜ 팔ì—ì„œ 강력한 ì•¼ìˆ˜ì˜ ë°œí†±ì´ ë‚˜ì˜¤ê²Œ 만들며, 시전ìžì˜ íž˜ì„ 18/72ë¡œ 만들어 주고, ìƒëŒ€ì—게 2d4(+힘 보너스)ì ì˜ 피해를 입히는 할퀴기 ê³µê²©ì„ í•  수 있게 í•´ 준다. 시전ìžëŠ” ì´ ì§ìŠ¹ì˜ ë°œí†±ì„ ì´ìš©í•´ ëª…ì¤‘ì— +2ì˜ ë³´ë„ˆìŠ¤ë¥¼ 받고 매 ë¼ìš´ë“œë‹¹ 2ë²ˆì˜ ê³µê²©ì„ ê°€í•  수 있게 ëœë‹¤.~ +%atsymbol%207=~ì•¼ìˆ˜ì˜ ë°œí†±~ +%atsymbol%206=~ì€ìƒ‰ì˜ 보호범위 밖으로 벗어났다. (ACì— 2 페ë„티를 받는다.)~ +%atsymbol%205=~알리콘 ì°½ +(ì¸ë³´ì¼€ì´ì…˜) +레벨: 2 +분야: 전투 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 순간 +시전 시간: 5 +효과 범위: í•œ ìƒëª…ì²´ +내성 굴림: 특수 +ì´ ì£¼ë¬¸ì€ ì€ìƒ‰ì„ ëˆ, 부분ì ìœ¼ë¡œ ì—테르로 ì´ë£¨ì–´ì§„ ì°½ì„ ë§Œë“¤ì–´ 낸다. ì´ ì°½ì€ ì•Œë¦¬ì½˜(ìœ ë‹ˆì½˜ì˜ ë¿”) ëª¨ì–‘ì„ í•˜ê³  있다. ì£¼ë¬¸ì˜ ì‹œì „ìžê°€ 목표를 정하면, 알리콘 ì°½ì€ ì¦‰ì‹œ 그것ì—게로 날아가며, 3d6ì˜ ì°Œë¥´ê¸° 피해를 입힌다. ì´ëŠ” ì£¼ë¬¸ì— ëŒ€í•œ 내성 êµ´ë¦¼ì— ì„±ê³µí•˜ë©´ 절반으로 ì¤„ì¼ ìˆ˜ 있다. 알리콘 ì°½ì€ ê³µê²©í•œ ë’¤ì— ì‚¬ë¼ì§€ì§€ë§Œ, ëª…ì¤‘ëœ ìƒëŒ€ì˜ 주변ì—는 ì€ìƒ‰ì˜ ë¹›ì´ ë¹„ì¹˜ë©° ê·¸ ìƒëŒ€ë¥¼ 보다 쉽게 발견하고 공격할 수 있게 한다. ì´ëŠ” ìƒëŒ€ì˜ ë°©ì–´ë„ì— 3 ë¼ìš´ë“œê°„ -2 페ë„í‹°ë¡œ 작용한다.~ +%atsymbol%204=~알리콘 ì°½~ +%atsymbol%203=~치료ë¨~ +%atsymbol%202=~보통 ìƒì²˜ 치료 +(네í¬ë¡œë§¨ì‹œ) +레벨: 2 +분야: 치유 +시전 거리: ì ‘ì´‰ +ì§€ì† ì‹œê°„: 순간 +시전 시간: 5 +효과 범위: í•œ ìƒëª…ì²´ +내성 굴림: ì—†ìŒ +보통 ìƒì²˜ 치료는 1레벨 사제 ì£¼ë¬¸ì˜ ê²½ìƒ ì¹˜ë£Œì˜ ê°•í™”íŒì´ë©°, 11ì ì˜ ìƒëª…ì ê³¼ 숙취를 치료한다. ì´ ì£¼ë¬¸ì€ ì–¸ë°ë“œ, 주조물, 다른 ì°¨ì›ì˜ ìƒëª…ì²´ì—게는 효과가 없다.~ +%atsymbol%201=~보통 ìƒì²˜ 치료~ +%atsymbol%200=~실명~ +%atsymbol%199=~햇빛 태우기 +(ì¸ë³´ì¼€ì´ì…˜) +레벨: 1 +분야: 태양 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 순간 +시전 시간: 4 +효과 범위: í•œ ìƒëª…ì²´ +내성 굴림: 특수 +ì´ ì£¼ë¬¸ì„ ì‹œì „í•˜ë©´, 피부를 ê·¸ì„리는 뜨거운 ê´‘ì„ ì´ í•˜ëŠ˜ë¡œë¶€í„° 내려와 시전ìžê°€ 지정한 ìƒëŒ€ì—게 ì˜ì—¬ì§„다. ì´ ê´‘ì„ ì— ë§žì€ ìƒëŒ€ëŠ” 1d6ì ì˜ 피해를 입게 ë˜ë©°, 시전ìžì˜ 레벨당 1ì ì˜ 피해를 추가ì ìœ¼ë¡œ 입는다. ì–¸ë°ë“œë‚˜ ë¹›ì— ì•½í•œ ê´´ë¬¼ë“¤ì€ 1d6ì ì˜ 기본 피해ì—다가, 시전ìžì˜ 레벨당 2ì ì”©ì˜ 피해를 ë” ìž…ê²Œ ëœë‹¤. ì´ëŸ¬í•œ 피해 효과 외ì—ë„, 피해ìžëŠ” 3ë¼ìš´ë“œ ë™ì•ˆ ëˆˆì´ ë©€ê²Œ ëœë‹¤. ì£¼ë¬¸ì— ëŒ€í•œ 내성 êµ´ë¦¼ì— ì„±ê³µí•  경우 ì ˆë°˜ì˜ í”¼í•´ë§Œ 입는다.~ +%atsymbol%198=~햇빛 태우기~ +%atsymbol%197=~가벼운 ìƒì²˜ 입히기 +(네í¬ë¡œë§¨ì‹œ) +레벨: 1 +분야: 치유 +시전 거리: ì ‘ì´‰ +ì§€ì† ì‹œê°„: 순간 +시전 시간: 5 +효과 범위: í•œ ìƒëª…ì²´ +내성 굴림: 1/2 +ì´ ì£¼ë¬¸ì„ ì‹œì „í•˜ê³  í•œ ìƒëŒ€ì™€ 접촉하면, ê·¸ ìƒëŒ€ëŠ” 8ì ì˜ 피해를 입게 ëœë‹¤.(내성 êµ´ë¦¼ì— ì„±ê³µí•˜ë©´ ì ˆë°˜ì˜ í”¼í•´ë§Œì„ ìž…ëŠ”ë‹¤.) ì´ ì£¼ë¬¸ì€ ì–¸ë°ë“œ, 주조물, í˜¹ì€ ë‹¤ë¥¸ ì°¨ì›ì˜ ìƒëª…ì²´ì—게는 효과가 없다. ì„  ì„±í–¥ì˜ ìºë¦­í„°ëŠ” 가벼운 ìƒì²˜ 입히기 ì£¼ë¬¸ì„ ì‚¬ìš©í•  수 없다.~ +%atsymbol%196=~가벼운 ìƒì²˜ 입히기~ +%atsymbol%195=~저주받ìŒ~ +%atsymbol%194=~저주 +(컨저레ì´ì…˜/서모ë‹) +레벨: 1 +분야: ì „ì²´ +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 6 ë¼ìš´ë“œ +시전 시간: 9 +효과 범위: 30 피트 반경 +내성 굴림: ì—†ìŒ +저주 ì£¼ë¬¸ì„ ìŠìœ¼ë©´, 시전ìžëŠ” ì ì˜ 사기를 낮추고 내성 굴림과 명중 êµ´ë¦¼ì— -1ì˜ íŽ˜ë„티를 준다. ì£¼ë¬¸ì´ ë°œë™ë˜ëŠ” 즉시, 시전ìžê°€ 지정한 ì ì„ 중심으로 30 피트 반경 ë‚´ì˜ ëª¨ë“  ìƒëª…ì²´ê°€ ì£¼ë¬¸ì— ì˜í–¥ì„ 받게 ëœë‹¤. ì´ë¯¸ ì£¼ë¬¸ì— ê±¸ë¦° ìƒëª…체는 효과 범위를 ë²—ì–´ë‚˜ë„ ê³„ì† ì£¼ë¬¸ì˜ íš¨ë ¥ì„ ë°›ê²Œ ë˜ê³ , ì£¼ë¬¸ì´ ë°œë™ëœ í›„ì— íš¨ê³¼ 범위 ë‚´ì— ë“¤ì–´ì˜¨ ìƒëª…체는 ì£¼ë¬¸ì˜ íš¨ë ¥ì„ ë°›ì§€ 않는다.~ +%atsymbol%193=~저주~ +%atsymbol%192=~ëŒì˜ 눈 +ì´ ëˆˆì€ ì‹œì „ìžë¥¼ ì„í™” 공격으로부터 í•œ 번 보호해 준다. +ì´ëŠ” ë˜í•œ 마법사 3레벨 ì£¼ë¬¸ì¸ ì¸ê°„형 ì†ë°•ìœ¼ë¡œ 사용할 ìˆ˜ë„ ìžˆê³ , ì¸ê°„ í¬ê¸°ê±°ë‚˜ 그보다 ìž‘ì€ ìƒëª…체를 레벨 당 1 ë¼ìš´ë“œ ë™ì•ˆ 움ì§ì´ì§€ 못하게 한다(ì£¼ë¬¸ì— ëŒ€í•œ 내성 굴림 성공시 무시).~ +%atsymbol%191=~ëŒì˜ 눈~ +%atsymbol%190=~ì˜í˜¼ì˜ 눈 +ì´ ëˆˆì€ ì¦‰ì‚¬ ê³„ì—´ì˜ ë§ˆë²•(죽ìŒì˜ 주문, 죽ìŒì˜ ì†ê°€ë½, 파워 워드: 죽ìŒ, ìƒëª…ì²´ ì‚´í•´, 파괴 등)으로부터 시전ìžë¥¼ í•œ 번 보호해 준다. +마법사는 ì´ ëˆˆì˜ ëŠ¥ë ¥ì„ ë³€í™˜í•´ 마법사 2레벨 ì£¼ë¬¸ì¸ ì•½í™” 광선으로 사용할 ìˆ˜ë„ ìžˆë‹¤. ì´ ê´‘ì„ ì€ ìƒëŒ€ì˜ íž˜ì„ 5ë¡œ 떨어뜨린다(ì£¼ë¬¸ì— ëŒ€í•œ 내성 굴림 성공시 무시).~ +%atsymbol%189=~ì˜í˜¼ì˜ 눈~ +%atsymbol%188=~ê°•ì¸í•¨ì˜ 눈 +ì´ ëˆˆì€ ê¸°ì ˆ, 귀멀게 하기, 눈멀게 하기, í˜¹ì€ ì¹¨ë¬µì˜ íš¨ê³¼ë¥¼ í•œ 번 막아준다. +ì´ëŠ” ë˜í•œ 마법사 4레벨 ì£¼ë¬¸ì¸ ì™¸ì¹¨ìœ¼ë¡œ 사용할 ìˆ˜ë„ ìžˆê³ , 35 피트 ì›ë¿” ë‚´ì˜ ëª¨ë“  ìƒëª…체는 4d6ì ì˜ 마법 피해와 함께 실청ëœë‹¤(ì£¼ë¬¸ì— ëŒ€í•œ 내성 굴림 성공시 ì ˆë°˜ì˜ í”¼í•´ë¥¼ ìž…ê³  실청 효과는 무시ëœë‹¤).~ +%atsymbol%187=~ê°•ì¸í•¨ì˜ 눈~ +%atsymbol%186=~ë…ì˜ ëˆˆ +ì´ ëˆˆì€ ì‹œì „ìžë¥¼ 노리고 가해진 ë… ê³µê²©ì´ë‚˜ ë… íš¨ê³¼ë¥¼ í•œ 번 무효화해 준다. +ì´ ëˆˆì€ ë˜í•œ 성ì§ìž 4레벨 ì£¼ë¬¸ì¸ ë…으로 사용할 ìˆ˜ë„ ìžˆê³ , ëŒ€ìƒ ìƒëª…체는 20ì´ˆ ë™ì•ˆ 20ì ì˜ ë… í”¼í•´ë¥¼ 입는다(ë…ì— ëŒ€í•œ 내성 굴림 성공시 무시).~ +%atsymbol%185=~ë…ì˜ ëˆˆ~ +%atsymbol%184=~ê²€ì˜ ëˆˆ +ì´ ëˆˆì€ ì‹œì „ìžë¥¼ 노린 첫 번째 ë¬¼ë¦¬ì  ê³µê²©ì„ ë¹—ë‚˜ê°€ê²Œ í•´ 준다. +ì´ ëˆˆì€ ë˜í•œ 1레벨 마법사 ì£¼ë¬¸ì¸ ë§ˆë²• 화살로 사용할 ìˆ˜ë„ ìžˆê³ , 최대 발사체 5ê°œ(매 2레벨당 1ê°œì˜ í™”ì‚´ 추가)를 만들어 ë‚´ì„œ í•œ 개당 1d4+1ì ì˜ 마법 피해를 준다.~ +%atsymbol%183=~ê²€ì˜ ëˆˆ~ +%atsymbol%182=~ë§ˆë²•ì‚¬ì˜ ëˆˆ +ì´ ëˆˆì€ ë¶ˆ, 전기, 냉기, í˜¹ì€ ì‚°ì„± 피해를 í•œ 번 í¡ìˆ˜í•´ 준다. +ì´ ëˆˆì€ ë˜í•œ 3레벨 마법사 ì£¼ë¬¸ì¸ ë²ˆê°œ 화살로 사용할 ìˆ˜ë„ ìžˆê³ , 경로 ë‚´ì˜ ëª¨ë“  ìƒëª…체는 ì‹œì „ìž ë ˆë²¨ë‹¹ 1d6ì ì˜ 전기 피해 (최대 10d6)를 입는다.~ +%atsymbol%181=~ë§ˆë²•ì‚¬ì˜ ëˆˆ~ +%atsymbol%180=~ì •ì‹ ì˜ ëˆˆ +ì´ ëˆˆì€ ì‹œì „ìžë¥¼ 현혹, ê°ì • 조종, ê³µí¬ ë“±ì˜ ì •ì‹  공격으로부터 보호해 준다. +ì´ ëˆˆì€ ë˜í•œ 마법사 1레벨 ì£¼ë¬¸ì¸ ì¸ê°„형 현혹으로 사용할 ìˆ˜ë„ ìžˆê³ , 시전ìžëŠ” ì¸ê°„형 ìƒëª…체를 1í„´ ë™ì•ˆ 조종(ì£¼ë¬¸ì— ëŒ€í•œ 내성 굴림 성공시 무시)한다.~ +%atsymbol%179=~ì •ì‹ ì˜ ëˆˆ~ +%atsymbol%178=~현재 ì ìš©ì¤‘ì¸ íš¨ê³¼ê°€ 사ë¼ê¸°ì§€ ì „ì—는 ì´ ì£¼ë¬¸ì„ ì‹œì „í•  수 없습니다.~ +%atsymbol%177=~ì¼ê³± ê°œì˜ ëˆˆ +(앱저레ì´ì…˜) +레벨: 7 +시전 거리: 0 +ì§€ì† ì‹œê°„: 2 í„´ +시전 시간: 7 +효과 범위: ì‹œì „ìž +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ ì‹œì „ìžì˜ 머리 위ì—ì„œ 빙빙 ë„는 ì¼ê³± ê°œì˜ ë§ˆë²•ì ì¸ 보주를 만들어 낸다. ê°ê°ì˜ ëˆˆë“¤ì€ ê³µê²©ì ì¸, í˜¹ì€ ë°©ì–´ì ì¸ ëŠ¥ë ¥ì„ ì§€ë‹ˆê³  있으며, í•œ 번 사용하면 ê·¸ íš¨ë ¥ì„ ìžƒì–´ë²„ë¦°ë‹¤. ëˆˆì´ í•˜ë‚˜ë¼ë„ 남아있는 ìƒí™©ì—ì„œ 다시 ì¼ê³± ê°œì˜ ëˆˆ ì£¼ë¬¸ì„ ì‚¬ìš©í•˜ë©´, ê·¸ ì£¼ë¬¸ì€ ìžë™ìœ¼ë¡œ 실패할 것ì´ë‹¤. ê°ê°ì˜ ëˆˆì´ ì§€ë‹Œ íž˜ì€ ì•„ëž˜ì— ì„¤ëª…ë˜ì–´ 있다. +ì •ì‹ ì˜ ëˆˆ - ì´ ëˆˆì€ ì‹œì „ìžë¥¼ 현혹, ê°ì •ì¡°ì¢…, ê³µí¬ ë“±ì˜ ì •ì‹  공격으로부터 보호해 준다. ì´ ëˆˆì€ ë§ˆë²•ì‚¬ 1레벨 ì£¼ë¬¸ì¸ ì¸ê°„형 현혹으로 사용할 수 있다. +ê²€ì˜ ëˆˆ - ì´ ëˆˆì€ ì‹œì „ìžë¥¼ 노린 첫 번째 ë¬¼ë¦¬ì  ê³µê²©ì„ ë¹—ë‚˜ê°€ê²Œ í•´ 준다. ì´ ëˆˆì€ 1레벨 마법사 ì£¼ë¬¸ì¸ ë§ˆë²• 화살로 사용할 수 있다.(발사체 5ê°œ) +ë§ˆë²•ì‚¬ì˜ ëˆˆ - ì´ ëˆˆì€ ë¶ˆ, 전기, 냉기, í˜¹ì€ ì‚°ì„± 피해를 í•œ 번 í¡ìˆ˜í•´ 준다. ì´ ëˆˆì€ 3레벨 마법사 ì£¼ë¬¸ì¸ ë²ˆê°œ 화살로 사용할 수 있다.(4d8 피해) +ë…ì˜ ëˆˆ - ì´ ëˆˆì€ ì‹œì „ìžë¥¼ 노리고 가해진 ë… ê³µê²©ì´ë‚˜ ë… íš¨ê³¼ë¥¼ 한번 무효화해 준다. ì´ ëˆˆì€ ë˜í•œ ìƒëŒ€ 하나를 중ë…시킬 수 있으며, 30ì´ˆì˜ ì‹œê°„ ë™ì•ˆ ëª¨ë‘ 30ì ì˜ 피해를 ìž…íž ìˆ˜ 있다. +ì˜í˜¼ì˜ 눈 - ì´ ëˆˆì€ ì¦‰ì‚¬ ê³„ì—´ì˜ ë§ˆë²•(죽ìŒì˜ 주문, 죽ìŒì˜ ì†ê°€ë½, 파워 워드: 죽ìŒ, ì‚´í•´, 파괴 등)으로부터 시전ìžë¥¼ í•œ 번 보호해 준다. 마법사는 ì´ ëˆˆì˜ ëŠ¥ë ¥ì„ ë³€í™˜í•´ 약화 광선처럼 발사할 수 있다. ì´ ê´‘ì„ ì€ ìƒëŒ€ì˜ íž˜ì„ 5ë¡œ 떨어트려 준다. ìƒëŒ€ëŠ” ê·¸ì— ë”°ë¼ ëª…ì¤‘ì´ë‚˜ í”¼í•´ì— íŽ˜ë„티를 받게 ë  ê²ƒì´ë‹¤. +ê°•ì¸í•¨ì˜ 눈 - ì´ ëˆˆì€ ê¸°ì ˆ, 실청, 실명, í˜¹ì€ ì¹¨ë¬µì˜ íš¨ê³¼ë¥¼ í•œ 번 막아준다. ì´ëŠ” ë˜í•œ 마법사 4레벨 주문 외침으로 사용할 ìˆ˜ë„ ìžˆë‹¤. +ëŒì˜ 눈 - ì´ ëˆˆì€ ì‹œì „ìžë¥¼ ì„í™” 공격으로부터 í•œ 번 보호해 준다. ì´ëŠ” ë˜í•œ 마법사 3레벨 주문, ì¸ê°„형 ì†ë°•ìœ¼ë¡œ 사용할 ìˆ˜ë„ ìžˆë‹¤.~ +%atsymbol%176=~ì¼ê³± ê°œì˜ ëˆˆ~ +%atsymbol%175=~ë§ë¼ë³¸ì˜ 분노 +(ì´ë³´ì¼€ì´ì…˜) +레벨: 7 +시전 거리: 0 +ì§€ì† ì‹œê°„: 순간 +시전 시간: 1 +효과 범위: 15 피트 반경 +내성 굴림: 1/2 +ë§ë¼ë³¸ì˜ 분노 ì£¼ë¬¸ì€ ë‹¤í¬ì—˜í”„ ì†Œì„œëŸ¬ì¸ ë§ë¼ë³¸ì´ 만들었다. ì´ ì£¼ë¬¸ì€ ìˆœìˆ˜í•œ ì—ë„ˆì§€ì˜ í™”ì‚´ì„ ì‹œì „ìžì˜ ëª¸ì„ ì¤‘ì‹¬ìœ¼ë¡œ í•´ì„œ ì ê³¼ ë™ë£Œë¥¼ 구분하지 ì•Šê³  모든 방향으로 발사한다. ì´ ì기 ëª¨ì–‘ì˜ ì—너지 í™”ì‚´ì´ ì§€ë‚˜ê°€ëŠ” ê²½ë¡œì— ìžˆëŠ” 모든 ê²ƒì€ 20d4 ì ì˜ 찌르기 피해를 입는다(ì£¼ë¬¸ì— ëŒ€í•œ 내성굴림 성공시 절반). ì´ ì£¼ë¬¸ì€ ë§ˆë²•ì‚¬ê°€ ì ì—게 ë‘˜ëŸ¬ì‹¸ì˜€ì„ ë•Œ 특히 유용하다.~ +%atsymbol%174=~ë§ë¼ë³¸ì˜ 분노~ +%atsymbol%173=~보팔 명중~ +%atsymbol%172=~죽ìŒ~ +%atsymbol%171=~ì–¸ë°ë“œ 소멸ë¨~ +%atsymbol%170=~외부 ì°¨ì› ì†Œë©¸ë¨~ +%atsymbol%169=~ì…°ì´ë“œ +(ì¼ë£¨ì „/íŒíƒ€ì¦˜) +레벨: 6 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 1 ë¼ìš´ë“œ/레벨 +시전 시간: 6 +효과 범위: 특수 +내성 굴림: ì—†ìŒ +ì…°ì´ë“œëŠ” ê·¸ë¦¼ìž ëª¬ìŠ¤í„°ì™€ ë°˜ ê·¸ë¦¼ìž ëª¬ìŠ¤í„° 주문과 비슷하다. ì´ ì£¼ë¬¸ì€ ì‹œì „ìžê°€ 그림ìžì˜ ë°˜ ì°¨ì›ì˜ ë¬¼ì§ˆì„ í™˜ì˜ì˜ ìƒëª…ì²´ë¡œ 바꿀 수 있게 í•´ 준다. ì´ë ‡ê²Œ 만들어진 그림ìžëŠ” ê·¸ë¦¼ìž ëª¬ìŠ¤í„°ë‚˜ ë°˜ ê·¸ë¦¼ìž ëª¬ìŠ¤í„° 주문으로 소환한 그림ìžë³´ë‹¤ ë” ê°•í•˜ë©°, 주문 íš¨ë ¥ì´ ë나거나 ê·¸ë“¤ì´ ì£½ì„ ë•Œê¹Œì§€ 시전ìžì—게 복종할 것ì´ë‹¤.~ +%atsymbol%168=~ì…°ì´ë“œ~ +%atsymbol%167=~ë¦¬ì¹˜ì˜ ì ‘ì´‰~ +%atsymbol%166=~ë¦¬ì¹˜ì˜ ì ‘ì´‰~ +%atsymbol%165=~ë¦¬ì¹˜ì˜ ì ‘ì´‰ +(네í¬ë¡œë§¨ì‹œ) +레벨: 6 +시전 거리: ì ‘ì´‰ +ì§€ì† ì‹œê°„: 1 ë¼ìš´ë“œ/레벨 +시전 시간: 6 +효과 범위: ì‹œì „ìž +내성 굴림: 특수 +ì´ ì£¼ë¬¸ì€ ì‹œì „ìžì—게 ë¦¬ì¹˜ì˜ ì ‘ì´‰ê³µê²©ì˜ íž˜ê³¼ ë¦¬ì¹˜ì˜ ë©´ì—­ì„±ì„ ë¶€ì—¬í•œë‹¤. 마법사는 ì£¼ë¬¸ì˜ íš¨ê³¼ê°€ 지ì†ë˜ëŠ” ë™ì•ˆ 마비와 ê³µí¬ì— ë©´ì—­ì´ ë˜ê³ , ê·¸ì˜ ì†ì€ 섬뜩한 ì´ˆë¡ë¹›ìœ¼ë¡œ 빛나게 ëœë‹¤. ì´ ì†ìœ¼ë¡œ ê³µê²©ì— ì„±ê³µí•˜ë©´ 1d10 ì ì˜ 피해를 입히고, ë§ˆë¹„ì— ëŒ€í•´ 내성 êµ´ë¦¼ì„ í•˜ì—¬ 실패할 경우 마비ëœë‹¤. ì´ ì£¼ë¬¸ì€ ì–¸ë°ë“œì—게는 아무런 효과가 없다.~ +%atsymbol%164=~ë¦¬ì¹˜ì˜ ì ‘ì´‰~ +%atsymbol%163=~마법 í•´ì œ 효과~ +%atsymbol%162=~반마법 보호막 +(앱저레ì´ì…˜) +레벨: 6 +시전 거리: 0 +ì§€ì† ì‹œê°„: 1 í„´/레벨 +시전 시간: 1 +효과 범위: ì‹œì „ìž +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ ì‹œì „ìžì™€ 함께 움ì§ì´ëŠ” ë³´ì´ì§€ 않는 ìž¥ë§‰ì„ ì¹œë‹¤. ì´ ìž¥ë§‰ì€ ë§ˆë²•ì‚¬ë¥¼ ì–´ë– í•œ 마법 공격ì—ë„ ë©´ì—­ì´ ë˜ë„ë¡ ë§Œë“¤ì–´ì£¼ì§€ë§Œ, ë§ˆë²•ì‚¬ì˜ ì£¼ë¬¸ì´ ë°©ì–´ë§‰ 밖으로 나가는 ê²ƒë„ ì°¨ë‹¨í•œë‹¤. +반마법 ë³´í˜¸ë§‰ì€ ë˜í•œ 시전ìžì˜ 실청과 정신박약 ìƒíƒœë¥¼ 제거해준다.~ +%atsymbol%161=~반마법 보호막~ +%atsymbol%160=~ê°•ì¸í•œ ë„마뱀 ì¸ê°„~ +%atsymbol%159=~고블린 정예병~ +%atsymbol%158=~고블린 정예병~ +%atsymbol%157=~ë°˜ ê·¸ë¦¼ìž ëª¬ìŠ¤í„° +(ì¼ë£¨ì „/íŒíƒ€ì¦˜) +레벨: 5 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 1 ë¼ìš´ë“œ/레벨 +시전 시간: 5 +효과 범위: 특수 +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ 4ë ˆë²¨ì˜ ìœ„ì €ë“œ ì£¼ë¬¸ì¸ ê·¸ë¦¼ìž ëª¬ìŠ¤í„°ì™€ 유사하지만, ì†Œí™˜ëœ ìƒëª…ì²´ê°€ ë”ìš± 강력한 íž˜ì„ ì†Œìœ í•˜ê³  있다는 ì°¨ì´ì ì´ 있다.~ +%atsymbol%156=~ë°˜ ê·¸ë¦¼ìž ëª¬ìŠ¤í„°~ +%atsymbol%155=~트롤 무기~ +%atsymbol%154=~트롤~ +%atsymbol%153=~트롤~ +%atsymbol%152=~ê·¸ë¦¼ìž ëª¬ìŠ¤í„° +(ì¼ë£¨ì „/íŒíƒ€ì¦˜) +레벨: 4 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 1 ë¼ìš´ë“œ/레벨 +시전 시간: 4 +효과 범위: 특수 +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ ê·¸ë¦¼ìžì˜ 아공간 ì°¨ì›ì—ì„œ 환ì˜ì˜ 몬스터를 소환한다. í•œë²ˆì— ìµœëŒ€ ì—¬ì„¯ì˜ ê´´ë¬¼ì„ ì†Œí™˜í•˜ì§€ë§Œ ìƒëª…ì  êµ´ë¦¼ì˜ ì´í•©ì€ 시전ìžì˜ ë ˆë²¨ì„ ì´ˆê³¼í•  수 없다.~ +%atsymbol%151=~ê·¸ë¦¼ìž ëª¬ìŠ¤í„°~ +%atsymbol%150=~ê°€ì†ë¨~ +%atsymbol%149=~ê°ì†~ +%atsymbol%148=~ê°ì†ë¨~ +%atsymbol%147=~ì‹ ì†í•œ 후퇴 +(얼터레ì´ì…˜) +레벨: 1 +시전 거리: 0 +ì§€ì† ì‹œê°„: 3 ë¼ìš´ë“œ +시전 시간: 1 +효과 범위: ì‹œì „ìž +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ ì§§ì€ ì‹œê°„ë™ì•ˆ 시전ìžì˜ ì´ë™ì†ë„를 ë‘ë°°ë¡œ 늘려준다....대개 ê·¸ ì •ë„ë©´ ë„ë§ê°€ê¸°ì—” 충분할 것ì´ë‹¤. ì´ ì£¼ë¬¸ì´ íš¨ë ¥ì„ ë°œíœ˜í•˜ëŠ” ë™ì•ˆì—는, ê°€ì†, 슬로우등과 ê°™ì´ ì´ë™ ì†ë„를 변화시키는 다른 ì£¼ë¬¸ë“¤ì´ íš¨ë ¥ì„ ë°œíœ˜í•˜ì§€ 못한다.주문 íš¨ë ¥ì´ ìžˆì„ë•Œì—는 공격, 주문 시전 ë˜ëŠ” 물품 사용ì´ë‚˜ 특수 ëŠ¥ë ¥ì„ ì‚¬ìš©í•˜ì§€ 못한다...ì˜¤ì§ ë„ë§ë§Œ 가능하다.~ +%atsymbol%146=~ì‹ ì†í•œ 후퇴~ +%atsymbol%145=~모ë´ì¹´ì´ë„¨ì˜ ê²€~ +%atsymbol%144=~모ë´ì¹´ì´ë„¨ì˜ ê²€~ +%atsymbol%143=~모ë´ì¹´ì´ë„¨ì˜ ê²€ +(ì´ë³´ì¼€ì´ì…˜) +레벨: 7 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 1 ë¼ìš´ë“œ/레벨 +시전 시간: 7 +효과 범위: 특수 +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ ì‹œì „ìžê°€ ì •ì‹ ì ìœ¼ë¡œ 휘ë‘를 수 있는 íž˜ì„ ì§€ë‹Œ 빛나는 ê²€ì„ ì†Œí™˜í•œë‹¤. ì´ ê²€ì€ ì‹œì „ìžë ˆë²¨ì˜ ì ˆë°˜ì— í•´ë‹¹í•˜ëŠ” 파ì´í„°ê°€ 사용하는 것처럼 ì“°ì´ë©°, ì†ì— 들고 있ìŒì—ë„ ë¶ˆêµ¬í•˜ê³  시전ìžì˜ ì‹œì•¼ì— ë³´ì´ëŠ” ê·¸ ì–´ë–¤ ìƒë¬¼ì²´ë¼ë„ 공격할 수 있다. 물론 ê·¸ ê²€ì€ ê³µê²©ì— ì–´ë–¤ ë³´ë„ˆìŠ¤ë„ ë°›ì§€ 않으며, +2 ì´ìƒì˜ 무기로만 피해를 줄 수 있는 ìƒëª…체를 공격할 수 있고 명중할 때마다 5d6 ì ì˜ 피해를 준다.~ +%atsymbol%142=~모ë´ì¹´ì´ë„¨ì˜ ê²€~ +%atsymbol%141=~ë¬¼ì˜ ì •ë ¹~ +%atsymbol%140=~ë¬¼ì˜ ì •ë ¹~ +%atsymbol%139=~ë¬¼ì˜ ì •ë ¹ 소환 +(컨저레ì´ì…˜/서모ë‹) +레벨: 5 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 1 í„´/레벨 +시전 시간: 9 +효과 범위: 특수 +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ ì‹œì „ìžê°€ ë¬¼ì˜ ì •ë ¹ê³„ë¡œë¶€í„° 8 HDì˜ ì •ë ¹ì„ í•˜ë‚˜ 소환하여 ê·¸ì˜ ì˜ì§€ëŒ€ë¡œ 조종할 수 있게 한다. ì´ ì •ë ¹ì€ ì£¼ë¬¸ ì§€ì† ì‹œê°„ì´ ë나거나 ì •ë ¹ì´ ì£½ì„ ë•Œê¹Œì§€ 시전ìžë¥¼ 대신하여 싸울 것ì´ë‹¤.~ +%atsymbol%138=~ë¬¼ì˜ ì •ë ¹ 소환~ +%atsymbol%137=~ê³µê¸°ì˜ ì •ë ¹~ +%atsymbol%136=~ê³µê¸°ì˜ ì •ë ¹~ +%atsymbol%135=~ê³µê¸°ì˜ ì •ë ¹ 소환 +(컨저레ì´ì…˜/서모ë‹) +레벨: 5 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 1 í„´/레벨 +시전 시간: 9 +효과 범위: 특수 +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ ì‹œì „ìžê°€ ê³µê¸°ì˜ ì •ë ¹ê³„ë¡œë¶€í„° 8 HDì˜ ì •ë ¹ì„ í•˜ë‚˜ 소환하여 ê·¸ì˜ ì˜ì§€ëŒ€ë¡œ 조종할 수 있게 한다. ì´ ì •ë ¹ì€ ì£¼ë¬¸ ì§€ì† ì‹œê°„ì´ ë나거나 ì •ë ¹ì´ ì£½ì„ ë•Œê¹Œì§€ 시전ìžë¥¼ 대신하여 싸울 것ì´ë‹¤.~ +%atsymbol%134=~ê³µê¸°ì˜ ì •ë ¹ 소환~ +%atsymbol%133=~ë¶ˆì˜ ì •ë ¹~ +%atsymbol%132=~ë¶ˆì˜ ì •ë ¹~ +%atsymbol%131=~ë¶ˆì˜ ì •ë ¹ 소환 +(컨저레ì´ì…˜/서모ë‹) +레벨: 5 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 1 í„´/레벨 +시전 시간: 9 +효과 범위: 특수 +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ ì‹œì „ìžê°€ ë¶ˆì˜ ì •ë ¹ê³„ë¡œë¶€í„° 8 HDì˜ ì •ë ¹ì„ í•˜ë‚˜ 소환하여 ê·¸ì˜ ì˜ì§€ëŒ€ë¡œ 조종할 수 있게 한다. ì´ ì •ë ¹ì€ ì£¼ë¬¸ ì§€ì† ì‹œê°„ì´ ë나거나 ì •ë ¹ì´ ì£½ì„ ë•Œê¹Œì§€ 시전ìžë¥¼ 대신하여 싸울 것ì´ë‹¤.~ +%atsymbol%130=~ë¶ˆì˜ ì •ë ¹ 소환~ +%atsymbol%129=~ëŒ€ì§€ì˜ ì •ë ¹~ +%atsymbol%128=~ëŒ€ì§€ì˜ ì •ë ¹~ +%atsymbol%127=~ëŒ€ì§€ì˜ ì •ë ¹ 소환 +(컨저레ì´ì…˜/서모ë‹) +레벨: 5 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 1 í„´/레벨 +시전 시간: 9 +효과 범위: 특수 +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ ì‹œì „ìžê°€ ëŒ€ì§€ì˜ ì •ë ¹ê³„ë¡œë¶€í„° 8 HDì˜ ì •ë ¹ì„ í•˜ë‚˜ 소환하여 ê·¸ì˜ ì˜ì§€ëŒ€ë¡œ 조종할 수 있게 한다. ì´ ì •ë ¹ì€ ì£¼ë¬¸ ì§€ì† ì‹œê°„ì´ ë나거나 ì •ë ¹ì´ ì£½ì„ ë•Œê¹Œì§€ 시전ìžë¥¼ 대신하여 싸울 것ì´ë‹¤.~ +%atsymbol%126=~ëŒ€ì§€ì˜ ì •ë ¹ 소환~ +%atsymbol%125=~몬스터 소환 III +(컨저레ì´ì…˜/서모ë‹) +레벨: 5 +시전 거리: 20 피트 +ì§€ì† ì‹œê°„: 4 ë¼ìš´ë“œ + 1 ë¼ìš´ë“œ/레벨 +시전 시간: 5 +효과 범위: 특수 +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì„ ì‹œì „í•˜ì—¬ 위저드는 1d4 ë§ˆë¦¬ì˜ 3 레벨 ëª¬ìŠ¤í„°ë“¤ì„ ì†Œí™˜í•œë‹¤. ì´ë“¤ì€ 주문 거리 ë‚´ì—ì„œ 나타나며 주문 ì§€ì† ì‹œê°„ì´ ë나거나 ëª¬ìŠ¤í„°ë“¤ì´ ì‚´í•´ë‹¹í•  때까지 시전ìžì˜ ìƒëŒ€ë¥¼ 공격하ë„ë¡ ëª…ë ¹ë°›ì„ ìˆ˜ 있다.~ +%atsymbol%124=~몬스터 소환 III~ +%atsymbol%123=~ë„마뱀 ì¸ê°„~ +%atsymbol%122=~ë„마뱀 ì¸ê°„~ +%atsymbol%121=~몬스터 소환 II +(컨저레ì´ì…˜/서모ë‹) +레벨: 4 +시전 거리: 20 피트 +ì§€ì† ì‹œê°„: 3 ë¼ìš´ë“œ + 1 ë¼ìš´ë“œ/레벨 +시전 시간: 4 +효과 범위: 특수 +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì„ ì‹œì „í•˜ì—¬ 위저드는 1d6 ë§ˆë¦¬ì˜ 2 레벨 ëª¬ìŠ¤í„°ë“¤ì„ ì†Œí™˜í•œë‹¤. ì´ë“¤ì€ 주문 거리 ë‚´ì—ì„œ 나타나며 주문 ì§€ì† ì‹œê°„ì´ ë나거나 ëª¬ìŠ¤í„°ë“¤ì´ ì‚´í•´ë‹¹í•  때까지 시전ìžì˜ ìƒëŒ€ë¥¼ 공격하ë„ë¡ ëª…ë ¹ë°›ì„ ìˆ˜ 있다.~ +%atsymbol%120=~몬스터 소환 II~ +%atsymbol%119=~고블린~ +%atsymbol%118=~고블린~ +%atsymbol%117=~몬스터 소환 I +(컨저레ì´ì…˜/서모ë‹) +레벨: 3 +시전 거리: 20 피트 +ì§€ì† ì‹œê°„: 2 ë¼ìš´ë“œ + 1 ë¼ìš´ë“œ/레벨 +시전 시간: 3 +효과 범위: 특수 +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì„ ì‹œì „í•˜ì—¬ 위저드는 2d3 ë§ˆë¦¬ì˜ 1 레벨 ëª¬ìŠ¤í„°ë“¤ì„ ì†Œí™˜í•œë‹¤. ì´ë“¤ì€ 주문 거리 ë‚´ì—ì„œ 나타나며 주문 ì§€ì† ì‹œê°„ì´ ë나거나 ëª¬ìŠ¤í„°ë“¤ì´ ì‚´í•´ë‹¹í•  때까지 시전ìžì˜ ìƒëŒ€ë¥¼ 공격하ë„ë¡ ëª…ë ¹ë°›ì„ ìˆ˜ 있다.~ +%atsymbol%116=~몬스터 소환 I~ +%atsymbol%115=~공격~ +%atsymbol%114=~미노타우르스~ +%atsymbol%113=~미노타우르스~ +%atsymbol%112=~몬스터 소환 V +(컨저레ì´ì…˜/서모ë‹) +레벨: 7 +시전 거리: 20 피트 +ì§€ì† ì‹œê°„: 6 ë¼ìš´ë“œ + 1 ë¼ìš´ë“œ/레벨 +시전 시간: 7 +효과 범위: 특수 +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì„ ì‚¬ìš©í•˜ë©´ 마법사는 1d3ë§ˆë¦¬ì˜ 5레벨 ëª¬ìŠ¤í„°ë“¤ì„ ì†Œí™˜í•  수 있다. ì´ë“¤ì€ 소환ë˜ë©´ 주문 시전ìžì˜ ì ì„ 공격하며, ì£¼ë¬¸ì˜ ì§€ì† ì‹œê°„ì´ ë나거나 ìžì‹ ë“¤ì´ 죽으면 사ë¼ì§„다.~ +%atsymbol%111=~몬스터 소환 V~ +%atsymbol%110=~Frost salamander spear +1d8 piercing +1d6 화염 피해 +do not translate~ +%atsymbol%109=~Frost salamander spear +1d8 piercing ++1d6 cold +do not trans~ +%atsymbol%108=~ìƒëŸ¬ë§¨ë”~ +%atsymbol%107=~ìƒëŸ¬ë§¨ë”~ +%atsymbol%106=~서리 ìƒëŸ¬ë§¨ë”~ +%atsymbol%105=~서리 ìƒëŸ¬ë§¨ë”~ +%atsymbol%104=~몬스터 소환 VI +(컨저레ì´ì…˜/서모ë‹) +레벨: 8 +시전 거리: 20 피트 +ì§€ì† ì‹œê°„: 7 ë¼ìš´ë“œ + 1 ë¼ìš´ë“œ/레벨 +시전 시간: 8 +효과 범위: 특수 +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì„ ì‚¬ìš©í•˜ë©´ 마법사는 1d3ë§ˆë¦¬ì˜ 6 레벨 ëª¬ìŠ¤í„°ë“¤ì„ ì†Œí™˜í•  수 있다. ì´ë“¤ì€ 소환ë˜ë©´ 주문 시전ìžì˜ ì ì„ 공격하며, ì£¼ë¬¸ì˜ ì§€ì† ì‹œê°„ì´ ë나거나 죽는 ìˆœê°„ì— ì‚¬ë¼ì§„다.~ +%atsymbol%103=~몬스터 소환 VI~ +%atsymbol%102=~공격~ +%atsymbol%101=~움버 í—í¬~ +%atsymbol%100=~움버 í—í¬~ +%atsymbol%99=~본가드 스켈레톤~ +%atsymbol%98=~본가드 스켈레톤~ +%atsymbol%97=~몬스터 소환 VII +(컨저레ì´ì…˜/서모ë‹) +레벨: 9 +시전 거리: 20 피트 +ì§€ì† ì‹œê°„: 8 ë¼ìš´ë“œ + 1 ë¼ìš´ë“œ/레벨 +시전 시간: 9 +효과 범위: 특수 +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì„ ì‚¬ìš©í•˜ë©´ 마법사는 1d2ë§ˆë¦¬ì˜ 7 레벨ì´ë‚˜ 8 레벨 ëª¬ìŠ¤í„°ë“¤ì„ ì†Œí™˜í•  수 있다. ì´ë“¤ì€ 소환ë˜ë©´ 주문 시전ìžì˜ ì ì„ 공격하며, ì£¼ë¬¸ì˜ ì§€ì† ì‹œê°„ì´ ë나거나 죽는 순간 사ë¼ì§„다.~ +%atsymbol%96=~몬스터 소환 VII~ +%atsymbol%95=~몬스터 소환 IV +(컨저레ì´ì…˜/서모ë‹) +레벨: 6 +시전 거리: 20 피트 +ì§€ì† ì‹œê°„: 5 ë¼ìš´ë“œ + 1 ë¼ìš´ë“œ/레벨 +시전 시간: 6 +효과 범위: 특수 +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì„ ì‚¬ìš©í•˜ë©´ 위저드는 1d3ë§ˆë¦¬ì˜ 4 레벨 ëª¬ìŠ¤í„°ë“¤ì„ ì†Œí™˜í•  수 있다. ì´ë“¤ì€ 소환ë˜ë©´ 주문 시전ìžì˜ ì ì„ 공격하며, ì£¼ë¬¸ì˜ ì§€ì† ì‹œê°„ì´ ë나거나 ìžì‹ ë“¤ì´ 죽으면 사ë¼ì§„다.~ +%atsymbol%94=~몬스터 소환 IV~ +%atsymbol%93=~해골~ +%atsymbol%92=~Monster Transparency +Do not translate~ +%atsymbol%91=~몬스터 트랜스페런시 물품~ +%atsymbol%90=~ì„€ë„ìš°~ +%atsymbol%89=~ì„€ë„ìš°~ +%atsymbol%88=~ê·¸ë¦¼ìž ì†Œí™˜ +(컨저레ì´ì…˜/서모ë‹, 네í¬ë¡œë§¨ì‹œ) +레벨: 5 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 1 ë¼ìš´ë“œ + 1 ë¼ìš´ë“œ/레벨 +시전 시간: 5 +효과 범위: 특수 +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ ì„¸ ë§ˆë¦¬ì˜ 4-HD 그림ìžë¥¼ 소환한다. 그림ìžë“¤ì€ ì§€ì† ì‹œê°„ì´ ë나거나 ì£½ì„ ë•Œê¹Œì§€ ì ì„ 공격하거나 임무를 수행하면서 시전ìžì˜ ëª…ë ¹ì— ë³µì¢…í•  것ì´ë‹¤.~ +%atsymbol%87=~ê·¸ë¦¼ìž ì†Œí™˜~ +%atsymbol%86=~ê°•ì²  주먹~ +%atsymbol%85=~ê°•ì²  주먹~ +%atsymbol%84=~Stricken by a foul disease~ +%atsymbol%83=~ì§ˆë³‘ì— ê±¸ë¦¼~ +%atsymbol%82=~중ë…~ +%atsymbol%81=~ë…~ +%atsymbol%80=~ê°•ì² ì˜ ëª¸ +(얼터레ì´ì…˜) +레벨: 8 +시전 거리: 0 +ì§€ì† ì‹œê°„: 2 í„´ +시전 시간: 8 +효과 범위: ì‹œì „ìž +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ ì‹œì „ìžì˜ ëª¸ì„ ì‚´ì•„ìžˆëŠ” ê°•ì² ë¡œ 바꾸어주며, ê·¸ì—게 여러가지 강력한 내성과 ëŠ¥ë ¥ì„ ë¶€ì—¬í•´ 준다. ì´ ì£¼ë¬¸ì˜ íš¨ë ¥ì´ ë°œíœ˜ë˜ê³  ìžˆì„ ë™ì•ˆ, 시전ìžëŠ” ì „ê¸°ì— 100% ë‚´ì„±ì„ ê°€ì§€ê²Œ ë˜ë©°, 불ì—는 50%, 부수기 피해ì—는 25%ì˜ ë‚´ì„±ì„ ì§€ë‹ˆê²Œ ëœë‹¤. 호í¡ì´ë‚˜ ìƒë¦¬í˜„ìƒì— 작용하는 모든 ì£¼ë¬¸ì€ ë¬´ì‹œëœë‹¤. ë˜í•œ, 시전ìžì˜ íž˜ì€ 25ê°€ ë˜ë©°, 시전ìžëŠ” 매 ë¼ìš´ë“œë‹¹ 2번 ê·¸ì˜ ê°•ì²  ì£¼ë¨¹ì„ ì´ìš©í•´ 2d4ì ì˜ í”¼í•´ì— ì¶”ê°€ë¡œ 힘 피해를 입히는 ê³µê²©ì„ í•  수 있게 ëœë‹¤. +안ë지만, 시전ìžì˜ ì´ë™ì€ ëŠë¦¬ê³  어색해진다. ê·¸ì˜ ì´ë™ì†ë„는 25%ë¡œ 맞추어진다. ë˜í•œ, 시전ìžëŠ” ê°•ì² ì˜ ëª¸ì˜ íš¨ë ¥ì„ ë°›ê³  ìžˆì„ ë™ì•ˆì—는 ì£¼ë¬¸ì„ ì‚¬ìš©í•  수 없다.~ +%atsymbol%79=~ê°•ì² ì˜ ëª¸~ +%atsymbol%78=~무ì˜ì‹~ +%atsymbol%77=~ìƒê¸‰ 외침 +(ì¸ë³´ì¼€ì´ì…˜) +레벨: 8 +시전 거리: 0 +ì§€ì† ì‹œê°„: 순간 +시전 시간: 1 +효과 범위: 35 피트 15ë„ì˜ ì›ë¿” +내성 굴림: 1/2 +ìƒê¸‰ ì™¸ì¹¨ì„ ì‚¬ìš©í•˜ë©´, 시전ìžëŠ” 35 피트 범위 ë‚´ì— ì••ë„ì ì¸ íž˜ì„ ë°©ì¶œí•˜ê²Œ ëœë‹¤. ìƒê¸‰ ì™¸ì¹¨ì€ ì‹œì „ìžì—ê²Œë„ ê·¹ë‹¨ì ìœ¼ë¡œ 위험하며, ë¶€ë‹´ë„ ë§¤ìš° í° ì£¼ë¬¸ì´ë‹¤. ì´ ì†Œë¦¬ë¥¼ 사용하려면 시전ìžëŠ” 2d4ì ì˜ 피해를 입어야 하며, 시전ìžê°€ ì£¼ë¬¸ì— ëŒ€í•œ 내성 êµ´ë¦¼ì— ì‹¤íŒ¨í•  경우, 1í„´ê°„ ì˜ì‹ì„ 잃어버린 채 쓰러지게 ëœë‹¤. ìƒê¸‰ ì™¸ì¹¨ì˜ ë²”ìœ„ ë‚´ì— ìžˆëŠ”, 5 HD ë¯¸ë§Œì˜ ëª¨ë“  ìƒëª…체는 즉시 죽어버린다. 모든 다른 ìƒëª…체는 ì£¼ë¬¸ì— ëŒ€í•œ 내성 êµ´ë¦¼ì„ í•´ì•¼ 한다. 내성 êµ´ë¦¼ì— ì‹¤íŒ¨í•œ ìžëŠ” 2ë¼ìš´ë“œê°„ 마비ë˜ê³ , 4ë¼ìš´ë“œê°„ 귀가 멀게 ë˜ë©°, 4d12ì ì˜ 마법 피해를 입게 ëœë‹¤. 내성 êµ´ë¦¼ì— ì„±ê³µí•œ ìžëŠ” 1ë¼ìš´ë“œê°„ 마비ë˜ê³ , 2ë¼ìš´ë“œê°„ 귀가 멀게 ë˜ë©°, 2d12ì ì˜ 피해를 입게 ëœë‹¤.~ +%atsymbol%76=~ìƒê¸‰ 외침~ +%atsymbol%75=~현혹ë¨~ +%atsymbol%74=~극심한 í˜„í˜¹ì— ê±¸ë¦¼~ +%atsymbol%73=~지배당함~ +%atsymbol%72=~ì‚¬ê¸°ì²´í¬ ì‹¤íŒ¨ : 패닉~ +%atsymbol%71=~술취함~ +%atsymbol%70=~혼란~ +%atsymbol%69=~사고 ê²½ì§~ +%atsymbol%68=~ì†ë°•ë¨~ +%atsymbol%67=~마비ë¨~ +%atsymbol%66=~ì†ë°•ë¨~ +%atsymbol%65=~ë§ˆìŒ ë¹„ìš°ê¸° +(앱저레ì´ì…˜) +레벨: 8 +시전 거리: 0 +ì§€ì† ì‹œê°„: 24 시간 +시전 시간: 1 +효과 범위: ì‹œì „ìž +내성 굴림: ì—†ìŒ +ìžì œë ¥ê³¼ 사ìƒí™œì„ 지키기 위해서, ë§ˆìŒ ë¹„ìš°ê¸°ëŠ” - 현혹, 미로, 정신박약, 혼란, ê³µí¬, 숙취, ê´‘í­í™”, ì†ë°•, ì„í™” 등 - ê±°ì˜ ëª¨ë“  ì •ì‹ ì ì¸ 효과로부터 ìƒëª…ì²´ì˜ ë§ˆìŒì„ 보호해 준다.~ +%atsymbol%64=~ë§ˆìŒ ë¹„ìš°ê¸°~ +%atsymbol%63=~ì§ˆì‹ +(얼터레ì´ì…˜) +레벨: 7 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 4 ë¼ìš´ë“œ +시전 시간: 7 +효과 범위: 14 피트 반경 +내성 굴림: 특수 +ì´ ì£¼ë¬¸ì€ íš¨ê³¼ 범위 ë‚´ì˜ ëª¨ë“  ìƒëª…ì²´ê°€ ìˆ¨ì„ ì‰´ 수 ì—†ë„ë¡ í•œë‹¤. ìˆ¨ì„ ì‰¬ì§€ 않는 ìƒëª…체는 ì˜í–¥ì„ 받지 않는다. 질ì‹ë‹¹í•˜ê³  있는 ìƒëŒ€ëŠ” ë°©ì–´ë„ì— -4 페ë„í‹°, ëª…ì¤‘ì— -4 페ë„í‹°, ë¯¼ì²©ì— -6 페ë„티를 받게 ë˜ë©°, ë¼ìš´ë“œë‹¹ 공격 횟수 ì—­ì‹œ 하나 줄어들게 ë˜ê³ , ì´ë™ ì†ë„ë„ ë°˜ìœ¼ë¡œ 줄어들며, ë¼ìš´ë“œë‹¹ 4d8ì ì˜ 피해를 입는다. 내성 êµ´ë¦¼ì— ì„±ê³µí•  경우 모든 페ë„í‹° 효과는 무시ë˜ë©°, 피해 ì—­ì‹œ ë¼ìš´ë“œë‹¹ 2d8ì ìœ¼ë¡œ 줄어들게 ëœë‹¤. ì£¼ë¬¸ì˜ íš¨ê³¼ëŠ” ìƒëŒ€ê°€ 효과 범위 밖으로 벗어나면 곧 사ë¼ì§€ì§€ë§Œ, ìƒëŒ€ëŠ” ìˆ¨ì„ ê³ ë¥´ê¸° 위해 í•œ ë¼ìš´ë“œë¥¼ 소비해야 한다.~ +%atsymbol%62=~질ì‹~ +%atsymbol%61=~산성 í­í’ +(ì´ë³´ì¼€ì´ì…˜) +레벨: 7 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 1 ë¼ìš´ë“œ/레벨 +시전 시간: 7 +효과 범위: 24 피트 반경 +내성 굴림: 1/2 +ì´ ì£¼ë¬¸ì€ íš¨ê³¼ 범위 ë‚´ì— ì‚°ì„±ë¹„ë¥¼ 내리게 한다. ì´ê²ƒì€ ì²˜ìŒ 3ë¼ìš´ë“œ ë™ì•ˆ 매 ë¼ìš´ë“œë§ˆë‹¤ 1d4 ì ì˜ 피해를 주고, ë‹¤ìŒ 3ë¼ìš´ë“œ ë™ì•ˆì—는 1d6 ì ì˜ 피해를 주며, ê·¸ 후로는 매 ë¼ìš´ë“œë§ˆë‹¤ 1d8 ì ì˜ 피해를 준다. ì‚°ì´ í”¼ë¶€ì— ë¬»ì–´ìžˆê¸° ë•Œë¬¸ì— íš¨ê³¼ 범위를 벗어난다고 í•´ë„ í”¼í•´ë¥¼ 멈출 수는 없으며, 산성 í­í’ ì£¼ë¬¸ì´ ì‹œì „ë  ë•Œ 효과 범위 ì•ˆì— ìžˆì—ˆë˜ ëª¨ë“  ìƒëª…체는 ì£¼ë¬¸ì˜ íš¨ê³¼ê°€ ëë‚  때까지 ê³„ì† í”¼í•´ë¥¼ 입는다. êµ¬ë¦„ì— ë§žì€ ìƒëª…체는 ì´í›„ 매 ë¼ìš´ë“œë§ˆë‹¤ ì£¼ë¬¸ì— ëŒ€í•œ 내성 êµ´ë¦¼ì„ í•  수 있으며, 성공하면 ê·¸ ë¼ìš´ë“œ ë™ì•ˆë§Œ ì ˆë°˜ì˜ í”¼í•´ë¥¼ 입는다.~ +%atsymbol%60=~산성 í­í’~ +%atsymbol%59=~íŠ¸ë¡¤ì˜ ê°•ì¸í•¨ +(네í¬ë¡œë§¨ì‹œ) +레벨: 6 +시전 거리: 0 +ì§€ì† ì‹œê°„: 2 í„´ +시전 시간: 6 +효과 범위: ì‹œì „ìž +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ ì‹œì „ìžì—게 트롤과 ê°™ì€ íƒ„ë ¥ì„ ì£¼ë©°, 매 ë¼ìš´ë“œê°„ 5ì ì˜ 피해를 재ìƒì‹œí‚¬ 수 있게 í•´ 준다. ì´ëŠ” ê·¸ì˜ ìµœëŒ€ ìƒëª…ì  ì´ìƒìœ¼ë¡œ 회복시켜주지는 않는다.~ +%atsymbol%58=~íŠ¸ë¡¤ì˜ ê°•ì¸í•¨~ +%atsymbol%57=~스켈레톤~ +%atsymbol%56=~스켈레톤~ +%atsymbol%55=~ì˜í˜¼ì„ 먹는 ìž +(네í¬ë¡œë§¨ì‹œ) +레벨: 6 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 순간 +시전 시간: 5 +효과 범위: 14 피트 반경 +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ 14피트 반경 ì•ˆì— ìžˆëŠ” 모든 살아있는 존재ì—게 3d8ì˜ í”¼í•´ë¥¼ 입힌다. ì´ í”¼í•´ë¥¼ ìž…ê³  ì£½ì€ ì¡´ìž¬ëŠ” ê·¸ 즉시 사ë¼ì§€ë©°, ê·¸ë“¤ì˜ ì •ìˆ˜ëŠ” ì¦‰ê° ë³€í˜•ë˜ì–´ 시전ìžì˜ ëª…ë ¹ì„ ë”°ë¥´ëŠ” 3HDì˜ ìŠ¤ì¼ˆë ˆí†¤ì´ ëœë‹¤. ë˜í•œ, ì´ ì£¼ë¬¸ì˜ ì‹œì „ìžëŠ” ì´ë ‡ê²Œ ì£½ì€ ìƒëª…ì²´ 하나당 +1ì˜ ë³´ë„ˆìŠ¤ë¥¼ 힘, 민첩, ê±´ê°•ì— ë°›ê²Œ ëœë‹¤. ì´ íš¨ê³¼ëŠ” 1í„´ ë™ì•ˆ 지ì†ëœë‹¤. ì˜í˜¼ì„ 먹는 ìžëŠ” ì–¸ë°ë“œ, 주조물, í˜¹ì€ ì •ë ¹ ìƒëª…ì²´ì—게는 효과가 없다.~ +%atsymbol%54=~ì˜í˜¼ì„ 먹는 ìž~ +%atsymbol%53=~ë¼ˆì˜ ë‹¤íŠ¸ +3~ +%atsymbol%52=~ë¼ˆì˜ ë‹¤íŠ¸~ +%atsymbol%51=~ë¼ˆì˜ ë‹¤íŠ¸ +(네í¬ë¡œë§¨ì‹œ) +레벨: 6 +시전 거리: 0 +ì§€ì† ì‹œê°„: 5 ë¼ìš´ë“œ +시전 시간: 5 +효과 범위: ì‹œì „ìž +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ ì‹œì „ìžê°€ 사용할 수 있으며 ì£¼ë¬¸ì´ íš¨ë ¥ì„ ë°œíœ˜í•  ë™ì•ˆì—는 장비를 해제할 수 없는 9ê°œì˜ ë‹¤íŠ¸ë¥¼ 만들어 낸다. ì´ ë‹¤íŠ¸ë“¤ì€ +3 무기ì´ë©°, 1d4ì ì˜ 피해를 입힌다. 그리고 ì´ ë‹¤íŠ¸ì— ë§žì€ ì ì€ 죽ìŒì— 대한 내성 êµ´ë¦¼ì„ êµ´ë ¤ 실패할 ë•Œì—는 2d6ì ì˜ 피해를 ë” ë°›ê²Œ ë˜ë©°, 5ë¼ìš´ë“œê°„ ê·¸ì˜ íž˜ì€ 3ì ì´ 내려간다. 시전ìžì˜ 다트 숙련ë„는, ë‹¤íŠ¸ì˜ ëª…ì¤‘ë„나 í”¼í•´ì— ê´€ì—¬í•˜ì§€ 않는다.~ +%atsymbol%50=~ë¼ˆì˜ ë‹¤íŠ¸~ +%atsymbol%49=~오틸루í¬ì˜ ë™ê²° 구체 +(얼터레ì´ì…˜,ì´ë³´ì¼€ì´ì…˜) +레벨: 6 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 순간 +시전 시간: 6 +효과 범위: í•œ ìƒëª…ì²´ +내성 굴림: 무시 +ì´ ì£¼ë¬¸ì€ ì‹œì „ìžì˜ 레벨당 1d4+2ì ì˜ 냉기 피해를 주는 ëƒ‰ê¸°ì˜ ë³´ì£¼ë¥¼ í•œ ìƒëª…ì²´ì—게 발사한다. 만약 목표가 ì£¼ë¬¸ì— ëŒ€í•œ 내성 êµ´ë¦¼ì— ì„±ê³µí•˜ë©´, 그는 보주를 피한 것으로 간주ë˜ì–´ ì–´ë–¤ í”¼í•´ë„ ë°›ì§€ 않는다.~ +%atsymbol%48=~오틸루í¬ì˜ ë™ê²° 구체~ +%atsymbol%47=~í™”ì—¼ì˜ ìž¥ë§‰ +(ì¸ë³´ì¼€ì´ì…˜) +레벨: 5 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 1 ë¼ìš´ë“œ/2 레벨 (특수) +시전 시간: 5 +효과 범위: 12 피트 반경 +내성 굴림: 무시 +ì´ ì£¼ë¬¸ì€ ì£¼ë¬¸ì— ëŒ€í•œ 내성 êµ´ë¦¼ì— ì‹¤íŒ¨í•œ í•˜ë‚˜ì˜ ìƒëª…체를 불꽃 ì†ì—ì„œ 태워버린다. ê·¸ ìƒëª…체는 ë¶ˆì´ ë¶™ì–´ 매 ë¼ìš´ë“œë§ˆë‹¤ 2d6ì ì˜ 화염 피해를 입으며, 불타고 있는 ìƒëª…체로부터 ë¶ˆê½ƒì´ ë°©ì¶œí•˜ì—¬ 12피트 ë‚´ì— ìžˆëŠ” 모든 ìƒëª…체는 ë°©ì¶œëœ ë¶ˆê½ƒìœ¼ë¡œ ì¸í•´ 1d4ì ì˜ 화염 피해를 입는다. í¬ìƒìžì˜ ë¶ˆê½ƒì— ë§žì€ ìžë“¤ ë˜í•œ í™”ì—¼ì˜ ìž¥ë§‰ì„ í”¼í•˜ê¸° 위해 ì£¼ë¬¸ì— ëŒ€í•œ 내성 êµ´ë¦¼ì„ í•´ì•¼ 한다. 만약 시전ìžì™€ 대ìƒì´ ë”는 ê°™ì€ ì§€ì—­ì— ìžˆì§€ 않게 ë˜ë©´ í™”ì—¼ì˜ ìž¥ë§‰ì€ ì‚¬ê·¸ëŸ¬ì§„ë‹¤. ì´ ì£¼ë¬¸ì€ íŠ¸ë¡¤ 무리와 서리 ìƒëŸ¬ë§¨ë”를 분산시키는 ë° íŠ¹ížˆ 유용하다.~ +%atsymbol%46=~í™”ì—¼ì˜ ìž¥ë§‰~ +%atsymbol%45=~산성 구체 +(컨저레ì´ì…˜) +레벨: 4 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 특수 +시전 시간: 4 +효과 범위: 9 피트 반경 +내성 굴림: 특수 +ì´ ì£¼ë¬¸ì€ ë¹›ë‚˜ëŠ” ì—메랄드빛 산성 구체를 소환해, 시전ìžê°€ 가리키는 범위 ë‚´ì˜ ëª©í‘œì—게 날아가게 만든다. 구체가 ëª©í‘œì— ë„달하면 í­ë°œí•˜ë©° í¬ìƒìžë¥¼ 강력한 산으로 ë’¤ë®ëŠ”다. í¬ìƒìžëŠ” 시전ìžì˜ 레벨당 1d4ì ì˜ 산성 피해를 입게 ë˜ë©°, 최대 12d4ì ê¹Œì§€ 올ë¼ê°„다. ì²˜ìŒ í”¼í•´ë¥¼ ìž…ì€ ë‹¤ìŒ, í¬ìƒìžëŠ” ë” ì´ìƒì˜ 피해를 피할 수 있ì„ì§€ì— ëŒ€í•´ ì£¼ë¬¸ì— ëŒ€í•œ 내성 êµ´ë¦¼ì„ í•´ì•¼ 한다. 만약 실패하면, í¬ìƒìžëŠ” ë‹¤ìŒ ë¼ìš´ë“œì—ë„ ê³„ì† ì‚°ì„± 피해를 입게 ëœë‹¤. ë‹¤ìŒ ë¼ìš´ë“œì˜ 피해는 첫 ë¼ìš´ë“œì˜ 피해ì—ì„œ 매 ë¼ìš´ë“œë§ˆë‹¤ 주사위가 2개씩 작아진다. 예를 들어, 8레벨 마법사가 ì´ ì£¼ë¬¸ì„ ì‹œì „í•˜ì—¬ 첫 번째 ë¼ìš´ë“œì— 8d4ì ì˜ 피해를 입혔다면, ë‘ ë²ˆì§¸ ë¼ìš´ë“œì—는 6d4ì ì˜ 피해를 ìž…íž ê²ƒì´ë©°, 세 번째 ë¼ìš´ë“œì—는 4d4ì , 네 번째 ë¼ìš´ë“œì—는 2d4ì ì˜ 피해를 ìž…íž ê²ƒì´ë‹¤. 그리고 ì£¼ë¬¸ì€ ë‹¤ì„¯ 번째 ë¼ìš´ë“œì—ì„œ ë난다. 첫 ë¼ìš´ë“œ ì´í›„ í¬ìƒìžëŠ” 매 ë¼ìš´ë“œë§ˆë‹¤ ì£¼ë¬¸ì— ëŒ€í•œ 내성 êµ´ë¦¼ì„ í•´ì„œ ë” ì´ìƒì˜ 피해를 방지할 수 있다. +산성 구체는 ë˜í•œ 최초 목표로부터 9피트 반경까지 확산ëœë‹¤. 확산 범위 ì•ˆì— ìžˆëŠ” 모든 ìƒëª…체는 ì„í™”/ë³€ì´ì— 대한 내성 êµ´ë¦¼ì„ í•´ì„œ 실패할 경우 ì‹œì „ìž 5레벨당 1d4ì ì˜ 피해를 입게 ëœë‹¤. í™•ì‚°ëœ ê³µê²©ì€ ì§€ì†ì ì¸ 피해를 입히지 않는다.~ +%atsymbol%44=~산성 구체~ +%atsymbol%43=~실청~ +%atsymbol%42=~외침 +(ì¸ë³´ì¼€ì´ì…˜) +레벨: 4 +시전 거리: 0 +ì§€ì† ì‹œê°„: 순간 +시전 시간: 1 +효과 범위: 35 피트 15ë„ì˜ ì›ë¿” +내성 굴림: 특수 +ì™¸ì¹¨ì€ ë§ˆë²•ì‚¬ì—게 무시무시한 ëª©ì†Œë¦¬ì˜ íž˜ì„ ì£¼ëŠ” 주문ì´ë‹¤. ì´ë¥¼ 사용하면, 마법사는 35 피트 범위 ë‚´ì—, 귀가 멀어버릴 ì •ë„ì˜ ê³ í•¨ì„ ì§€ë¥¼ 수 있게 ëœë‹¤. ì´ ë²”ìœ„ ë‚´ì— ë“¤ì–´ê°„ 모든 존재는 9ë¼ìš´ë“œê°„ 귀가 멀게 ë˜ë©°, 4d6ì ì˜ 피해를 입는다. ì£¼ë¬¸ì— ëŒ€í•œ 내성 êµ´ë¦¼ì— ì„±ê³µí•˜ë©´ 귀는 멀지 않게 ë˜ë©°, 피해 ì—­ì‹œ 반으로 줄어들게 ëœë‹¤.~ +%atsymbol%41=~외침~ +%atsymbol%40=~모ë´ì¹´ì´ë„¨ì˜ 역장 발사체 +(ì¸ë³´ì¼€ì´ì…˜) +레벨: 4 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 순간 +시전 시간: 4 +효과 범위: 5 피트 반경 +내성 굴림: 특수 +ì´ ì£¼ë¬¸ì€ ë¹›ë‚˜ëŠ” ë§ˆë²•ì  ì—너지 구체를 만들어 ë‚´ì–´, 마치 마법 화살 주문처럼 ìƒëŒ€ì—게 날아가게 만들며, ì´ëŠ” 절대 빗나가지 않는다. 마법사는 7레벨ì—ì„œ í•˜ë‚˜ì˜ ë°œì‚¬ì²´ë¥¼ 만들 수 있으며, ê·¸ ì´í›„ 3ë ˆë²¨ì´ ì¦ê°€í•  때마다 í•˜ë‚˜ì”©ì˜ ë°œì‚¬ì²´ë¥¼ ë” ë§Œë“¤ 수 있다. 즉, 10레벨ì—ì„œ 2개를, 13레벨ì—ì„œ 3개를, 16레벨ì—ì„œ 4개를 만들 수 있으며, ì´ë ‡ê²Œ 7개까지 발사체를 만들 수 있다. 시전ìžê°€ 25ë ˆë²¨ì— ì´ë¥´ë©´, ìµœëŒ€ì¸ 7ê°œì˜ ë°œì‚¬ì²´ë¥¼ 만들 수 있다. ê°ê°ì˜ 발사체는 2d4ì ì˜ 피해를 입히며, 명중 ì´í›„ì—는 í­ë°œí•˜ì—¬ 시전ìžì˜ 레벨 당 1ì ì”©ì˜ 피해를 추가로 입힌다. 예를 들어, 12레벨 마법사가 ì´ ì£¼ë¬¸ì„ ì‚¬ìš©í•  경우, 2ê°œì˜ ë°œì‚¬ì²´ë¥¼ 불러낼 수 있다. ì´ ë°œì‚¬ì²´ëŠ” ê°ê° 2d4+12ì ì˜ 피해를 ìž…íž ê²ƒì´ë‹¤. ëª…ì¤‘ëœ ìƒëª…체는 ì£¼ë¬¸ì— ëŒ€í•œ 내성 êµ´ë¦¼ì„ í•´ì„œ, 성공할 경우 í­ë°œì— ì˜í•œ 피해를 무효화할 수 있지만, 발사체 ìžì²´ê°€ 주는 2d4ì ì˜ 피해는 내성 êµ´ë¦¼ì„ í—ˆìš©í•˜ì§€ 않는다. 1레벨 마법사 주문 방패는 ì´ ì—­ìž¥ 발사체를 피해 ì—†ì´ í¡ìˆ˜í•´ì¤€ë‹¤. ì´ëŠ” í­ë°œì— ì˜í•œ í”¼í•´ë„ ì—†ì•  준다.~ +%atsymbol%39=~모ë´ì¹´ì´ë„¨ì˜ 역장 발사체~ +%atsymbol%38=~ì ˆë§~ +%atsymbol%37=~스턴ë¨~ +%atsymbol%36=~ê°ì • 조종, ì ˆë§ +(ì¸ì±ˆíŠ¸ë¨¼íŠ¸/현혹) +레벨: 4 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 1í„´ +시전 시간: 4 +효과 범위: 15피트 반경 +내성 굴림: 무시 +ì´ ì£¼ë¬¸ì€ íš¨ê³¼ 범위 ì•ˆì— ì ˆë§ì˜ ê°ì •ì„ 불러ì¼ìœ¼í‚¨ë‹¤. ì£¼ë¬¸ì— ëŒ€í•œ 내성 êµ´ë¦¼ì— ì‹¤íŒ¨í•œ 모든 ì ì€ 1í„´ ë™ì•ˆ 가만히 서서 ì•„ë¬´ê²ƒë„ í•˜ì§€ ì•Šì„ ê²ƒì´ë‹¤. ì´ ì£¼ë¬¸ì€ ì‹œì „ë˜ì—ˆì„ ì‹œ 범위 ì•ˆì— ìžˆëŠ” ê°ì • 조종, í¬ë§ì˜ 효과를 ìƒì‡„한다.~ +%atsymbol%35=~ê°ì • 조종, ì ˆë§~ +%atsymbol%34=~ê³µí™©ì— ë¹ ì§~ +%atsymbol%33=~ê°ì • 조종, ê³µí¬ +(ì¸ì±ˆíŠ¸ë¨¼íŠ¸/현혹) +레벨: 4 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 5ë¼ìš´ë“œ +시전 시간: 4 +효과 범위: 15피트 반경 +내성 굴림: 무시 +ì´ ì£¼ë¬¸ì€ íš¨ê³¼ 범위 ì•ˆì— ê³µí¬ì˜ ê°ì •ì„ 불러ì¼ìœ¼í‚¨ë‹¤. ì£¼ë¬¸ì— ëŒ€í•œ 내성 êµ´ë¦¼ì— ì‹¤íŒ¨í•œ 모든 ì ì€ 5ë¼ìš´ë“œ ë™ì•ˆ ë„ë§ì¹œë‹¤. ì´ ì£¼ë¬¸ì€ ì‹œì „ë˜ì—ˆì„ ì‹œ 범위 ì•ˆì— ìžˆëŠ” ê°ì • 조종, ìš©ê¸°ì˜ íš¨ê³¼ë¥¼ ìƒì‡„한다.~ +%atsymbol%32=~ê°ì • 조종, ê³µí¬~ +%atsymbol%31=~ê°ì • 조종, í¬ë§ +(ì¸ì±ˆíŠ¸ë¨¼íŠ¸/현혹) +레벨: 4 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 1시간 +시전 시간: 4 +효과 범위: 15피트 반경 +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ íš¨ê³¼ 범위 ì•ˆì— í¬ë§ì˜ ê°ì •ì„ 불러ì¼ìœ¼í‚¨ë‹¤. ì£¼ë¬¸ì— ì˜í–¥ë°›ëŠ” 모든 ìƒëª…체는 사기가 오르고 내성 굴림, 명중, í”¼í•´ì— +2ì˜ ë³´ë„ˆìŠ¤ë¥¼ 받는다. ì´ ì£¼ë¬¸ì€ ì‹œì „ë˜ì—ˆì„ ì‹œ 범위 ì•ˆì— ìžˆëŠ” 모든 사기 저하 효과를 제거한다.~ +%atsymbol%30=~ê°ì • 조종, í¬ë§~ +%atsymbol%29=~ê°ì • 조종, 용기 +(ì¸ì±ˆíŠ¸ë¨¼íŠ¸/현혹) +레벨: 4 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 1시간 +시전 시간: 4 +효과 범위: 15피트 반경 +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ íš¨ê³¼ 범위 ì•ˆì— ìš©ê¸°ì˜ ê°ì •ì„ 불러ì¼ìœ¼í‚¨ë‹¤. ì£¼ë¬¸ì— ì˜í–¥ë°›ëŠ” 모든 ìƒëª…체는 ëª…ì¤‘ì— +1, í”¼í•´ì— +3ì˜ ë³´ë„ˆìŠ¤ë¥¼ 받고, +5ì ì˜ (최대 ìƒëª…ì ì„ 초과해 가질 수 있는) ìž„ì‹œ ìƒëª…ì ì„ 얻게 ëœë‹¤. ì´ ì£¼ë¬¸ì€ ì‹œì „ë˜ì—ˆì„ ì‹œ 범위 ì•ˆì— ìžˆëŠ” 모든 ê³µí¬ íš¨ê³¼ë¥¼ 제거한다.~ +%atsymbol%28=~ê°ì • 조종, 용기~ +%atsymbol%27=~ê´‘í­í™”~ +%atsymbol%26=~ë²¨í‹´ì˜ ë¶ˆíƒ€ëŠ” 피 +(네í¬ë¡œë§¨ì‹œ) +레벨: 4 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 1 ë¼ìš´ë“œ/2 레벨 +시전 시간: 4 +효과 범위: í•œ ìƒëª…ì²´ +내성 굴림: 무시 +ì´ ì£¼ë¬¸ì€ ëª©í‘œì˜ í”¼ë¥¼ 불로 바꾸어 매 ë¼ìš´ë“œë§ˆë‹¤ 3d4ì ì˜ 피해를 입히고, í¬ìƒìžëŠ” 고통 ë•Œë¬¸ì— ê´‘í­í™”ëœë‹¤. 목표는 매 ë¼ìš´ë“œë§ˆë‹¤ ì£¼ë¬¸ì— ëŒ€í•œ 내성 êµ´ë¦¼ì„ í•œë‹¤. 만약 성공하면 피해와 ê´‘í­í™” ìƒíƒœëŠ” 사ë¼ì§„다. ì´ ì£¼ë¬¸ì€ ì–¸ë°ë“œë‚˜ 피가 없는 다른 ì°¨ì›ì˜ ìƒëª…ì²´(예를 들어 ì •ë ¹ 등)ì—게는 ìž‘ë™í•˜ì§€ 않는다. 만약 ë¶ˆì— ì €í•­ë ¥ì´ ìžˆëŠ” ìƒëª…ì²´ë¼ë©´, ì´ ì£¼ë¬¸ì˜ í”¼í•´ëŠ” ê°ì†Œí•˜ê±°ë‚˜ ë¬´ì‹œë  ê²ƒì´ë‹¤.~ +%atsymbol%25=~ë²¨í‹´ì˜ ë¶ˆíƒ€ëŠ” 피~ +%atsymbol%24=~ë¶•ê´´ì˜ ì°½ +(ì¸ë³´ì¼€ì´ì…˜) +레벨: 3 +시전 거리: 100 피트 +ì§€ì† ì‹œê°„: 순간 +시전 시간: 3 +효과 범위: 특수 +내성 굴림: 1/2 +ì´ ì£¼ë¬¸ì€ ì—­ìž¥ìœ¼ë¡œ ëœ ì°½ì„ ë§Œë“¤ì–´ ë‚´ì–´, 시전ìžê°€ 지정한 방향으로 100피트까지 ë‚ ë ¤ 보낸다. ì´ ì°½ì˜ ê²½ë¡œì— ìžˆëŠ” 모든 ìƒëª…체는 5d4ì ì˜ 부수기 피해를 입게 ë˜ë©°, 시전ìžì˜ 레벨당 2ì ì˜ 피해를 ë” ìž…ê²Œ ëœë‹¤(최대 +30까지). í¬ìƒìžëŠ” ì£¼ë¬¸ì— ëŒ€í•œ 내성 êµ´ë¦¼ì— ì„±ê³µí•˜ë©´ ì ˆë°˜ì˜ í”¼í•´ë¥¼ 입는다.~ +%atsymbol%23=~ë¶•ê´´ì˜ ì°½~ +%atsymbol%22=~기절함~ +%atsymbol%21=~ì–¼ìŒ ì°½ +(ì´ë³´ì¼€ì´ì…˜) +레벨: 3 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 순간 +시전 시간: 3 +효과 범위: í•œ ìƒëª…ì²´ +내성 굴림: 특수 +ì´ ì£¼ë¬¸ì€ ì‹œì „ìžê°€ ì„ íƒí•œ 목표를 향해 ì–¼ìŒìœ¼ë¡œ 만들어진 ë§ˆë²•ì˜ ì°½ì„ ë°œì‚¬í•©ë‹ˆë‹¤. ì°½ì€ ìžë™ì ìœ¼ë¡œ 명중하여 5d6ì ì˜ 피해를 입힙니다. 목표는 ì£¼ë¬¸ì— ëŒ€í•œ 내성 êµ´ë¦¼ì— ì‹¤íŒ¨í•  경우 3 ë¼ìš´ë“œ ë™ì•ˆ 스턴ë©ë‹ˆë‹¤.~ +%atsymbol%20=~ì–¼ìŒ ì°½~ +%atsymbol%19=~민첩 수정~ +%atsymbol%18=~ê³ ì–‘ì´ì˜ 우아함 +(얼터레ì´ì…˜) +레벨: 2 +시전 거리: ì ‘ì´‰ +ì§€ì† ì‹œê°„: 1 시간/레벨 +시전 시간: 2 +효과 범위: í•œ ìƒëª…ì²´ +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ ë§ˆë²•ì ìœ¼ë¡œ 대ìƒì˜ ë¯¼ì²©ì„ ì¦ê°€ì‹œì¼œì¤€ë‹¤. ê·¸ ì–‘ì€ ëŒ€ìƒì˜ í´ëž˜ìŠ¤ì— ì˜í•´ ê²°ì •ëœë‹¤. ì‹œí”„ë“¤ì€ 1d8ì ì„ 얻게 ë˜ë©°, 파ì´í„°ë‚˜ ë©”ì´ì§€ëŠ” 1d6ì ì„, í´ë ˆë¦­ì€ 1d4ì ì„ 얻는다. ê³ ì–‘ì´ì˜ ìš°ì•„í•¨ì€ ëŒ€ìƒì˜ ë¯¼ì²©ì„ 20ì´ìƒìœ¼ë¡œ 올려주지는 못한다.~ +%atsymbol%17=~ê³ ì–‘ì´ì˜ 우아함~ +%atsymbol%16=~ë°ì¹´ìŠ¤í…Œì´ë¸Œ~ +%atsymbol%15=~ë°ì¹´ìŠ¤í…Œì´ë¸Œ~ +%atsymbol%14=~ë°ì¹´ìŠ¤í…Œì´ë¸Œ +(ì´ë³´ì¼€ì´ì…˜) +레벨: 2 +시전 거리: 0 +ì§€ì† ì‹œê°„: 3 ë¼ìš´ë“œ + 1 ë¼ìš´ë“œ/레벨 +시전 시간: 2 +효과 범위: ì‹œì „ìž +내성 굴림: ì—†ìŒ +ì´ ì£¼ë¬¸ì€ ì‹œì „ìžì˜ ì†ì— ì—­ìž¥ì˜ ìŠ¤íƒœí”„ê°€ 나타나게 한다. ì´ ìŠ¤íƒœí”„ëŠ” 마법 무기로 íŒì •í•˜ë©°, 명중시 1-6ì ì˜ 피해를 입히고, ì¼ë°˜ ë¬´ê¸°ì— ë©´ì—­ì¸ ìƒë¬¼ì¡°ì°¨ë„ 공격할 수 있다. 그러나 ì´ ë¬´ê¸°ëŠ” 스태프ì´ë¯€ë¡œ, 시전ìžê°€ 스태프 무기 ê¸°ëŠ¥ì´ ì—†ë‹¤ë©´ 페ë„티를 받고 공격해야 한다. ì´ ìŠ¤íƒœí”„ëŠ” ë˜í•œ ê³µê²©ì„ ëª…ì¤‘ì‹œí‚¬ 때마다 목표ì—게서 1-2ì ì˜ ìƒëª…ì ì„ í¡ìˆ˜í•˜ëŠ” ëŠ¥ë ¥ì´ ìžˆë‹¤. ì´ ìƒëª…ì ì€ 시전ìžì˜ ìƒëª…ì ì— ë”해지지만, ì´ë¯¸ ìž…ì€ í”¼í•´ë¥¼ 치료할 수 ìžˆì„ ë¿ ìƒëª…ì ì˜ 최대치를 ì •ìƒì ì¸ 수준 ì´ìƒìœ¼ë¡œ 올려주지는 못한다.~ +%atsymbol%13=~ë°ì¹´ìŠ¤í…Œì´ë¸Œ~ +%atsymbol%12=~~ +%atsymbol%11=~스ë‹ë¡ì˜ 눈뭉치 ë”미 +(ì´ë³´ì¼€ì´ì…˜) +레벨: 2 +시전 거리: 시전ìžì˜ 시야 ë‚´ +ì§€ì† ì‹œê°„: 순간 +시전 시간: 2 +효과 범위: 30 피트 반경 +내성 굴림: 1/2 +ì´ ì£¼ë¬¸ì€ ì‹œì•¼ ë‚´ì˜ í•œ 지ì ì— ëˆˆë­‰ì¹˜ì˜ ëŒí’ì„ ì¼ìœ¼í‚¨ë‹¤. ì´ ëˆˆë­‰ì¹˜ë“¤ì€ íš¨ê³¼ 범위 ë‚´ì˜ ëª¨ë“  ê²ƒì„ ë§žì¶”ë©°, 시전ìžì˜ 레벨 당 1d3ì ì˜ 냉기 피해를 입히고, 최대 8ë ˆë²¨ì— 8d3ì ì˜ 피해를 입힌다. ë¶ˆì„ ì‚¬ìš©í•˜ê±°ë‚˜ 불ì—ì„œ 사는 ìƒëª…ì²´ì—게는 레벨 당 1d6ì ì˜ 냉기 피해를 입히며, 최대 8ë ˆë²¨ì— 8d6ì ì˜ 피해를 입힌다.~ +%atsymbol%10=~~ +%atsymbol%9=~스ë‹ë¡ì˜ 눈뭉치 ë”미~ +%atsymbol%8=~마ìŒì˜ ëˆˆì´ íš¨ê³¼ë¥¼ 막고 사ë¼ì¡Œë‹¤.~ +%atsymbol%7=~ê²€ì˜ ëˆˆì´ íš¨ê³¼ë¥¼ 막고 사ë¼ì¡Œë‹¤.~ +%atsymbol%6=~ë§ˆë²•ì‚¬ì˜ ëˆˆì´ íš¨ê³¼ë¥¼ 막고 사ë¼ì¡Œë‹¤.~ +%atsymbol%5=~ë…ì˜ ëˆˆì´ íš¨ê³¼ë¥¼ 막고 사ë¼ì¡Œë‹¤.~ +%atsymbol%4=~ì˜í˜¼ì˜ ëˆˆì´ íš¨ê³¼ë¥¼ 막고 사ë¼ì¡Œë‹¤.~ +%atsymbol%3=~ê°•ì¸í•¨ì˜ ëˆˆì´ íš¨ê³¼ë¥¼ 막고 사ë¼ì¡Œë‹¤.~ +%atsymbol%2=~ëŒì˜ ëˆˆì´ íš¨ê³¼ë¥¼ 막고 사ë¼ì¡Œë‹¤.~ +%atsymbol%1=~ì´ ì£¼ë¬¸ì€ ì„ íƒí•œ ìºë¦­í„°ë¥¼ 회복시켜준다. 11ì ì˜ ìƒëª…ì ì´ 회복ëœë‹¤.~ diff --git a/iwdification/dw_iwdspells_resource/tra/pl_pl/iwdspells.tra b/iwdification/dw_iwdspells_resource/tra/pl_pl/iwdspells.tra new file mode 100644 index 0000000..30db460 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/tra/pl_pl/iwdspells.tra @@ -0,0 +1,1203 @@ +%atsymbol%359=~Odwaga~ +%atsymbol%358=~Nadzieja~ +%atsymbol%357=~Zwinność kota~ +%atsymbol%356=~SÅ‚uszny gniew wiernych~ +%atsymbol%355=~Modlitwa~ +%atsymbol%354=~Åaknienie krwi~ +%atsymbol%353=~Recytacja~ +%atsymbol%352=~Egzaltacja~ +%atsymbol%351=~ZwierzÄ™cy szaÅ‚~ +%atsymbol%350=~Å»elazne ciaÅ‚o~ +%atsymbol%349=~Petryfikacja~ +%atsymbol%348=~Nietykalna Å›wiÄ™tość umysÅ‚u~ +%atsymbol%347=~Ból~ +%atsymbol%346=~Przenikanie~ +%atsymbol%345=~Pomoc~ +%atsymbol%344=~ZasÅ‚oniÄ™cie umysÅ‚u~ +%atsymbol%343=~Przemiana w żywioÅ‚aka ziemi~ +%atsymbol%342=~Przemiana w żywioÅ‚aka ognia~ +%atsymbol%341=~Pieśń wojenna Sith: Premie do Klasy Pancerza i Regeneracja~ +%atsymbol%340=~„Pieśń wojenna Sith†+Wszyscy sojusznicy znajdujÄ…cy siÄ™ w promieniu 10 metrów otrzymujÄ… premiÄ™ +2 do Klasy Pancerza, +10% do odpornoÅ›ci na obrażenia sieczne, kÅ‚ute, obuchowe oraz pociski, a ponadto zyskujÄ… zdolność regeneracji 2 punktów życia na rundÄ™.~ +%atsymbol%339=~Pieśń wojenna Sith~ +%atsymbol%338=~Oczarowany~ +%atsymbol%337=~TÄ™sknota Syreny: Oczarowuje istoty~ +%atsymbol%336=~„TÄ™sknota Syreny†+Wszyscy wrogowie znajdujÄ…cy siÄ™ w promieniu 10 metrów muszÄ… wykonać rzut obronny przeciw czarom lub zostanÄ… oczarowani, dziÄ™ki czemu nie bÄ™dÄ… w stanie podjąć żadnej akcji, dopóki nie upÅ‚ynie jedna runda lub nie otrzymajÄ… obrażeÅ„.~ +%atsymbol%335=~TÄ™sknota Syreny~ +%atsymbol%334=~Pieśń Kaudich: Odporność na ataki oparte na dźwiÄ™ku~ +%atsymbol%333=~„Pieśń Kaudich†+Wszyscy sojusznicy znajdujÄ…cy siÄ™ w zasiÄ™gu 10 metrów otrzymujÄ… 50% szans na zniwelowanie efektów dziaÅ‚ania takich czarów jak: Cisza, Krzyk, Wielki krzyk, Rozkaz, Potężniejszy rozkaz lub innych ataków opartych na dźwiÄ™ku.~ +%atsymbol%332=~Pieśń Kaudich~ +%atsymbol%331=~Melodia Tymory: Premie do Szczęścia i UmiejÄ™tnoÅ›ci~ +%atsymbol%330=~„Melodia Tymory†+Wszyscy sojusznicy znajdujÄ…cy siÄ™ w zasiÄ™gu 10 metrów otrzymujÄ… premiÄ™ +1 do Szczęścia, +3 do rzutów obronnych, +10 do Wiedzy, a także +10% do wszystkich zdolnoÅ›ci zÅ‚odziejskich.~ +%atsymbol%329=~Melodia Tymory~ +%atsymbol%328=~Opowieść o Curranie Mocnym Sercu: Odporność na strach~ +%atsymbol%327=~„Opowieść o Curranie Mocnym Sercu†+Wszyscy sojusznicy znajdujÄ…cy siÄ™ w zasiÄ™gu 10 metrów zyskujÄ… na czas trwania pieÅ›ni niewrażliwość na strach, a ponadto każdy dziaÅ‚ajÄ…cy na nich w danej chwili efekt zwiÄ…zany ze strachem zostaje natychmiast zneutralizowany.~ +%atsymbol%326=~Opowieść o Curranie Mocnym Sercu~ +%atsymbol%325=~Ballada o Trzech Bohaterach: Premie do walki~ +%atsymbol%324=~„Ballada o Trzech Bohaterach†+Wszyscy sojusznicy znajdujÄ…cy siÄ™ w zasiÄ™gu 10 metrów otrzymujÄ… premiÄ™ +1 do testów trafienia, obrażeÅ„ oraz wszystkich rzutów obronnych.~ +%atsymbol%323=~Ballada o Trzech Bohaterach~ +%atsymbol%322=~Wypuszcza chmurÄ™ kwasu~ +%atsymbol%321=~Usychanie~ +%atsymbol%320=~UschniÄ™cie +(Nekromancja) +Poziom: 7 +Sfera: Leczenie +ZasiÄ™g: dotyk +Czas dziaÅ‚ania: 1 runda/2 poziomy +Czas rzucania: 7 +Obszar dziaÅ‚ania: 1 istota +Rzut obronny: neguje +To potężne zaklÄ™cie sprawia, że organy dotkniÄ™tej istoty przestajÄ… funkcjonować, usychajÄ…c na popiół. DotkniÄ™te stworzenie traci 3 punkty życia na sekundÄ™. Efekt ten utrzymuje siÄ™ przez jednÄ… rundÄ™ na dwa poziomy czarujÄ…cego lub dopóki nie zostanie rozproszony. PrzykÅ‚adowo, 14. poziomowy kapÅ‚an sprawi, że wybrana istota bÄ™dzie tracić 18 punktów życia na rundÄ™, przez siedem rund. Czar ten nie dziaÅ‚a na nieumarÅ‚ych, konstrukty oraz istoty pozaplanarne. UschniÄ™cie nie może być używane przez postacie o dobrym charakterze. ~ +%atsymbol%319=~UschniÄ™cie~ +%atsymbol%318=~Psalm +(Sprowadzanie/PrzywoÅ‚ywanie) +Poziom: 2 +Sfera: Walka +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: 1 tura +Czas rzucania: 9 +Obszar dziaÅ‚ania: w promieniu 20 metrów +Rzut obronny: brak +Po wypowiedzeniu słów Psalmu na kapÅ‚ana i jego sprzymierzeÅ„ców spada szczególna Å‚aska, powodujÄ…c jednoczeÅ›nie przykre konsekwencje poÅ›ród jego wrogów. ZaklÄ™cie to sprawia, że wszyscy sojusznicy kapÅ‚ana, znajdujÄ…cy siÄ™ w obszarze dziaÅ‚ania czaru, otrzymujÄ… premiÄ™ +1 do testów ataku, minimalnej wartoÅ›ci podczas testów obrażeÅ„ oraz do rzutów obronnych. Ponadto, kostka obrażeÅ„ dla wszystkich efektów, poza bazowymi obrażeniami broni, zostaje obniżona o 1. PrzykÅ‚adowo, ognista kula zadajÄ…ca normalnie 6k6 obrażeÅ„, zada w zamian 6k5 obrażeÅ„, zaÅ› pÅ‚onÄ…cy miecz dÅ‚ugi zadajÄ…cy 1k8 +2 obrażeÅ„ siecznych plus 1k3 obrażeÅ„ od ognia, zada zamiast tego 1k8 +2 obrażeÅ„ siecznych plus 1k2 obrażeÅ„ od ognia. Wrogowie kapÅ‚ana bÄ™dÄ… cierpieć skutki przeciwnego efektu. +Wielokrotne rzucenie Psalmu nie bÄ™dzie powodować kumulowanie siÄ™ efektów jego dziaÅ‚ania. Czar ten wymaga od kapÅ‚ana dość dużej koncentracji, tak wiÄ™c na czas jego trwania nie może on rzucać żadnych innych zaklęć, a prÄ™dkość jego poruszania siÄ™ spada o poÅ‚owÄ™.~ +%atsymbol%317=~Psalm~ +%atsymbol%316=~[.]~ +%atsymbol%315=~Nudnożuk~ +%atsymbol%314=~Nudnożuk~ +%atsymbol%313=~Å»uk kanonier~ +%atsymbol%312=~Å»uk kanonier~ +%atsymbol%311=~Gigantyczny owad +(Przemiany) +Poziom: 4 +Sfera: ZwierzÄ™ta +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: 8 godzin +Czas rzucania: 7 +Obszar dziaÅ‚ania: specjalny +Rzut obronny: brak +ZaklÄ™cie to przywoÅ‚uje 2-3 nudnożuków lub żuków kanonierów, które bÄ™dÄ… walczyć u boku czarujÄ…cego. Å»uki bÄ™dÄ… posÅ‚uszne przez caÅ‚y czas dziaÅ‚ania zaklÄ™cia lub dopóki nie zostanÄ… zabite.~ +%atsymbol%310=~Gigantyczny owad~ +%atsymbol%309=~Zadawanie krytycznych ran +(Nekromancja) +Poziom: 5 +Sfera: Leczenie +ZasiÄ™g: dotyk +Czas dziaÅ‚ania: natychmiastowy +Czas rzucania: 8 +Obszar dziaÅ‚ania: 1 istota +Rzut obronny: 1/2 +Po rzuceniu tego zaklÄ™cia i dotkniÄ™ciu ofiary, kapÅ‚an zadaje jej 27 obrażeÅ„ (poÅ‚owÄ™ po rzucie obronnym przeciw czarom). Czar nie dziaÅ‚a na nieumarÅ‚ych, konstrukty oraz istoty pozaplanarne. Ponadto, może zostać rzucony tylko przez postacie o zÅ‚ym charakterze.~ +%atsymbol%308=~Zadawanie krytycznych ran~ +%atsymbol%307=~Zadawanie poważnych ran +(Nekromancja) +Poziom: 4 +Sfera: Leczenie +ZasiÄ™g: dotyk +Czas dziaÅ‚ania: natychmiastowy +Czas rzucania: 5 +Obszar dziaÅ‚ania: 1 istota +Rzut obronny: 1/2 +Po rzuceniu tego zaklÄ™cia i dotkniÄ™ciu ofiary, kapÅ‚an zadaje jej 17 obrażeÅ„ (poÅ‚owÄ™ po rzucie obronnym przeciw czarom). Czar nie dziaÅ‚a na nieumarÅ‚ych, konstrukty oraz istoty pozaplanarne. Ponadto, nie może zostać rzucony przez postacie o dobrym charakterze.~ +%atsymbol%306=~Zadawanie poważnych ran~ +%atsymbol%305=~Wyssano dwa poziomy~ +%atsymbol%304=~Wyssanie energii +(Nekromancja) +Poziom: 7 +Sfera: Nekromancja +ZasiÄ™g: dotyk +Czas dziaÅ‚ania: staÅ‚y +Czas rzucania: 3 +Obszar dziaÅ‚ania: 1 istota +Rzut obronny: brak +Rzucenie tego czaru powoduje otwarcie pomostu pomiÄ™dzy rodzimÄ… sferÄ… rzucajÄ…cego czar a sferÄ… negatywnej energii. CzarujÄ…cy speÅ‚nia rolÄ™ przewodnika pomiÄ™dzy obiema sferami, wysysajÄ…c z ofiary życie i przenoszÄ…c je do sfery negatywnej energii, co w konsekwencji pozbawia jÄ… dwóch poziomów doÅ›wiadczenia. Cel zaklÄ™cia na staÅ‚e traci poziomy, koÅ›ci wytrzymaÅ‚oÅ›ci, punkty życia i umiejÄ™tnoÅ›ci. Poziomy te mogÄ… zostać przywrócone tylko za pomocÄ… kapÅ‚aÅ„skiego czaru zaklÄ™cia Przywrócenie. Czar ten nie dziaÅ‚a na nieumarÅ‚ych, konstrukty oraz istoty pozaplanarne.~ +%atsymbol%303=~Wyssanie energii~ +%atsymbol%302=~OplÄ…tanie~ +%atsymbol%301=~Pokraczny kopiec~ +%atsymbol%300=~Pokraczny kopiec~ +%atsymbol%299=~MyÅ›liwy +(Sprowadzanie) +Poziom: 7 +Sfera: RoÅ›liny +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: 8 godzin +Czas rzucania: 9 +Obszar dziaÅ‚ania: specjalny +Rzut obronny: brak +Czar ten tworzy dwa pokraczne kopce o 11KW. Istoty te chÄ™tnie pomagajÄ… czarujÄ…cemu w walce lub dowolnych innych zadaniach, które im zleci, pod warunkiem, że bÄ™dÄ… je w stanie wykonać.~ +%atsymbol%298=~MyÅ›liwy~ +%atsymbol%297=~MgÅ‚a Eldath +(Inwokacje) +Poziom: 7 +Sfera: Å»ywioÅ‚y +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: natychmiastowy +Czas rzucania: 9 +Obszar dziaÅ‚ania: w promieniu 2 metrów +Rzut obronny: brak +ZaklÄ™cie to pokrywa caÅ‚y obszar dziaÅ‚ania srebrzystoniebieskÄ… mgÅ‚Ä…. Każda istota, która znajdzie siÄ™ w obrÄ™bie mgÅ‚y, zostaje uleczona z chorób i zatrucia, a także odzyskuje 25 punktów życia.~ +%atsymbol%296=~MgÅ‚a Eldath~ +%atsymbol%295=~WiÄ™ksza tarcza Lathandera +(Sprowadzanie) +Poziom: 7 +Sfera: Strażnicza +ZasiÄ™g: dotyk +Czas dziaÅ‚ania: 3 rundy +Czas rzucania: 9 +Obszar dziaÅ‚ania: 1 istota +Rzut obronny: brak +Czar ten zapewnia wskazanej istocie 100% odpornoÅ›ci na magiÄ™ i caÅ‚kowitÄ… niewrażliwość na otrzymywane obrażenia. Oba te efekty utrzymujÄ… siÄ™ przez caÅ‚y czas jego dziaÅ‚ania. ZaklÄ™cie to nie ma wpÅ‚ywu na istoty o zÅ‚ym charakterze i może być rzucone jedynie przez istoty o charakterze dobrym.~ +%atsymbol%294=~WiÄ™ksza tarcza Lathandera~ +%atsymbol%293=~Zniszczenie +(Nekromancja) +Poziom: 7 +Sfera: Leczenie +ZasiÄ™g: dotyk +Czas dziaÅ‚ania: natychmiastowy +Czas rzucania: 9 +Obszar dziaÅ‚ania: rzucajÄ…cy czar +Rzut obronny: specjalny +ZaklÄ™cie to bÅ‚yskawicznie niszczy cel, rozbijajÄ…c go na drobne kawaÅ‚ki. Ofiara może ratować siÄ™ rzutem obronnym przeciw Å›mierci z modyfikatorem -4; w przypadku powodzenia nie ginie, lecz otrzymuje 8k6 magicznych obrażeÅ„. Czar ten może być używany tylko przez postacie o zÅ‚ym charakterze. Należy pamiÄ™tać, że postać zaatakowana tym zaklÄ™ciem, nie może zostać przywrócona do życia za pomocÄ… czaru Wskrzeszenie czy Zmartwychwstanie.~ +%atsymbol%292=~Zniszczenie~ +%atsymbol%291=~ZaklÄ™cie nie zadziaÅ‚aÅ‚o~ +%atsymbol%290=~Nietykalna Å›wiÄ™tość umysÅ‚u +(Odrzucanie) +Poziom: 7 +Sfera: Ochrona +ZasiÄ™g: 0 +Czas dziaÅ‚ania: 1 tura/poziom +Czas rzucania: 9 +Obszar dziaÅ‚ania: rzucajÄ…cy czar +Rzut obronny: brak +Czar ten otacza umysÅ‚ rzucajÄ…cego barierÄ… nie do pokonania, przez co chroni go przed wypÅ‚ywami zewnÄ™trznymi. W czasie dziaÅ‚ania zaklÄ™cia, na rzucajÄ…cego nie bÄ™dÄ… miaÅ‚y wpÅ‚ywu efekty zauroczenia, zamÄ™tu, strachu, ogÅ‚upienia, unieruchomienia, snu, labiryntu, szaÅ‚u oraz odurzenia.~ +%atsymbol%289=~Nietykalna Å›wiÄ™tość umysÅ‚u~ +%atsymbol%288=~Symbol beznadziejnoÅ›ci +(Sprowadzanie/PrzywoÅ‚ywanie) +Poziom: 7 +Sfera: Strażnicza +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: 2 tury +Czas rzucania: 3 +Obszar dziaÅ‚ania: w promieniu 5 metrów +Rzut obronny: neguje +Symbol beznadziejnoÅ›ci jest potężnym zaklÄ™ciem, które pozwala kapÅ‚anowi na umieszczeniu inskrypcji na ziemi lub innej powierzchni. Symbol pozostaje tam, dopóki jakiÅ› przeciwnik nie zbliży siÄ™ do niego zanadto, wywoÅ‚ujÄ…c tym samym wybuch, po którym wszyscy wrogowie znajdujÄ…cy siÄ™ w zasiÄ™gu dziaÅ‚ania zaklÄ™cia muszÄ… wykonać rzut obronny przeciw czarom z modyfikatorem -2, lub bÄ™dÄ… stali w miejscu, przytÅ‚oczeni chÄ™ciÄ… bezwarunkowej kapitulacji. Nie bÄ™dÄ… mogli wykonać żadnego ruchu, aby bronić siÄ™ przed nadchodzÄ…cymi atakami. W momencie rzucenia, zaklÄ™cie to niweluje dziaÅ‚anie czaru Emocje: odwaga.~ +%atsymbol%287=~Symbol beznadziejnoÅ›ci~ +%atsymbol%286=~Bóle zniszczenia~ +%atsymbol%285=~Symbol bólu +(Sprowadzanie/PrzywoÅ‚ywanie) +Poziom: 7 +Sfera: Strażnicza +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: 11 tur +Czas rzucania: 3 +Obszar dziaÅ‚ania: w promieniu 5 metrów +Rzut obronny: neguje +Wszyscy wrogowie znajdujÄ…cy siÄ™ w promieniu 5 metrów od symbolu bólu, w momencie jego utworzenia, muszÄ… wykonać rzut obronny przeciw czarom. Niepowodzenie oznacza, że ogarnia ich obezwÅ‚adniajÄ…cy ból, w zwiÄ…zku z czym otrzymujÄ… oni karÄ™ -4 do testów ataku, -2 do ZrÄ™cznoÅ›ci oraz -2 do Klasy Pancerza.~ +%atsymbol%284=~Symbol bólu~ +%atsymbol%283=~Gniew duchowy +(Inwokacje) +Poziom: 6 +Sfera: Walka +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: natychmiastowy +Czas rzucania: 2 +Obszar dziaÅ‚ania: specjalny +Rzut obronny: 1/2 +Po rzuceniu tego zaklÄ™cia kapÅ‚an staje siÄ™ przewodnikiem duchowej energii, która nastÄ™pnie wystrzeliwuje wprost z niego w czterech kierunkach, niczym bÅ‚yskawice. Wszystkie istoty znajdujÄ…ce siÄ™ na drodze bÅ‚yskawic otrzymujÄ… 4k10 magicznych obrażeÅ„ (poÅ‚owÄ™ po rzucie obronnym przeciw czarom). Istoty, których charakter znajduje siÄ™ na tej samej osi moralnej (dobry, neutralny, zÅ‚y) co czarujÄ…cego, sÄ… odporne na dziaÅ‚anie tego zaklÄ™cia.~ +%atsymbol%282=~Gniew duchowy~ +%atsymbol%281=~TrÄ…ba powietrzna +(Inwokacje) +Poziom: 6 +Sfera: Å»ywioÅ‚y (powietrze) +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: specjalny +Czas rzucania: 9 +Obszar dziaÅ‚ania: specjalny +Rzut obronny: specjalny +Czar ten tworzy w zasiÄ™gu wzroku rzucajÄ…cego niewielkÄ… trÄ…bÄ™ powietrznÄ…, która przemieszcza siÄ™ w losowym kierunku, raniÄ…c zarówno wrogów, jak i sojuszników. CzarujÄ…cy jest niewrażliwy na dziaÅ‚anie wÅ‚asnego zaklÄ™cia, podobnie jak żywioÅ‚aki i inne istoty dużych rozmiarów. Stworzenie zÅ‚apane przez trÄ…bÄ™ powietrznÄ… otrzymuje 2k8 obrażeÅ„ obuchowych i 2k8 obrażeÅ„ siecznych, a ponadto musi wykonać rzut obronny przeciw zioniÄ™ciom lub zostanie ogÅ‚uszone na dwie rundy. Istoty posiadajÄ…ce 2 lub mniej Kostek WytrzymaÅ‚oÅ›ci, ginÄ… automatycznie. TrÄ…ba powietrzna może wpÅ‚ynąć na maksymalnie osiem istot, po czym rozpÅ‚ywa siÄ™, bez dalszej szkody dla innych.~ +%atsymbol%280=~TrÄ…ba powietrzna~ +%atsymbol%279=~Tarcza entropii +(Odrzucanie) +Poziom: 6 +Sfera: Ochrona +ZasiÄ™g: 0 +Czas dziaÅ‚ania: 1 runda/poziom +Czas rzucania: 9 +Obszar dziaÅ‚ania: rzucajÄ…cy czar +Rzut obronny: brak +Po rzuceniu tego zaklÄ™cia, czarujÄ…cy zostaje otoczony ochronnym wirem energii, który blokuje lub odbija wiele ataków. Zapewnia to kapÅ‚anowi premiÄ™ +6 do Klasy Pancerza, +2 do rzutów obronnych oraz 50% odpornoÅ›ci na elektryczność, ogieÅ„, zimno i kwas. KapÅ‚an staje siÄ™ również niewrażliwy na dziaÅ‚anie czaru SÅ‚up ognia oraz wszystkich ataków pociskowych, w tym te, bÄ™dÄ…ce efektem dziaÅ‚ania zaklęć typu Magiczny pocisk. ~ +%atsymbol%278=~Tarcza entropii~ +%atsymbol%277=~Grupowe zadawanie lekkich ran +(Nekromancja) +Poziom: 5 +Sfera: Leczenie +ZasiÄ™g: 0 +Czas dziaÅ‚ania: natychmiastowy +Czas rzucania: 5 +Obszar dziaÅ‚ania: w promieniu 5 metrów +Rzut obronny: 1/2 +Po rzuceniu tego czaru kapÅ‚an zadaje pobliskim wrogom 1k8 +1/poziom obrażeÅ„ (poÅ‚owa po rzucie obronnym przeciw czarom). Czar ten nie dziaÅ‚a na nieumarÅ‚ych, konstrukty oraz istoty pozaplanarne. Nie może być używany przez postacie o dobrym charakterze.~ +%atsymbol%276=~Grupowe zadawanie lekkich ran~ +%atsymbol%275=~ZwierzÄ™cy szaÅ‚ +(Zaczarowania) +Poziom: 5 +Sfera: Walka +ZasiÄ™g: dotyk +Czas dziaÅ‚ania: 15 rund +Czas rzucania: 8 +Obszar dziaÅ‚ania: 1 istota +Rzut obronny: brak +Czar ten sprawia, że wskazanÄ… istotÄ™ przepeÅ‚nia zwierzÄ™cy szaÅ‚. Na czas dziaÅ‚ania zaklÄ™cia jej SiÅ‚a wynosi 19, a ponadto otrzymuje ona 20 punktów życia, premiÄ™ +2 do wszystkich rzutów obronnych, a jej prÄ™dkość poruszania siÄ™ wzrasta o 20%. W trakcie trwania zwierzÄ™cego szaÅ‚u traci ona zdolność do rzucania zaklęć, a ponadto, gdy tylko w zasiÄ™gu jej wzroku znajdÄ… siÄ™ jacyÅ› wrogowie, natychmiast ich atakuje, wykorzystujÄ…c do walki to, co akurat trzyma w rÄ™ku. Ponadto, w każdej rundzie dziaÅ‚ania zaklÄ™cia istnieje 5% szans, że wpadnie w niekontrolowany szaÅ‚, atakujÄ…c zarówno wrogów, jak i sojuszników.~ +%atsymbol%274=~ZwierzÄ™cy szaÅ‚~ +%atsymbol%273=~OsÅ‚ona przed nieumarÅ‚ymi +(Nekromancja) +Poziom: 5 +Sfera: OsÅ‚ony +ZasiÄ™g: 0 +Czas trwania: 1 tura +Czas rzucania: 7 +Obszar dziaÅ‚ania: w promieniu 3 metrów +Rzut obronny: brak +Czar ten wzmacnia wpÅ‚yw kapÅ‚ana na nieumarÅ‚ych, choć jest ograniczony do obszaru, na którym ten obecnie przebywa. Dodatkowo kapÅ‚an nie może siÄ™ w trakcie jego trwania poruszać. Każdy nieumarÅ‚y, który wejdzie na obszar dziaÅ‚ania zaklÄ™cia, bÄ™dzie poddany odpÄ™dzaniu, jak w przypadku zdolnoÅ›ci kapÅ‚ana, który je rzuciÅ‚. JeÅ›li odpÄ™dzanie zakoÅ„czy siÄ™ niepowodzeniem, nieumarÅ‚y staje siÄ™ niewrażliwy na kolejne próby poczynione za pomocÄ… tego czaru, chyba że opuÅ›ci obszar jego dziaÅ‚ania i wejdzie doÅ„ ponownie.~ +%atsymbol%272=~OsÅ‚ona przed nieumarÅ‚ymi~ +%atsymbol%271=~Tarcza Lathandera +(Sprowadzanie) +Poziom: 5 +Sfera: Strażnicza +ZasiÄ™g: dotyk +Czas dziaÅ‚ania: 2 rundy +Czas rzucania: 8 +Obszar dziaÅ‚ania: 1 istota +Rzut obronny: brak +Na czas dziaÅ‚ania zaklÄ™cia, istota, na którÄ… zostaÅ‚o ono rzucone, otrzymuje caÅ‚kowitÄ… niewrażliwość na otrzymywane obrażenia. Tarcza Lathandera nie dziaÅ‚a na istoty o zÅ‚ym charakterze i nie może być używana przez postacie, które takowy posiadajÄ….~ +%atsymbol%270=~Tarcza Lathandera~ +%atsymbol%269=~RaniÄ…ce kamienie +(Przemiany, Zaczarowania) +Poziom: 5 +Sfera: Å»ywioÅ‚y (ziemia) +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: 12 rund +Czas rzucania: 6 +Obszar dziaÅ‚ania: w promieniu 2,5 metra +Rzut obronny: specjalny +Czar ten zmienia znajdujÄ…ce siÄ™ w polu widzenia kamienie w kolczaste twory, które zlewajÄ… siÄ™ z tÅ‚em. Każda istota, która wejdzie w obszar dziaÅ‚ania czaru, otrzymuje 2k4 obrażeÅ„ kÅ‚utych na rundÄ™ i musi wykonać rzut obronnym przeciw czarom lub jej prÄ™dkość poruszania siÄ™ zostanie obniżona o 30%.~ +%atsymbol%268=~RaniÄ…ce kamienie~ +%atsymbol%267=~SÅ‚uszny gniew wiernych +(Zaczarowania/Zauroczenia) +Poziom: 5 +Sfera: Walka +ZasiÄ™g: 0 +Czas dziaÅ‚ania: 1 runda/poziom +Czas rzucania: 8 +Obszar dziaÅ‚ania: w promieniu 5,5 metra +Rzut obronny: brak +Czar ten obdarza sprzymierzeÅ„ców kapÅ‚ana swego rodzaju boskim szaleÅ„stwem, zwiÄ™kszajÄ…cym czasowo ich umiejÄ™tnoÅ›ci bojowe. Wszyscy sojusznicy kapÅ‚ana, bÄ™dÄ…cy w obszarze efektu, otrzymujÄ… na czas trwania czaru premiÄ™ +1 do testów ataku i rzutów obronnych oraz 8 dodatkowych punktów życia (które mogÄ… podnieść aktualnÄ… ich ilość poza maksymalnÄ… dla danej postaci pulÄ™). Sojusznicy posiadajÄ…cy taki sam charakter, co kapÅ‚an, otrzymujÄ… dodatkowy atak na rundÄ™ (eliminujÄ…cy wpÅ‚yw dziaÅ‚ania przyspieszenia), premiÄ™ +2 do testów ataku, obrażeÅ„ oraz rzutów obronnych, jak również zyskujÄ… niewrażliwość na zauroczenie i czary unieruchamiajÄ…ce. Każda postać bÄ™dÄ…ca pod wpÅ‚ywem SÅ‚usznego gniewu wiernych bÄ™dzie zmÄ™czona, gdy tylko zaklÄ™cie przestanie dziaÅ‚ać.~ +%atsymbol%266=~SÅ‚uszny gniew wiernych~ +%atsymbol%265=~Åšciana księżycowej poÅ›wiaty +(Inwokacje) +Poziom: 4 +Sfera: Ochrona, SÅ‚oÅ„ce +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: 1 tura +Czas rzucania: 7 +Obszar dziaÅ‚ania: Å›ciana o dÅ‚ugoÅ›ci 2,5 metra i szerokoÅ›ci 0,5 metra +Rzut obronny: brak +Czar ten powoÅ‚uje do istnienia migoczÄ…cy gobelin bÅ‚Ä™kitno-biaÅ‚ej energii. PowstaÅ‚a w ten sposób Å›ciana jest niematerialna i nie wymaga fizycznego puntu zaczepienia, przez co można przez niÄ… z Å‚atwoÅ›ciÄ… przejść. Istoty o zÅ‚ym charakterze, które przekroczÄ… Å›cianÄ™, otrzymujÄ… 2k10 magicznych obrażeÅ„, zaÅ› nieumarli 5k10 magicznych obrażeÅ„. Istota przechodzÄ…ca przez Å›cianÄ™ może otrzymać obrażenia tylko raz.~ +%atsymbol%264=~Åšciana księżycowej poÅ›wiaty~ +%atsymbol%263=~Wachlarz cierniowy +(Przemiany) +Poziom: 4 +Sfera: RoÅ›liny +ZasiÄ™g: 10 metrów +Czas dziaÅ‚ania: natychmiastowy +Czas rzucania: 3 +Obszar dziaÅ‚ania: 90° stożek o promieniu 5,5 metra +Rzut obronny: 1/2 +Czar ten tworzy wachlarz kolców, gwoździ i cierni, które wystrzeliwujÄ… z dÅ‚oni czarujÄ…cego. PokrywajÄ… one obszar stożka o promieniu 5,5 metra, zadajÄ…c 2k10 obrażeÅ„ kÅ‚utych wszystkim istotom, znajdujÄ…cym siÄ™ w obszarze dziaÅ‚ania zaklÄ™cia (rzut obronny przeciw Å›mierci zmniejsza obrażenia do 1k10).~ +%atsymbol%262=~Wachlarz cierniowy~ +%atsymbol%261=~Nieprzytomny(a)~ +%atsymbol%260=~Miażdżąca fala +(Inwokacje) +Poziom: 4 +Sfera: Å»ywioÅ‚y (woda) +ZasiÄ™g: 33 metry +Czas dziaÅ‚ania: natychmiastowy +Czas rzucania: 9 +Obszar dziaÅ‚ania: specjalny +Rzut obronny: specjalny +Czar ten przywoÅ‚uje szerokÄ… na 1,5 metra falÄ™, która porusza siÄ™ w kierunku wyznaczonym przez czarujÄ…cego, uderzajÄ…c z miażdżącÄ… siÅ‚Ä… wszystkich, którzy stanÄ… jej na drodze. Fala zadaje 4k10 obrażeÅ„ obuchowych, a ponadto trafione przez niÄ… istoty majÄ… 25% szans na to, że zostanÄ… ogÅ‚uszone lub 5% szans, że stracÄ… przytomność na dwie rundy. Rzut obronny przeciw zioniÄ™ciom zmniejsza obrażenia o poÅ‚owÄ™ i pozwala uniknąć efektów ogÅ‚uszenia lub utraty przytomnoÅ›ci.~ +%atsymbol%259=~Miażdżąca fala~ +%atsymbol%258=~Maczuga z gwiezdnego metalu~ +%atsymbol%257=~Maczuga z gwiezdnego metalu~ +%atsymbol%256=~Maczuga z gwiezdnego metalu +(Sprowadzanie) +Poziom: 4 +Sfera: Walka +ZasiÄ™g: 0 +Czas dziaÅ‚ania: 3 tury +Czas rzucania: 7 +Obszar dziaÅ‚ania: rzucajÄ…cy czar +Rzut obronny: brak +Czar ten tworzy magicznÄ… maczugÄ™, wykonanÄ… z żelaza pochodzÄ…cego z meteorytów. Zadaje ona 1k6 +2 obrażeÅ„ obuchowych, zapewnia premiÄ™ +2 do testów ataku i jest traktowana jako broÅ„ +4 na potrzeby okreÅ›lania istot, które może zranić. Modyfikatory za wysokÄ… SiÅ‚Ä™, biegÅ‚oÅ›ci i specjalizacje liczone sÄ… w normalny sposób. Maczuga zadaje dodatkowe 2k6 obrażeÅ„ obuchowych istotom nienaturalnym (nieumarÅ‚ym, żywioÅ‚akom, golemom, istotom pozaplanarnym itp.).~ +%atsymbol%255=~Maczuga z gwiezdnego metalu~ +%atsymbol%254=~Niewyczerpana wytrzymaÅ‚ość +(Nekromancja) +Poziom: 4 +Sfera: Nekromancja +ZasiÄ™g: dotyk +Czas dziaÅ‚ania: natychmiastowy +Czas rzucania: 9 +Obszar dziaÅ‚ania: 1 istota +Rzut obronny: brak +ZaklÄ™cie to przywraca wybranej istocie wytrzymaÅ‚ość, eliminujÄ…c tym samym ciążace na niej efekty zmÄ™czenia.~ +%atsymbol%253=~Niewyczerpana wytrzymaÅ‚ość~ +%atsymbol%252=~Chmura morowego powietrza +(Przemiany) +Poziom: 4 +Sfera: Walka, Å»ywioÅ‚y (powietrze) +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: 4 rundy +Czas rzucania: 7 +Obszar dziaÅ‚ania: w promieniu 4 metrów +Rzut obronny: neguje +Czar ten przeksztaÅ‚ca powietrze w promieniu 4 metrów w wywoÅ‚ujÄ…cÄ… mdÅ‚oÅ›ci szarÄ… mgÅ‚Ä™. RzucajÄ…cy, oraz istoty nieżywe, sÄ… niewrażliwe na efekty dziaÅ‚ania chmury. Istota narażona na wpÅ‚yw tego peÅ‚nego chorób powietrza musi co rundÄ™ wykonywać rzut obronny przeciw zioniÄ™ciom lub odniesie 3 magiczne obrażenia, straci 3 punkty SiÅ‚y i ZrÄ™cznoÅ›ci oraz zostanie oÅ›lepiona. Utrata cech i Å›lepota trwajÄ… przez jednÄ… turÄ™. ChmurÄ™ morowego powietrza mogÄ… rzucać jedynie postacie o zÅ‚ym charakterze.~ +%atsymbol%251=~Chmura morowego powietrza~ +%atsymbol%250=~OgÅ‚uszenie~ +%atsymbol%249=~Uzdrowienie~ +%atsymbol%248=~Åaknienie krwi +(Przemiany) +Poziom: 4 +Sfera: Walka +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: 2 tury +Czas rzucania: 7 +Obszar dziaÅ‚ania: 1 istota +Rzut obronny: brak +Czar ten dziaÅ‚a jedynie na postać gracza lub sprzymierzone z niÄ… istoty. Po jego rzuceniu wyznaczona istota wpada w szaÅ‚, atakujÄ…c nieustannie najbliższe stworzenie, dopóki nie padnie ono martwe, a nastÄ™pnie wybiera kolejny cel. BÄ™dÄ…c pod wpÅ‚ywem Åaknienia krwi, staje siÄ™ ona niewrażliwa na zauroczenie, sen, strach, unieruchomienie, ogÅ‚uszenie, zamÄ™t, emocje, zaklÄ™cia symboli i podobne efekty. Ponadto, otrzymuje premiÄ™ +2 do testów trafienia, +3 do testów obrażeÅ„, +2 do SiÅ‚y, +10 do maksymalnej wartoÅ›ci punktów życia, a także +2 do prÄ™dkoÅ›ci poruszania siÄ™. Czar ten ma jednakże kilka wad: na czas jego dziaÅ‚ania punkty życia bÄ™dÄ…cej pod jego wpÅ‚ywem istoty sÄ… zakryte, a sama istota nie może korzystać z dobrodziejstw żadnego efektu, który by je przywracaÅ‚. Po zakoÅ„czeniu dziaÅ‚ania czaru istota jest zmÄ™czona, a jej SiÅ‚a spada do 3 na okres dwóch tur. Czar Åaknienie krwi nie dziaÅ‚a na stworzenia o charakterze praworzÄ…dnym, jak również nie może być przez nie używany.~ +%atsymbol%247=~Åaknienie krwi~ +%atsymbol%246=~Recytacja +(Odrzucanie, Inwokacje/WywoÅ‚ywanie) +Poziom: 4 +Sfera: Walka +ZasiÄ™g: 0 +Czas dziaÅ‚ania: 1 runda/poziom +Czas rzucania: 7 +Obszar dziaÅ‚ania: w promieniu 8 metrów +Rzut obronny: brak +WypowiadajÄ…c Å›wiÄ™te sÅ‚owa, kapÅ‚an obdarza bÅ‚ogosÅ‚awieÅ„stwem siebie i swoich sprzymierzeÅ„ców, siejÄ…c jednoczeÅ›nie zamÄ™t poÅ›ród swych wrogów i osÅ‚abiajÄ…c ich. Towarzysze kapÅ‚ana zyskujÄ… premiÄ™ +2 do testów ataku i rzutów obronnych, zaÅ› wrogowie otrzymujÄ… karÄ™ -2 do testów ataku i rzutów obronnych. Czar ten nie unieważnia zaklÄ™cia Modlitwa, można wiÄ™c pozostawać pod wpÅ‚ywem obu, a efekty ich dziaÅ‚ania kumulujÄ… siÄ™.~ +%atsymbol%245=~Recytacja~ +%atsymbol%244=~WyÅ‚adowanie Å‚adunku statycznego~ +%atsymbol%243=~Åadunek statyczny +(Przemiany) +Poziom: 4 +Sfera: Pogoda +ZasiÄ™g: 0 +Czas dziaÅ‚ania: 1 tura/poziom +Czas rzucania: 9 +Obszar dziaÅ‚ania: pole widzenia rzucajÄ…cego czar +Rzut obronny: 1/2 +Åadunek statyczny jest podobny do czaru Wezwanie bÅ‚yskawic, z tym że może być on rzucany wewnÄ…trz budynków. Czar ten pozwala rzucajÄ…cemu na stworzenie Å‚adunku statycznego, wokół dowolnej istoty znajdujÄ…cej siÄ™ w obszarze jego dziaÅ‚ania, zadajÄ…c jej tym samym 2k8 obrażeÅ„ od elektrycznoÅ›ci oraz dodatkowo 1k8 obrażeÅ„ na poziom czarujÄ…cego. Åadunek zadaje obrażenia raz na turÄ™ przez caÅ‚y czas dziaÅ‚ania zaklÄ™cia.~ +%atsymbol%242=~Åadunek statyczny~ +%atsymbol%241=~Podpalenie +(Przemiany) +Poziom: 4 +Sfera: Å»ywioÅ‚y (ogieÅ„) +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: 1 runda +Czas rzucania: 7 +Obszar dziaÅ‚ania: w promieniu 1 metra +Rzut obronny: brak +Po rzuceniu tego czaru, w punkcie wyznaczonym przez rzucajÄ…cego pojawiajÄ… siÄ™ pÅ‚omienie, które zadajÄ… wszystkim istotom, znajdujÄ…cym siÄ™ w obszarze dziaÅ‚ania zaklÄ™cia, 1k4 obrażeÅ„ od ognia, plus 1 obrażenie na poziom czarujÄ…cego. Istoty te bÄ™dÄ… otrzymywać obrażenia co rundÄ™ bez wzglÄ™du na to, kiedy znalazÅ‚y siÄ™ wewnÄ…trz obszaru zaklÄ™cia.~ +%atsymbol%240=~Podpalenie~ +%atsymbol%239=~Åaska Ilmatera +(Nekromancja) +Poziom: 3 +Sfera: Nekromancja, Ochrona +ZasiÄ™g: 10 metrów +Czas dziaÅ‚ania: natychmiastowy +Czas rzucania: 6 +Obszar dziaÅ‚ania: 1 istota +Rzut obronny: brak +W efekcie rzucenia tego zaklÄ™cia, czarujÄ…cy zamienia siÄ™ wÅ‚asnÄ… energiÄ… życiowÄ… z ofiarÄ…, wymieniajÄ…c siÄ™ z niÄ… wszelkimi fizycznymi obrażeniami. ZaklÄ™cie dziaÅ‚a tylko wtedy, gdy czarujÄ…cy posiada w momencie zamiany wiÄ™cej punktów życia, niż cel. Zamiana ma charakter staÅ‚y, chyba że czarujÄ…cy użyje zwykÅ‚ych metod leczenia obrażeÅ„, i może ona zostać przeprowadzona z odlegÅ‚oÅ›ci nie przekraczajÄ…cej zasiÄ™gu dziaÅ‚ania czaru. Wymieniane sÄ… jedynie punkty życia, czarujÄ…cy nie może nabyć od ofiary innych stanów, takich jak choroba, zatrucie, odurzenie, czy podobnego rodzaju przypadÅ‚oÅ›ci. +Czar ten nie dziaÅ‚a na nieumarÅ‚ych, konstrukty oraz istoty pozaplanarne. Nie mogÄ… go używać postacie o zÅ‚ym charakterze.~ +%atsymbol%238=~Åaska Ilmatera~ +%atsymbol%237=~Zadawanie Å›rednich ran +(Nekromancja) +Poziom: 3 +Sfera: Leczenie +ZasiÄ™g: dotyk +Czas dziaÅ‚ania: natychmiastowy +Czas rzucania: 5 +Obszar dziaÅ‚ania: 1 istota +Rzut obronny: 1/2 +Po rzuceniu tego zaklÄ™cia i dotkniÄ™ciu ofiary, kapÅ‚an zadaje jej 14 obrażeÅ„ (poÅ‚owÄ™ po rzucie obronnym przeciw czarom). Czar nie dziaÅ‚a na nieumarÅ‚ych, konstrukty oraz istoty pozaplanarne. Ponadto, nie może zostać rzucony przez postacie o dobrym charakterze.~ +%atsymbol%236=~Zadawanie Å›rednich ran~ +%atsymbol%235=~OsÅ‚ona przed burzÄ… +(Odrzucanie) +Poziom: 3 +Sfera: Ochrona, Pogoda +ZasiÄ™g: 0 +Czas dziaÅ‚ania: 1 tura +Czas rzucania: 6 +Obszar dziaÅ‚ania: rzucajÄ…cy czar +Rzut obronny: brak +DziÄ™ki temu zaklÄ™ciu czarujÄ…cy zostaje otoczony kulÄ… energii, która porusza siÄ™ wraz z nim, zwiÄ™kszajÄ…c jego odporność na ogieÅ„, zimno i elektryczność do 50%.~ +%atsymbol%234=~OsÅ‚ona przed burzÄ…~ +%atsymbol%233=~Dotyk pleÅ›ni +(Przemiany) +Poziom: 3 +Sfera: RoÅ›liny +ZasiÄ™g: dotyk +Czas dziaÅ‚ania: specjalny +Czas rzucania: 6 +Obszar dziaÅ‚ania: w promieniu 3 metrów +Rzut obronny: specjalny +Czar ten zaraża pojedynczÄ… istotÄ™, której ciaÅ‚o pokrywa siÄ™ szybko rozprzestrzeniajÄ…cÄ… siÄ™ brÄ…zowÄ… pleÅ›niÄ…. Zakażona istota wykonuje rzut obronny przeciw czarom. Jeżeli zakoÅ„czy siÄ™ on niepowodzeniem, wówczas zakażenie staje siÄ™ bardzo poważne, a dotkniÄ™ta nim istota otrzymuje nastÄ™pujÄ…ce obrażenia: +1. runda: 4k6 obrażeÅ„ +2. runda: 3k6 obrażeÅ„ +3. runda: 2k6 obrażeÅ„ +4. runda: 1k6 obrażeÅ„ +Jeżeli rzut obronny siÄ™ powiedzie, wówczas obrażenia ulegajÄ… zmniejszeniu: +1. runda: 2k6 obrażeÅ„ +2. runda: 1k6 obrażeÅ„ +3. runda: 1k6 obrażeÅ„ +Po upÅ‚yniÄ™ciu pierwszej rundy, w każdej nastÄ™pnej istota znajdujÄ…ca siÄ™ w odlegÅ‚oÅ›ci 3 metrów od ofiary musi wykonać rzut obronny przeciwko czarom lub zostanie zarażona pleÅ›niÄ…. Sytuacja taka powtarza siÄ™ do chwili, aż pleśń nie zdąży zakazić nowego gospodarza, tracÄ…c tym samym swoje wÅ‚aÅ›ciwoÅ›ci. Istoty znajdujÄ…ce siÄ™ już pod wpÅ‚ywem pleÅ›ni nie mogÄ… siÄ™ niÄ… zarazić ponownie. Po upÅ‚yniÄ™ciu czasu dziaÅ‚ania zaklÄ™cia, brÄ…zowa pleśń szybko obumiera.~ +%atsymbol%232=~Dotyk pleÅ›ni~ +%atsymbol%231=~Oberwanie chmury +(Inwokacje) +Poziom: 3 +Sfera: Å»ywioÅ‚y (woda) +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: 2 rundy +Czas rzucania: 6 +Obszar dziaÅ‚ania: w promieniu 5,5 metra +Rzut obronny: brak +Czar ten sprowadza na wybrany obszar magiczny deszcz. Wszystkie stworzenia zwiÄ…zane z zimnem i ogniem otrzymujÄ… 2k3 magicznych obrażeÅ„ na rundÄ™. Ponadto, wszystkie istoty znajdujÄ…ce siÄ™ wewnÄ…trz obszaru dziaÅ‚ania zaklÄ™cia majÄ… 50% szans na to, że zostanÄ… trafione bÅ‚yskawicÄ…, zadajÄ…cÄ… 2k6 obrażeÅ„ od elektrycznoÅ›ci (poÅ‚owa obrażeÅ„ po rzucie obronnym przeciw czarom). ZaklÄ™cia PÅ‚omienne ostrze i CaÅ‚un pÅ‚omieni, a także aury salamander zostajÄ… ugaszone pod wpÅ‚ywem Oberwania chmury.~ +%atsymbol%230=~Oberwanie chmury~ +%atsymbol%229=~Kolce +(Przemiany) +Poziom: 3 +Sfera: Å»ywioÅ‚y (ziemia) +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: 1 tura +Czas rzucania: 6 +Obszar dziaÅ‚ania: w promieniu 5 metrów +Rzut obronny: brak +ZaklÄ™cie to pokrywa teren wokół kolczastymi roÅ›linami. Każda istota, wkraczajÄ…ca na ten obszar, otrzymuje 1k4 obrażeÅ„ kÅ‚utych i 1k4 obrażeÅ„ siecznych w każdej rundzie dziaÅ‚ania czaru.~ +%atsymbol%228=~Kolce~ +%atsymbol%227=~KrÄ…g koÅ›ci +(Nekromancja) +Poziom: 3 +Sfera: Strażnicza, Tworzenie +ZasiÄ™g: 0 +Czas dziaÅ‚ania: 3 rundy +Czas rzucania: 3 +Obszar dziaÅ‚ania: w promieniu 1 metra +Rzut obronny: brak +Czar ten tworzy barierÄ™ z koÅ›ci, które wirujÄ… wokół czarujÄ…cego, sprawiajÄ…c, że na czas trwania zaklÄ™cia nie może siÄ™ on poruszać. Każdy, kto stanie na drodze wirujÄ…cym koÅ›ciom, bÄ™dzie otrzymywaÅ‚ co rundÄ™ 1k6 obrażeÅ„ obuchowych i 1k6 obrażeÅ„ siecznych. Czar ten nie może być używany przez postacie o zÅ‚ym charakterze.~ +%atsymbol%226=~KrÄ…g koÅ›ci~ +%atsymbol%225=~Księżycowe ostrze~ +%atsymbol%224=~Księżycowe ostrze~ +%atsymbol%223=~Księżycowe ostrze +(Inwokacje) +Poziom: 3 +Sfera: Walka, SÅ‚oÅ„ce +ZasiÄ™g: 0 +Czas dziaÅ‚ania: 2 tury +Czas rzucania: 6 +Obszar dziaÅ‚ania: rzucajÄ…cy czar +Rzut obronny: brak +Czar ten powoÅ‚uje do istnienia bezszelestny i pozbawiony wagi konstrukt w ksztaÅ‚cie miecza, stworzony ze Å›wiatÅ‚a księżyca, który wyrasta z dÅ‚oni czarujÄ…cego na ponad metr. Księżycowe ostrze jest traktowane jak broÅ„ +4 na potrzeby okreÅ›lania istot, które może zranić, choć premia ta nie jest dodawana do testów ataku wykonywanych tÄ… broniÄ…. Ponadto, ze wzglÄ™du na swÄ… niematerialnÄ… naturÄ™, nie uwzglÄ™dniane sÄ… podczas walki w zwarciu premie ze wzglÄ™du na wysokÄ… SiÅ‚Ä™. +Trafienie księżycowym ostrzem wysysa z ofiary życie, zadajÄ…c jej 1k12 +4 magicznych obrażeÅ„, plus dodatkowe 1k12 obrażeÅ„ w przypadku nieumarÅ‚ych, którzy sÄ… na dziaÅ‚anie tej broni szczególnie podatni. Celne trafienie dziaÅ‚a również zakłócajÄ…co na magiÄ™, sprawiajÄ…c, że każda próba rzucenia zaklÄ™cia przez ofiarÄ™ w przeciÄ…gu kolejnej rundy, zakoÅ„czy siÄ™ niepowodzeniem.~ +%atsymbol%222=~Księżycowe ostrze~ +%atsymbol%221=~UÅ›pienie~ +%atsymbol%220=~Egzaltacja +(Odrzucanie) +Poziom: 3 +Sfera: Leczenie +ZasiÄ™g: dotyk +Czas dziaÅ‚ania: 1 tura +Czas rzucania: 9 +Obszar dziaÅ‚ania: 1 istota +Rzut obronny: brak +Czar ten pozwala kapÅ‚anowi wspomóc i ochronić jakÄ…kolwiek istotÄ™ innÄ… niż on sam. Poprzez dotyk, rzucajÄ…cy usuwa efekty strachu, uÅ›pienia, ogÅ‚upienia, nieprzytomnoÅ›ci oraz zatrucia, jak również szaÅ‚u, czy innych efektów wpÅ‚ywajÄ…cych na umysÅ‚. Dodatkowo cel jest chroniony przed czarami i atakami powodujÄ…cymi te efekty przez caÅ‚y czas dziaÅ‚ania zaklÄ™cia.~ +%atsymbol%219=~Egzaltacja~ +%atsymbol%218=~WywoÅ‚anie choroby +(Nekromancja) +Poziom: 3 +Sfera: Leczenie +ZasiÄ™g: dotyk +Czas dziaÅ‚ania: 8 godzin +Czas rzucania: 9 +Obszar dziaÅ‚ania: 1 istota +Rzut obronny: neguje +ZaklÄ™cie to wywoÅ‚uje u dotkniÄ™tej przez kapÅ‚ana istoty chorobÄ™, która osÅ‚abia jÄ…, obniżajÄ…c jej SiÅ‚Ä™ o 5k4 punktów. Rzut obronny przeciw czarom neguje ten efekt. ZaklÄ™cie to nie dziaÅ‚a na nieumarÅ‚ych, konstrukty oraz istoty pozaplanarne. Nie może być używane przez istoty o dobrym charakterze.~ +%atsymbol%217=~WywoÅ‚anie choroby~ +%atsymbol%216=~Kary do walki~ +%atsymbol%215=~Premie do walki~ +%atsymbol%214=~Modlitwa +(Sprowadzanie/PrzywoÅ‚ywanie) +Poziom: 3 +Sfera: Walka +ZasiÄ™g: 0 +Czas dziaÅ‚ania: 1 runda/poziom +Czas rzucania: 6 +Obszar dziaÅ‚ania: w promieniu 10 metrów +Rzut obronny: brak +Modlitwa obdarza kapÅ‚ana i jego sojuszników Å‚askÄ…, Å›ciÄ…gajÄ…c jednoczeÅ›nie klÄ…twÄ™ na jego wrogów. Przyjazne kapÅ‚anowi postacie otrzymujÄ… premiÄ™ +1 do testów ataku, obrażeÅ„ i rzutów obronnych, podczas gdy wrogowie otrzymujÄ… karÄ™ -1 do testów ataku, obrażeÅ„ i rzutów obronnych. Każda istota znajdujÄ…ca siÄ™ w obszarze dziaÅ‚ania czaru, w momencie jego rzucenia, która opuÅ›ci później ten obszar, nadal bÄ™dzie znajdować siÄ™ pod jego wpÅ‚ywem. Tak wiÄ™c, jeÅ›li wojownicy zechcÄ… Å›cigać tego umykajÄ…cego goblina, Modlitwa nadal bÄ™dzie na nich dziaÅ‚ać.~ +%atsymbol%213=~Modlitwa~ +%atsymbol%212=~Zadawanie umiarkowanych ran +(Nekromancja) +Poziom: 2 +Sfera: Leczenie +ZasiÄ™g: dotyk +Czas dziaÅ‚ania: natychmiastowy +Czas rzucania: 5 +Obszar dziaÅ‚ania: 1 istota +Rzut obronny: 1/2 +Po rzuceniu tego zaklÄ™cia i dotkniÄ™ciu ofiary, kapÅ‚an zadaje jej 11 obrażeÅ„ (poÅ‚owÄ™ po rzucie obronnym przeciw czarom). Czar nie dziaÅ‚a na nieumarÅ‚ych, konstrukty oraz istoty pozaplanarne. Ponadto, nie może zostać rzucony przez postacie o dobrym charakterze.~ +%atsymbol%211=~Zadawanie umiarkowanych ran~ +%atsymbol%210=~Szpony bestii~ +%atsymbol%209=~Szpony bestii~ +%atsymbol%208=~Szpony bestii +(Przemiany) +Poziom: 2 +Sfera: Walka +ZasiÄ™g: 0 +Czas dziaÅ‚ania: 1 tura +Czas rzucania: 5 +Obszar dziaÅ‚ania: rzucajÄ…cy czar +Rzut obronny: brak +Czar ten zmienia ramiona rzucajÄ…cego w szpony potężnej bestii, obdarzajÄ…c go SiÅ‚Ä… o wartoÅ›ci 18/72 i pozwalajÄ…c zadawać ofiarom 2k4 obrażeÅ„ siecznych (plus premia za SiÅ‚Ä™). CzarujÄ…cy może atakować szponami dwa razy na rundÄ™,otrzymujÄ…c przy tym premiÄ™ +2 do testów trafienia.~ +%atsymbol%207=~Szpony bestii~ +%atsymbol%206=~Otoczony srebrzystÄ… poÅ›wiatÄ… (kara -2 do KP)~ +%atsymbol%205=~Lanca jednorożca +(Inwokacje) +Poziom: 2 +Sfera: Walka +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: natychmiastowy +Czas rzucania: 5 +Obszar dziaÅ‚ania: 1 istota +Rzut obronny: specjalny +Czar ten tworzy częściowo eterycznÄ… lancÄ™ o srebrnym odcieniu i ksztaÅ‚cie rogu jednorożca. Gdy czarujÄ…cy namierzy ofiarÄ™, lanca natychmiast wystrzeli, zadajÄ…c 3k6 obrażeÅ„ kÅ‚utych (poÅ‚owÄ™ po rzucie obronnym przeciw czarom). Mimo iż po uderzeniu lanca ulega rozproszeniu, pozostawia wokół ofiary srebrzystÄ… poÅ›wiatÄ™, czyniÄ…c jÄ… tym samym Å‚atwym celem. Ofiara otrzymuje w zwiÄ…zku z tym karÄ™ -2 do Klasy Pancerza na trzy rundy.~ +%atsymbol%204=~Lanca jednorożca~ +%atsymbol%203=~Uzdrowienie~ +%atsymbol%202=~Leczenie umiarkowanych ran +(Nekromancja) +Poziom: 2 +Sfera: Leczenie +ZasiÄ™g: dotyk +Czas dziaÅ‚ania: natychmiastowy +Czas rzucania: 5 +Obszar dziaÅ‚ania: 1 istota +Rzut obronny: brak +Ten czar to potężniejsza wersja 1. poziomowego zaklÄ™cia kapÅ‚aÅ„skiego o nazwie Leczenie lekkich ran. RzucajÄ…cy go kapÅ‚an przywraca istocie, na której poÅ‚oży rÄ™ce, 11 punktów życia, a także eliminuje u niej efekty odurzenia. ZaklÄ™cie to nie dziaÅ‚a nieumarÅ‚ych, konstrukty oraz istoty pozaplanarne.~ +%atsymbol%201=~Leczenie umiarkowanych ran~ +%atsymbol%200=~OÅ›lepienie~ +%atsymbol%199=~SÅ‚oneczny żar +(Inwokacje) +Poziom: 1 +Sfera: SÅ‚oÅ„ce +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: natychmiastowy +Czas rzucania: 4 +Obszar dziaÅ‚ania: 1 istota +Rzut obronny: specjalny +Z chwilÄ… rzucenia tego zaklÄ™cia z nieba spada jaskrawy promieÅ„ gorÄ…cego żaru, uderzajÄ…c cel wybrany przez rzucajÄ…cego czar. Trafiona istota otrzymuje obrażenia w wysokoÅ›ci 1k6 +1 na poziom czarujÄ…cego. JeÅ›li celem jest nieumarÅ‚y lub istota wrażliwa na jaskrawe Å›wiatÅ‚o, obrażenia wynoszÄ… 1k6 +2 na poziom czarujÄ…cego. Oprócz odniesionych ran, ofiara zostaje również oÅ›lepiona na trzy rundy. JeÅ›li wykona rzut obronny przeciw czarom, nie zostanie oÅ›lepiona i otrzyma tylko poÅ‚owÄ™ obrażeÅ„.~ +%atsymbol%198=~SÅ‚oneczny żar~ +%atsymbol%197=~Zadawanie lekkich ran +(Nekromancja) +Poziom: 1 +Sfera: Leczenie +ZasiÄ™g: dotyk +Czas dziaÅ‚ania: natychmiastowy +Czas rzucania: 5 +Obszar dziaÅ‚ania: 1 istota +Rzut obronny: 1/2 +Po rzuceniu tego zaklÄ™cia i dotkniÄ™ciu ofiary, kapÅ‚an zadaje jej 8 obrażeÅ„ (poÅ‚owÄ™ po rzucie obronnym przeciw czarom). Czar nie dziaÅ‚a na nieumarÅ‚ych, konstrukty oraz istoty pozaplanarne. Ponadto, nie może zostać rzucony przez postacie o dobrym charakterze.~ +%atsymbol%196=~Zadawanie lekkich ran~ +%atsymbol%195=~PrzekleÅ„stwo~ +%atsymbol%194=~PrzekleÅ„stwo +(Sprowadzanie/PrzywoÅ‚ywanie) +Poziom: 1 +Sfera: wszystkie +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: 6 rund +Czas rzucania: 9 +Obszar dziaÅ‚ania: w promieniu 5 metrów +Rzut obronny: brak +Po wypowiedzeniu słów PrzekleÅ„stwa, rzucajÄ…cy czar obniża morale wrogich istot o 1. Ponadto, otrzymujÄ… one modyfikator -1 do rzutów obronnych i testów ataku. PrzekleÅ„stwo dziaÅ‚a na wszystkie istoty w promieniu 5 metrów wokół wskazanego punktu (tak wiÄ™c znajdujÄ…ce siÄ™ pod jego wpÅ‚ywem stworzenia, które opuszczÄ… ten obszar, w dalszym ciÄ…gu bÄ™dÄ… odczuwać jego efekty, natomiast istoty, które wejdÄ… na ów obszar po rzuceniu czaru, już nie).~ +%atsymbol%193=~KlÄ…twa~ +%atsymbol%192=~Oko kamienia +Oko to chroni rzucajÄ…cego przed pojedynczym atakiem powodujÄ…cym petryfikacjÄ™. +Może być również wykorzystane jako 3. poziomowy czar maga Unieruchomienie osoby, uniemożliwiajÄ…c poruszanie siÄ™ humanoidom o rozmiarze czÅ‚owieka lub mniejszym przez jednÄ… rundÄ™/poziom (rzut obronny przeciw czarom neguje).~ +%atsymbol%191=~Oko kamienia~ +%atsymbol%190=~Oko duchowe +Oko to blokuje jeden magiczny atak powodujÄ…cy natychmiastowÄ… Å›mierć (ZaklÄ™cie Å›mierci, Palec Å›mierci, SÅ‚owo mocy: giÅ„, Zabijanie żyjÄ…cych, Zniszczenie). +Zamiast tego, czarodziej może wykorzystać drzemiÄ…cÄ… w oku moc jako 2. poziomowy czar maga PromieÅ„ osÅ‚abienia, obniżajÄ…c SiÅ‚Ä™ celu o 5 (rzut obronny przeciw czarom neguje).~ +%atsymbol%189=~Oko duchowe~ +%atsymbol%188=~Oko hartu ducha +Oko to blokuje jeden efekt powodujÄ…cy ogÅ‚oszenie, gÅ‚uchotÄ™, Å›lepotÄ™ lub ciszÄ™. +Może być zamiast tego wykorzystane jako 4. poziomowy czar maga Okrzyk, zadajÄ…c 4k6 magicznych obrażeÅ„ i wywoÅ‚ujÄ…c gÅ‚uchotÄ™ u istot znajdujÄ…cych siÄ™ na obszarze stożka o promieniu 15 metrów (poÅ‚owa obrażeÅ„ i unikniÄ™cie gÅ‚uchoty po rzucie obronnym przeciw czarom).~ +%atsymbol%187=~Oko hartu ducha~ +%atsymbol%186=~Oko jadowe +Oko to zatrzymuje jeden atak lub efekt, który mógÅ‚by spowodować zatrucie rzucajÄ…cego. +Może być również wykorzystane jako 4. poziomowy czar kapÅ‚aÅ„ski Trucizna, zadajÄ…c jednej istocie 20 obrażeÅ„ w przeciÄ…gu dwudziestu sekund (rzut obronny przeciw truciznom neguje).~ +%atsymbol%185=~Oko jadowe~ +%atsymbol%184=~Oko miecza +Oko to odbija najbliższy atak fizyczny skierowany na rzucajÄ…cego. +Może być wykorzystane jako 1. poziomowy czar maga Magiczny pocisk, tworzÄ…c maksymalnie pięć pocisków (jeden na każde dwa poziomy doÅ›wiadczenia powyżej pierwszego), z których każdy zadaje 1k4 +1 magicznych obrażeÅ„.~ +%atsymbol%183=~Oko miecza~ +%atsymbol%182=~Oko maga +Oko to pochÅ‚ania jednorazowo obrażenia zadane przez ogieÅ„, elektryczność, zimno lub kwas. +Może być również wykorzystane jako 3. poziomowy czar maga BÅ‚yskawica, zadajÄ…c 1k6 obrażeÅ„ od elektrycznoÅ›ci na poziom (maksymalnie 10k6) wszystkim istotom stojÄ…cym jej na drodze.~ +%atsymbol%181=~Oko maga~ +%atsymbol%180=~Oko umysÅ‚u +Kula ta chroni rzucajÄ…cego przez atakami mentalnymi, takimi jak zauroczenie, emocje, czy strach. +Oko może być wykorzystane jako 1. poziomowy czar maga Zauroczenie osoby, sprawiajÄ…c że jedna humanoidalna istota znajdzie siÄ™ przez jednÄ… turÄ™ pod kontrolÄ… rzucajÄ…cego (rzut obronny przeciw czarom neguje).~ +%atsymbol%179=~Oko umysÅ‚u~ +%atsymbol%178=~Nie możesz rzucić tego zaklÄ™cia, póki nie skoÅ„czysz rzucać obecnego czaru.~ +%atsymbol%177=~Siedmioro oczu +(Odrzucanie) +Poziom: 7 +ZasiÄ™g: 0 +Czas dziaÅ‚ania: 2 tury +Czas rzucania: 7 +Obszar dziaÅ‚ania: rzucajÄ…cy czar +Rzut obronny: brak +ZaklÄ™cie to powoÅ‚uje do istnienia siedem magicznych kul w ksztaÅ‚cie oka, które unoszÄ… siÄ™ nad gÅ‚owÄ… maga, tworzÄ…c coÅ› w rodzaju pierÅ›cienia. Każde oko posiada zdolnoÅ›ci obronne i ofensywne, ale z chwilÄ… użycia traci swÄ… moc. Każda kolejna próba zastosowania tego czaru nie powiedzie siÄ™, jeżeli czas trwania poprzedniego zaklÄ™cia nie dobiegÅ‚ koÅ„ca, bez wzglÄ™du na to, czy pozostaÅ‚y jeszcze jakieÅ› magiczne oczy, czy też nie. Poniżej przedstawiona zostaÅ‚a charakterystyka każdego oka: +Oko umysÅ‚u – chroni rzucajÄ…cego przed atakami mentalnymi, takimi jak zauroczenie, emocje, czy strach. Może być wykorzystane jako 1. poziomowy czar maga o nazwie Zauroczenie osoby, sprawiajÄ…c, że jedna humanoidalna istota znajdzie siÄ™ przez jednÄ… turÄ™ pod kontrolÄ… rzucajÄ…cego (rzut obronny przeciw czarom neguje). +Oko miecza – odbija najbliższy atak fizyczny skierowany na rzucajÄ…cego. Może być wykorzystane jako 1. poziomowy czar maga o nazwie Magiczny pocisk, tworzÄ…c maksymalnie pięć pocisków (jeden na każde dwa poziomy doÅ›wiadczenia powyżej pierwszego), z których każdy zadaje 1k4 +1 magicznych obrażeÅ„. +Oko maga – pochÅ‚ania jednorazowo obrażenia zadane przez ogieÅ„, elektryczność, zimno lub kwas. Może być również wykorzystane jako 3. poziomowy czar maga o nazwie BÅ‚yskawica, zadajÄ…c 1k6 obrażeÅ„ od elektrycznoÅ›ci na poziom (maksymalnie 10k6) wszystkim istotom stojÄ…cym jej na drodze. +Oko jadowe – zatrzymuje jeden atak lub efekt, który mógÅ‚by spowodować zatrucie rzucajÄ…cego. Może być również wykorzystane jako 4. poziomowy czar kapÅ‚aÅ„ski o nazwie Trucizna, zadajÄ…c jednej istocie 20 obrażeÅ„ w przeciÄ…gu dwudziestu sekund (rzut obronny przeciw truciznom neguje). +Oko duchowe – blokuje jeden magiczny atak powodujÄ…cy natychmiastowÄ… Å›mierć (ZaklÄ™cie Å›mierci, Palec Å›mierci, SÅ‚owo mocy: giÅ„, Zabijanie żyjÄ…cych, Zniszczenie). Zamiast tego, czarodziej może wykorzystać drzemiÄ…cÄ… w oku moc jako 2. poziomowy czar maga o nazwie PromieÅ„ osÅ‚abienia, obniżajÄ…c SiÅ‚Ä™ celu o 5 (rzut obronny przeciw czarom neguje). +Oko hartu ducha – blokuje jeden efekt powodujÄ…cy ogÅ‚oszenie, gÅ‚uchotÄ™, Å›lepotÄ™ lub ciszÄ™. Może być zamiast tego wykorzystane jako 4. Poziomowy czar maga o nazwie Okrzyk, zadajÄ…c 4k6 magicznych obrażeÅ„ i wywoÅ‚ujÄ…c gÅ‚uchotÄ™ u istot znajdujÄ…cych siÄ™ na obszarze stożka o promieniu 15 metrów (poÅ‚owa obrażeÅ„ i unikniÄ™cie gÅ‚uchoty po rzucie obronnym przeciw czarom). +Oko kamienia – chroni rzucajÄ…cego przed pojedynczym atakiem powodujÄ…cym petryfikacjÄ™. Może być również wykorzystane jako 3. poziomowy czar maga o nazwie Unieruchomienie osoby, uniemożliwiajÄ…c poruszanie siÄ™ humanoidom o rozmiarze czÅ‚owieka lub mniejszym przez jednÄ… rundÄ™/poziom (rzut obronny przeciw czarom neguje).~ +%atsymbol%176=~Siedmioro oczu~ +%atsymbol%175=~Gniew Malavona +(WywoÅ‚ywanie) +Poziom: 7 +ZasiÄ™g: 0 +Czas dziaÅ‚ania: natychmiastowy +Czas rzucania: 1 +Obszar dziaÅ‚ania: w promieniu 2 metrów +Rzut obronny: 1/2 +Gniew Malavona to zaklÄ™cie stworzone przez czarownika z rasy mrocznych elfów o imieniu Malavon. Po jego rzuceniu, z ciaÅ‚a czarujÄ…cego wystrzeliwujÄ… we wszystkich kierunkach strzaÅ‚ki czystej energii, raniÄ…c zarówno wrogów, jak i przyjaciół. Te maÅ‚e magiczne pociski zadajÄ… 20k4 kÅ‚utych obrażeÅ„ (poÅ‚owÄ™ po rzucie obronnym przeciw czarom) wszystkim, którzy znajdÄ… siÄ™ na ich drodze. Czar ten jest szczególnie przydatny, gdy mag jest otoczony przez wrogów.~ +%atsymbol%174=~Gniew Malavona~ +%atsymbol%173=~Uderzenie vorpalne~ +%atsymbol%172=~Åšmierć~ +%atsymbol%171=~NieumarÅ‚y zniszczony~ +%atsymbol%170=~Mieszkaniec zewnÄ™trznych sfer zniszczony ~ +%atsymbol%169=~Cienie +(Iluzje/Urojenia) +Poziom: 6 +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: 1 runda/poziom +Czas rzucania: 6 +Obszar dziaÅ‚ania: specjalny +Rzut obronny: brak +ZaklÄ™cie to jest podobne do czarów Potwory z cienia i Potwory z półcienia, pozwalajÄ…c czarujÄ…cemu uksztaÅ‚tować materiaÅ‚ z Półplanu Cienia, tworzÄ…c z niego iluzoryczne stworzenia. Cienie te sÄ… wytrzymalsze, niż te przywoÅ‚ane za pomocÄ… zaklęć Potwory z cienia i Potwory z półcienia i bÄ™dÄ… posÅ‚uszne czarujÄ…cemu dopóki nie zostanÄ… zgÅ‚adzone lub dopóki nie upÅ‚ynie czas dziaÅ‚ania zaklÄ™cia.~ +%atsymbol%168=~Cienie~ +%atsymbol%167=~DotkniÄ™cie lisza~ +%atsymbol%166=~DotkniÄ™cie lisza~ +%atsymbol%165=~DotkniÄ™cie lisza +(Nekromancja) +Poziom: 6 +ZasiÄ™g: dotyk +Czas dziaÅ‚ania: 1 runda/poziom +Czas rzucania: 6 +Obszar dziaÅ‚ania: rzucajÄ…cy czar +Rzut obronny: specjalny +Czar ten nadaje rzucajÄ…cemu moc dotyku lisza oraz zapewnia mu jego odpornoÅ›ci. W czasie jego dziaÅ‚ania, czarujÄ…cy zyskuje niewrażliwość na paraliż i strach, a jego dÅ‚onie jarzÄ… siÄ™ nieziemskim zielonym blaskiem, zadajÄ…c 1k10 obrażeÅ„ od zimna i paraliżujÄ…c dotkniÄ™tÄ… istotÄ™, chyba że wykona ona rzut obronny przeciw paraliżowi. Czar ten nie dziaÅ‚a na nieumarÅ‚ych.~ +%atsymbol%164=~DotkniÄ™cie lisza~ +%atsymbol%163=~UsuniÄ™cie efektów~ +%atsymbol%162=~Tarcza antymagiczna +(Odrzucanie) +Poziom: 6 +ZasiÄ™g: 0 +Czas dziaÅ‚ania: 1 tura/poziom +Czas rzucania: 1 +Obszar dziaÅ‚ania: rzucajÄ…cy czar +Rzut obronny: brak +ZaklÄ™cie to otacza czarujÄ…cego niewidzialnÄ… barierÄ…, która porusza siÄ™ wraz z nim. Bariera ta czyni maga niewrażliwym na wszelkie magiczne ataki, lecz uniemożliwia mu również rzucanie czarów. +Tarcza antymagiczna rozprasza również gÅ‚uchotÄ™ i ogÅ‚upienie u czarujÄ…cego.~ +%atsymbol%161=~Tarcza antymagiczna~ +%atsymbol%160=~Silny jaszczuroczÅ‚ek~ +%atsymbol%159=~Goblin gwardzista~ +%atsymbol%158=~Goblin gwardzista~ +%atsymbol%157=~Potwory z półcienia +(Iluzje/Urojenia) +Poziom: 5 +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: 1 runda/poziom +Czas rzucania: 5 +Obszar dziaÅ‚ania: specjalny +Rzut obronny: brak +Czar ten jest podobny do 4. poziomowego zaklÄ™cia maga o nazwie Potwory z cienia, z tÄ… różnicÄ…, że przywoÅ‚ane istoty sÄ… znacznie potężniejsze.~ +%atsymbol%156=~Potwory z półcienia~ +%atsymbol%155=~BroÅ„ trolli~ +%atsymbol%154=~Troll~ +%atsymbol%153=~Troll~ +%atsymbol%152=~Potwory z cienia +(Iluzje/Urojenia) +Poziom: 4 +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: 1 runda/poziom +Czas rzucania: 4 +Obszar dziaÅ‚ania: specjalny +Rzut obronny: brak +Czar ten formuje substancjÄ™ z Półplanu Cienia, tworzÄ…c z niej coÅ› na ksztaÅ‚t iluzorycznych potworów. W danym momencie może przyzwać maksymalnie sześć tych cienistych stworzeÅ„, lecz caÅ‚kowita ilość ich Kostek wytrzymaÅ‚oÅ›ci nie przekracza poziomu czarujÄ…cego.~ +%atsymbol%151=~Potwory z cienia~ +%atsymbol%150=~Przyspieszenie ruchów~ +%atsymbol%149=~Spowolnienie ruchów~ +%atsymbol%148=~Spowolnienie~ +%atsymbol%147=~PoÅ›pieszny odwrót +(Przemiany) +Poziom: 1 +ZasiÄ™g: 0 +Czas dziaÅ‚ania: 3 rundy +Czas rzucania: 1 +Obszar dziaÅ‚ania: rzucajÄ…cy czar +Rzut obronny: brak +ZaklÄ™cie to podwaja na krótko prÄ™dkość poruszania siÄ™ istoty, która je rzuciÅ‚a... umożliwiajÄ…c jej zazwyczaj ucieczkÄ™. Gdy jest ono aktywne, na rzucajÄ…cego nie dziaÅ‚ajÄ… pozostaÅ‚e efekty wpÅ‚ywajÄ…ce na ruch, jak np. czary Przyspieszenie ruchów, czy Spowolnienie ruchów. Ponadto, istota która znajduje siÄ™ pod wpÅ‚ywem PoÅ›piesznego odwrotu nie może atakować, rzucać czarów, ani używać przedmiotów lub specjalnych zdolnoÅ›ci... jedyne, co może zrobić, to uciekać.~ +%atsymbol%146=~PoÅ›pieszny odwrót~ +%atsymbol%145=~Miecz Mordenkainena~ +%atsymbol%144=~Miecz Mordenkainena~ +%atsymbol%143=~Miecz Mordenkainena +(WywoÅ‚ywanie) +Poziom: 7 +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: 1 runda/poziom +Czas rzucania: 7 +Obszar dziaÅ‚ania: specjalny +Rzut obronny: brak +ZaklÄ™cie to przywoÅ‚uje migoczÄ…cy miecz energii, który może być kontrolowny przez czarujÄ…cego siÅ‚Ä… jego umysÅ‚u. Zadaje on takie obrażenia, jak gdyby byÅ‚ używany przez wojownika na poziomie o poÅ‚owÄ™ niższym, niż czarujÄ…cy, i pomimo że trzyma siÄ™ go w dÅ‚oni, może on ranić istoty znajdujÄ…ce siÄ™ gdziekolwiek w zasiÄ™gu wzroku rzucajÄ…cego czar. Chociaż miecz nie dodaje premii do testów ataku, zadaje obrażenia istotom, które normalnie można zranić jedynie broniÄ… o umagicznieniu +2, lub wyższym. Po trafieniu zadaje 5k6 siecznych obrażeÅ„.~ +%atsymbol%142=~Miecz Mordenkainena~ +%atsymbol%141=~Å»ywioÅ‚ak wody~ +%atsymbol%140=~Å»ywioÅ‚ak wody~ +%atsymbol%139=~Sprowadzenie żywioÅ‚aka wody +(Sprowadzanie/PrzywoÅ‚ywanie) +Poziom: 5 +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: 1 tura/poziom +Czas rzucania: 9 +Obszar dziaÅ‚ania: specjalny +Rzut obronny: brak +Czar ten pozwala na przyzwanie ze Sfery Å»ywioÅ‚u Wody żywioÅ‚aka o 8 KW, a nastÄ™pnie spÄ™tanie go, by wykonywaÅ‚ polecenie czarujÄ…cego. Å»ywioÅ‚ak ten bÄ™dzie walczyÅ‚ w imieniu osoby rzucajÄ…cej czar przez caÅ‚y czas dziaÅ‚ania zaklÄ™cia lub dopóki nie zostanie zniszczony.~ +%atsymbol%138=~Sprowadzenie żywioÅ‚aka wody~ +%atsymbol%137=~Å»ywioÅ‚ak powietrza~ +%atsymbol%136=~Å»ywioÅ‚ak powietrza~ +%atsymbol%135=~Sprowadzenie żywioÅ‚aka powietrza +(Sprowadzanie/PrzywoÅ‚ywanie) +Poziom: 5 +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: 1 tura/poziom +Czas rzucania: 9 +Obszar dziaÅ‚ania: specjalny +Rzut obronny: brak +Czar ten pozwala na przyzwanie ze Sfery Å»ywioÅ‚u Powietrza żywioÅ‚aka o 8 KW, a nastÄ™pnie spÄ™tanie go, by wykonywaÅ‚ polecenie czarujÄ…cego. Å»ywioÅ‚ak ten bÄ™dzie walczyÅ‚ w imieniu osoby rzucajÄ…cej czar przez caÅ‚y czas dziaÅ‚ania zaklÄ™cia lub dopóki nie zostanie zniszczony.~ +%atsymbol%134=~Sprowadzenie żywioÅ‚aka powietrza~ +%atsymbol%133=~Å»ywioÅ‚ak ognia~ +%atsymbol%132=~Å»ywioÅ‚ak ognia~ +%atsymbol%131=~Sprowadzenie żywioÅ‚aka ognia +(Sprowadzanie/PrzywoÅ‚ywanie) +Poziom: 5 +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: 1 tura/poziom +Czas rzucania: 9 +Obszar dziaÅ‚ania: specjalny +Rzut obronny: brak +Czar ten pozwala na przyzwanie ze Sfery Å»ywioÅ‚u Ognia żywioÅ‚aka o 8 KW, a nastÄ™pnie spÄ™tanie go, by wykonywaÅ‚ polecenie czarujÄ…cego. Å»ywioÅ‚ak ten bÄ™dzie walczyÅ‚ w imieniu osoby rzucajÄ…cej czar przez caÅ‚y czas dziaÅ‚ania zaklÄ™cia lub dopóki nie zostanie zniszczony.~ +%atsymbol%130=~Sprowadzenie żywioÅ‚aka ognia~ +%atsymbol%129=~Å»ywioÅ‚ak ziemi~ +%atsymbol%128=~Å»ywioÅ‚ak ziemi~ +%atsymbol%127=~Sprowadzenie żywioÅ‚aka ziemi +(Sprowadzanie/PrzywoÅ‚ywanie) +Poziom: 5 +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: 1 tura/poziom +Czas rzucania: 9 +Obszar dziaÅ‚ania: specjalny +Rzut obronny: brak +Czar ten pozwala na przyzwanie ze Sfery Å»ywioÅ‚u Ziemi żywioÅ‚aka o 8 KW, a nastÄ™pnie spÄ™tanie go, by wykonywaÅ‚ polecenie czarujÄ…cego. Å»ywioÅ‚ak ten bÄ™dzie walczyÅ‚ w imieniu osoby rzucajÄ…cej czar przez caÅ‚y czas dziaÅ‚ania zaklÄ™cia lub dopóki nie zostanie zniszczony.~ +%atsymbol%126=~Sprowadzenie żywioÅ‚aka ziemi~ +%atsymbol%125=~PrzywoÅ‚anie potwora III +(Sprowadzanie/PrzywoÅ‚ywanie) +Poziom: 5 +ZasiÄ™g: 6 metrów +Czas dziaÅ‚ania: 4 rundy + 1 runda/poziom +Czas rzucania: 5 +Obszar dziaÅ‚ania: specjalny +Rzut obronny: brak +MocÄ… tego zaklÄ™cia czarodziej przyzywa 1k4 potwory o 3 Kostkach. PojawiajÄ… siÄ™ one w obszarze dziaÅ‚ania czaru i można im nakazać atakowanie przeciwników czarujÄ…cego, dopóki nie upÅ‚ynie czas dziaÅ‚ania zaklÄ™cia lub dopóki nie zostanÄ… zgÅ‚adzone.~ +%atsymbol%124=~PrzywoÅ‚anie potwora III~ +%atsymbol%123=~JaszczuroczÅ‚ek~ +%atsymbol%122=~JaszczuroczÅ‚ek~ +%atsymbol%121=~PrzywoÅ‚anie potwora II +(Sprowadzanie/PrzywoÅ‚ywanie) +Poziom: 4 +ZasiÄ™g: 6 metrów +Czas dziaÅ‚ania: 3 rundy + 1 runda/poziom +Czas rzucania: 4 +Obszar dziaÅ‚ania: specjalny +Rzut obronny: brak +MocÄ… tego zaklÄ™cia czarodziej przyzywa 1k6 potworów o 2 Kostkach. PojawiajÄ… siÄ™ one w obszarze dziaÅ‚ania czaru i można im nakazać atakowanie przeciwników czarujÄ…cego, dopóki nie upÅ‚ynie czas dziaÅ‚ania zaklÄ™cia lub dopóki nie zostanÄ… zgÅ‚adzone.~ +%atsymbol%120=~PrzywoÅ‚anie potwora II~ +%atsymbol%119=~Goblin~ +%atsymbol%118=~Goblin~ +%atsymbol%117=~PrzywoÅ‚anie potwora I +(Sprowadzanie/PrzywoÅ‚ywanie) +Poziom: 3 +ZasiÄ™g: 6 metrów +Czas dziaÅ‚ania: 2 rundy + 1 runda/poziom +Czas rzucania: 3 +Obszar dziaÅ‚ania: specjalny +Rzut obronny: brak +MocÄ… tego zaklÄ™cia czarodziej przyzywa 2k3 potworów o 1 Kostce. PojawiajÄ… siÄ™ one w obszarze dziaÅ‚ania czaru i można im nakazać atakowanie przeciwników czarujÄ…cego, dopóki nie upÅ‚ynie czas dziaÅ‚ania zaklÄ™cia lub dopóki nie zostanÄ… zgÅ‚adzone.~ +%atsymbol%116=~PrzywoÅ‚anie potwora I~ +%atsymbol%115=~Atak~ +%atsymbol%114=~Minotaur~ +%atsymbol%113=~Minotaur~ +%atsymbol%112=~PrzywoÅ‚anie potwora V +(Sprowadzanie/PrzywoÅ‚ywanie) +Poziom: 7 +ZasiÄ™g: 6 metrów +Czas dziaÅ‚ania: 6 rund + 1 runda/poziom +Czas rzucania: 7 +Obszar dziaÅ‚ania: specjalny +Rzut obronny: brak +MocÄ… tego zaklÄ™cia czarodziej przyzywa 1k3 potwory o 5 Kostkach. PojawiajÄ… siÄ™ one w obszarze dziaÅ‚ania czaru i można im nakazać atakowanie przeciwników czarujÄ…cego, dopóki nie upÅ‚ynie czas dziaÅ‚ania zaklÄ™cia lub dopóki nie zostanÄ… zgÅ‚adzone.~ +%atsymbol%111=~PrzywoÅ‚anie potwora V~ +%atsymbol%110=~[.]~ +%atsymbol%109=~[.]~ +%atsymbol%108=~Salamandra~ +%atsymbol%107=~Salamandra~ +%atsymbol%106=~Lodowa salamandra~ +%atsymbol%105=~Lodowa salamandra~ +%atsymbol%104=~PrzywoÅ‚anie potwora VI +(Sprowadzanie/PrzywoÅ‚ywanie) +Poziom: 8 +ZasiÄ™g: 6 metrów +Czas dziaÅ‚ania: 7 rund + 1 runda/poziom +Czas rzucania: 8 +Obszar dziaÅ‚ania: specjalny +Rzut obronny: brak +MocÄ… tego zaklÄ™cia czarodziej przyzywa 1k3 potwory o 6 Kostkach. PojawiajÄ… siÄ™ one w obszarze dziaÅ‚ania czaru i można im nakazać atakowanie przeciwników czarujÄ…cego, dopóki nie upÅ‚ynie czas dziaÅ‚ania zaklÄ™cia lub dopóki nie zostanÄ… zgÅ‚adzone.~ +%atsymbol%103=~PrzywoÅ‚anie potwora VI~ +%atsymbol%102=~Atak~ +%atsymbol%101=~Umbrowy kolos~ +%atsymbol%100=~Umbrowy kolos~ +%atsymbol%99=~Szkielet strażnik~ +%atsymbol%98=~Szkielet strażnik~ +%atsymbol%97=~PrzywoÅ‚anie potwora VII +(Sprowadzanie/PrzywoÅ‚ywanie) +Poziom: 9 +ZasiÄ™g: 6 metrów +Czas dziaÅ‚ania: 8 rund + 1 runda/poziom +Czas rzucania: 9 +Obszar dziaÅ‚ania: specjalny +Rzut obronny: brak +MocÄ… tego zaklÄ™cia czarodziej przyzywa 1k2 potwory o 7 lub 8 Kostkach. PojawiajÄ… siÄ™ one w obszarze dziaÅ‚ania czaru i można im nakazać atakowanie przeciwników czarujÄ…cego, dopóki nie upÅ‚ynie czas dziaÅ‚ania zaklÄ™cia lub dopóki nie zostanÄ… zgÅ‚adzone.~ +%atsymbol%96=~PrzywoÅ‚anie potwora VII~ +%atsymbol%95=~PrzywoÅ‚anie potwora IV +(Sprowadzanie/PrzywoÅ‚ywanie) +Poziom: 6 +ZasiÄ™g: 6 metrów +Czas dziaÅ‚ania: 5 rund + 1 runda/poziom +Czas rzucania: 6 +Obszar dziaÅ‚ania: specjalny +Rzut obronny: brak +MocÄ… tego zaklÄ™cia czarodziej przyzywa 1k3 potwory o 4 Kostkach. PojawiajÄ… siÄ™ one w obszarze dziaÅ‚ania czaru i można im nakazać atakowanie przeciwników czarujÄ…cego, dopóki nie upÅ‚ynie czas dziaÅ‚ania zaklÄ™cia lub dopóki nie zostanÄ… zgÅ‚adzone.~ +%atsymbol%94=~PrzywoÅ‚anie potwora IV~ +%atsymbol%93=~Czaszka~ +%atsymbol%92=~[.]~ +%atsymbol%91=~Przedmiot przezroczystoÅ›ci potworów~ +%atsymbol%90=~CieÅ„~ +%atsymbol%89=~CieÅ„~ +%atsymbol%88=~PrzywoÅ‚anie cieni +(Sprowadzanie/PrzywoÅ‚ywanie, Nekromancja) +Poziom: 5 +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: 1 runda + 1 runda/poziom +Czas rzucania: 5 +Obszar dziaÅ‚ania: specjalny +Rzut obronny: brak +Czar ten przywoÅ‚uje trzy cienie o 4 KW. BÄ™dÄ… one speÅ‚niać polecenia czarujÄ…cego, atakujÄ…c jego wrogów lub wykonujÄ…c różne zadania, dopóki nie zostanÄ… zgÅ‚adzone lub dopóki nie skoÅ„czy siÄ™ dziaÅ‚anie zaklÄ™cia.~ +%atsymbol%87=~PrzywoÅ‚anie cieni~ +%atsymbol%86=~Å»elazna pięść~ +%atsymbol%85=~Å»elazna pięść~ +%atsymbol%84=~zapada na ciężkÄ… chorobÄ™~ +%atsymbol%83=~Chory~ +%atsymbol%82=~Zatrucie~ +%atsymbol%81=~Trucizna~ +%atsymbol%80=~Å»elazne ciaÅ‚o +(Przemiany) +Poziom: 8 +ZasiÄ™g: 0 +Czas dziaÅ‚ania: 2 tury +Czas rzucania: 8 +Obszar dziaÅ‚ania: rzucajÄ…cy czar +Rzut obronny: brak +ZaklÄ™cie to przeksztaÅ‚ca ciaÅ‚o czarujÄ…cego w żywe żelazo, zapewniajÄ…c mu potężne odpornoÅ›ci i zdolnoÅ›ci. W trakcie jego dziaÅ‚ania czarujÄ…cy otrzymuje 100% odpornoÅ›ci na elektryczność oraz trucizny, 50% odpornoÅ›ci na ogieÅ„ i 25% odpornoÅ›ci na obrażenia obuchowe. ZaklÄ™cia wpÅ‚ywajÄ…ce na fizjologiÄ™ i zdolność oddychania czarujÄ…cego sÄ… ignorowane. Ponadto, współczynnik SiÅ‚y rzucajÄ…cego czar wzrasta do 25 i może on atakować dwa razy na rundÄ™ żelaznymi pięściami, zadajÄ…c 2k4 obrażeÅ„ plus premia za wysokÄ… SiÅ‚Ä™. +Niestety, ruchy czarujÄ…cego stajÄ… siÄ™ powolne i niezdarne, sprawiajÄ…c, że jego prÄ™dkość poruszania obniża siÄ™ do 25% pierwotnej wartoÅ›ci oraz uniemożliwiajÄ…c mu rzucanie czarów, dopóki nie skoÅ„czy siÄ™ dziaÅ‚anie Å»elaznego ciaÅ‚a.~ +%atsymbol%79=~Å»elazne ciaÅ‚o~ +%atsymbol%78=~Utrata przytomnoÅ›ci~ +%atsymbol%77=~Wielki okrzyk +(Inwokacje) +Poziom: 8 +ZasiÄ™g: 0 +Czas dziaÅ‚ania: natychmiastowy +Czas rzucania: 1 +Obszar dziaÅ‚ania: 15° stożek o promieniu 5,5 metra +Rzut obronny: 1/2 +Po wypowiedzeniu słów zaklÄ™cia Wielki okrzyk, z ust czarujÄ…cego wydobywa siÄ™ ogÅ‚uszajÄ…cy podmuch siÅ‚y w ksztaÅ‚cie stożka o promieniu 5,5 metra. Czar ten jest niezwykle wyczerpujÄ…cy i niebezpieczny dla użytkownika, wysysajÄ…c z niego 2k4 punkty życia i zmuszajÄ…c go do wykonania rzutu obronnego przeciw czarom, aby nie straciÅ‚ przytomnoÅ›ci na jednÄ… turÄ™. Istoty posiadajÄ…ce 5 lub mniej Kostek WytrzymaÅ‚oÅ›ci, które znajdÄ… siÄ™ w obszarze dziaÅ‚ania zaklÄ™cia, natychmiast ginÄ…. PozostaÅ‚e istoty muszÄ… wykonać rzut obronny przeciw czarom lub zostanÄ… ogÅ‚uszone na dwie rundy, ogÅ‚uchnÄ… na cztery rundy i otrzymajÄ… 4k12 magicznych obrażeÅ„. Udany rzut obronny sprawi, że zostajÄ… one ogÅ‚uszone na jednÄ… rundÄ™, ogÅ‚uchnÄ… na dwie rundy i otrzymajÄ… 2k12 magicznych obrażeÅ„.~ +%atsymbol%76=~Wielki okrzyk~ +%atsymbol%75=~Zauroczenie~ +%atsymbol%74=~Okropne zaurocznie~ +%atsymbol%73=~Dominacja~ +%atsymbol%72=~Morale zostaÅ‚o zÅ‚amane: panika~ +%atsymbol%71=~Odurzenie~ +%atsymbol%70=~ZamÄ™t~ +%atsymbol%69=~BezmyÅ›lność~ +%atsymbol%68=~Unieruchomienie~ +%atsymbol%67=~Paraliż~ +%atsymbol%66=~Unieruchomienie~ +%atsymbol%65=~ZasÅ‚oniÄ™cie umysÅ‚u +(Odrzucanie) +Poziom: 8 +ZasiÄ™g: 0 +Czas dziaÅ‚ania: 24 godziny +Czas rzucania: 1 +Obszar dziaÅ‚ania: rzucajÄ…cy czar +Rzut obronny: brak +BÄ™dÄ…cy formÄ… samokontroli i ochrony prywatnoÅ›ci, czar ZasÅ‚oniÄ™cie umysÅ‚u chroni umysÅ‚ istoty przed niemal każdym rodzajem mentalnego efektu – urokami, labiryntem, ogÅ‚upieniem, zamÄ™tem, strachem, odurzeniem, szaÅ‚em, unieruchomieniem i petryfikacjÄ….~ +%atsymbol%64=~ZasÅ‚oniÄ™cie umysÅ‚u~ +%atsymbol%63=~Duszenie +(Przemiany) +Poziom: 7 +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: 4 rundy +Czas rzucania: 7 +Obszar dziaÅ‚ania: w promieniu 2 metrów +Rzut obronny: specjalny +Czar ten pozbawia oddechu wszystkie istoty znajdujÄ…ce siÄ™ w obszarze jego dziaÅ‚ania. Istoty niemuszÄ…ce oddychać sÄ… niepodatne na jego wpÅ‚yw. DuszÄ…ce siÄ™ stworzenia otrzymujÄ… karÄ™ -4 do Klasy Pancerza, -4 do testów trafienia i -6 do ZrÄ™cznoÅ›ci. Ponadto, mogÄ… wykonywać w ciÄ…gu rundy o jeden atak mniej, ich prÄ™dkość poruszania zostaje zmniejszona o poÅ‚owÄ™, a także otrzymujÄ… co rundÄ™ 4k8 magicznych obrażeÅ„. Rzut obronny neguje wszystkie efekty, poza 2k8 obrażeniami otrzymywanymi przez jednÄ… rundÄ™. Efekt zaczyna sÅ‚abnąć w chwili, w której istota opuÅ›ci obszar dziaÅ‚ania czaru, aczkolwiek może minąć runda, zanim zÅ‚apie oddech.~ +%atsymbol%62=~Duszenie~ +%atsymbol%61=~NawaÅ‚nica kwasu +(WywoÅ‚ywanie) +Poziom: 7 +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: 1 runda/poziom +Czas rzucania: 7 +Obszar dziaÅ‚ania: w promieniu 4 metrów +Rzut obronny: 1/2 +Czar ten uwalnia deszcz kwasu, który zalewa obszar jego dziaÅ‚ania, zadajÄ…c 1k4 obrażeÅ„ od kwasu co rundÄ™ przez pierwsze trzy rundy dziaÅ‚ania czaru, 1k6 obrażeÅ„ przez trzy nastÄ™pne rundy i 1k8 obrażeÅ„ w każdej kolejnej rundzie. Wydostanie siÄ™ poza obszar dziaÅ‚ania NawaÅ‚nicy kwasu nie spowoduje zaprzestania otrzymywania obrażeÅ„, albowiem kwas przywiera do skóry, zaÅ› każda istota znajdujÄ…ca siÄ™ wewnÄ…trz tego obszaru bÄ™dzie otrzymywaÅ‚a obrażenia od kwasu przez caÅ‚y czas dziaÅ‚ania zaklÄ™cia. BÄ™dÄ…ce pod wpÅ‚ywem dziaÅ‚ania chmury istoty wykonujÄ… co rundÄ™ rzut obronny przeciw czarom, otrzymujÄ…c w danej rundzie poÅ‚owÄ™ obrażeÅ„, jeÅ›li ten zakoÅ„czyÅ‚ siÄ™ powodzeniem.~ +%atsymbol%60=~NawaÅ‚nica kwasu~ +%atsymbol%59=~WytrzymaÅ‚ość trolla +(Nekromancja) +Poziom: 6 +ZasiÄ™g: 0 +Czas dziaÅ‚ania: 2 tury +Czas rzucania: 6 +Obszar dziaÅ‚ania: rzucajÄ…cy czar +Rzut obronny: brak +ZaklÄ™cie to obdarza czarujÄ…cego wytrzymaÅ‚oÅ›ciÄ… trolla, pozwalajÄ…c mu na regeneracjÄ™ 5 punktów życia co rundÄ™, aż do odzyskania peÅ‚nej ich iloÅ›ci.~ +%atsymbol%58=~WytrzymaÅ‚ość trolla~ +%atsymbol%57=~Szkielet~ +%atsymbol%56=~Szkielet~ +%atsymbol%55=~Pożeracz dusz +(Nekromancja) +Poziom: 6 +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: natychmiastowy +Czas rzucania: 5 +Obszar dziaÅ‚ania: w promieniu 2 metrów +Rzut obronny: brak +Czar ten zadaje 3k8 magicznych obrażeÅ„ wszystkim żywym stworzeniom znajdujÄ…cym siÄ™ w promieniu 4 metrów. Każda istota, która umrze w wyniku dziaÅ‚ania tych obrażeÅ„, zostaje unicestwiona, a jej esencja zostaje przeksztaÅ‚cona w szkielet o 3 KW, znajdujÄ…cy siÄ™ pod kontrolÄ… czarujÄ…cego. Ponadto, za każdÄ… zabitÄ… w ten sposób istotÄ™ czarujÄ…cy otrzymuje na jednÄ… turÄ™ premiÄ™ +1 do SiÅ‚y, ZrÄ™cznoÅ›ci i Kondycji. ZaklÄ™cie to nie dziaÅ‚a na nieumarÅ‚ych, konstrukty i żywioÅ‚aki.~ +%atsymbol%54=~Pożeracz dusz~ +%atsymbol%53=~KoÅ›ciana strzaÅ‚ka +3~ +%atsymbol%52=~StrzaÅ‚ka kostna~ +%atsymbol%51=~KoÅ›ciane strzaÅ‚ki +(Nekromancja) +Poziom: 6 +ZasiÄ™g: 0 +Czas dziaÅ‚ania: 5 rund +Czas rzucania: 5 +Obszar dziaÅ‚ania: rzucajÄ…cy czar +Rzut obronny: brak +Czar ten tworzy dziewięć strzaÅ‚ek, które mogÄ… być użyte przez czarujÄ…cego. Nie można ich odÅ‚ożyć, dopóki nie upÅ‚ynie czas dziaÅ‚ania zaklÄ™cia. PowstaÅ‚e strzaÅ‚ki posiadajÄ… umagicznienie +3, zadajÄ… 1k4 +3 obrażeÅ„ od pocisków, a trafiona nimi istota musi wykonać rzut obronny przeciw Å›mierci lub otrzyma 2k6 magicznych obrażeÅ„, a jej SiÅ‚a zostanie obniżona o 3 na okres piÄ™ciu rund. Utrata siÅ‚y nie jest kumulatywna, a nieudany rzut obronny nie spowoduje, że bÄ™dzie ona trwaÅ‚a dÅ‚użej. BiegÅ‚ość czarujÄ…cego w posÅ‚ugiwaniu siÄ™ strzaÅ‚kami (lub jej brak) nie wpÅ‚ywa na szansÄ™ trafienia w cel.~ +%atsymbol%50=~KoÅ›ciane strzaÅ‚ki~ +%atsymbol%49=~ZamrażajÄ…ca sfera Otiluke'a +(Przemiany, WywoÅ‚ywanie) +Poziom: 6 +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: natychmiastowy +Czas rzucania: 6 +Obszar dziaÅ‚ania: 1 istota +Rzut obronny: neguje +Czar ten wystrzeliwuje w kierunku wybranej istoty kulÄ™ zimna, zadajÄ…cÄ… 1k4 +2 obrażenia od zimna na poziom czarujÄ…cego. JeÅ›li cel wykona rzut obronny przeciw czarom, uchyla siÄ™ przed kulÄ…, unikajÄ…c caÅ‚kowicie obrażeÅ„.~ +%atsymbol%48=~ZamrażajÄ…ca sfera Otiluke'a~ +%atsymbol%47=~CaÅ‚un pÅ‚omieni +(Inwokacje) +Poziom: 5 +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: 1 runda/2 poziomy (specjalny) +Czas rzucania: 5 +Obszar dziaÅ‚ania: w promieniu 1,5 metra +Rzut obronny: neguje +Czar ten sprawia, że bÄ™dÄ…ca pod jego wpÅ‚ywem istota wybucha pÅ‚omieniami, jeÅ›li nie wykona rzutu obronnego przeciw czarom. Ofiara bÄ™dzie pÅ‚onąć, otrzymujÄ…c co rundÄ™ 2k6 obrażeÅ„ od ognia i wypluwajÄ…c przy tym z siebie jÄ™zory ognia, zadajÄ…ce 1k4 obrażeÅ„ od ognia każdemu stworzeniu, które znajduje siÄ™ nie dalej, niż 1,5 metra od niej. Każdy, kto zostanie zraniony pÅ‚omieniami buchajÄ…cymi od ofiary, musi również wykonać rzut obronny przeciw czarom lub sam zajmie siÄ™ ogniem. CaÅ‚un ognia wygasza siÄ™, jeÅ›li rzucajÄ…cy zaklÄ™cie i ofiara nie znajdujÄ… siÄ™ już na tym samym obszarze. Czar ten jest szczególnie użyteczny podczas potyczek z grupami trolli i lodowych salamander.~ +%atsymbol%46=~CaÅ‚un pÅ‚omieni~ +%atsymbol%45=~Kula z witriolem +(Sprowadzanie) +Poziom: 4 +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: specjalny +Czas rzucania: 4 +Obszar dziaÅ‚ania: w promieniu 1,5 metra +Rzut obronny: specjalny +Czar ten przywoÅ‚uje kulÄ™ migoczÄ…cego szmaragdowego kwasu, którÄ… można skierować w stronÄ™ dowolnego celu znajdujÄ…cego siÄ™ w zasiÄ™gu wzroku. Kiedy kula dotrze do ofiary, wybucha, oblewajÄ…c jÄ… żrÄ…cym kwasem. Istota otrzymuje 1k4 obrażeÅ„ od kwasu na poziom czarujÄ…cego; maksymalnie 12k4 obrażeÅ„. Po poczÄ…tkowych obrażeniach ofiara musi wykonać rzut obronny przeciw czarom celem unikniÄ™cia kolejnych obrażeÅ„. JeÅ›li zakoÅ„czy siÄ™ on niepowodzeniem, istota otrzymuje obrażenia od kwasu w kolejnych rundach, lecz z każdÄ… rundÄ… malejÄ… one o 2 kostki. PrzykÅ‚adowo, czarodziej 8. poziomu zadaje 8k4 obrażeÅ„ w pierwszej rundzie, 6k4 w drugiej rundzie, 4k4 w trzeciej, 2k4 w czwartej, a dziaÅ‚anie czaru koÅ„czy siÄ™ w rundzie piÄ…tej. W każdej rundzie ofiara ataku może wykonać rzut obronny przeciw czarom, aby uniknąć dalszych obrażeÅ„. +Kula z witriolem rozpryskuje kwas w promieniu 1,5 metra wokół istoty bÄ™dÄ…cej celem ataku. Wszystkie stworzenia znajdujÄ…ce siÄ™ w obszarze rozprysku muszÄ… wykonać rzut obronny przeciw polimorfii/paraliżowi, bÄ…dź otrzymajÄ… 1k4 obrażeÅ„ na każde pięć poziomów czarujÄ…cego. Rozprysk nie powoduje ciÄ…gÅ‚ych obrażeÅ„.~ +%atsymbol%44=~Kula z witriolem~ +%atsymbol%43=~GÅ‚uchota~ +%atsymbol%42=~Okrzyk +(Inwokacje) +Poziom: 4 +ZasiÄ™g: 0 +Czas dziaÅ‚ania: natychmiastowy +Czas rzucania: 1 +Obszar dziaÅ‚ania: 15° stożek o promieniu 5,5 metra +Rzut obronny: specjalny +ZaklÄ™cie to obdarza czarujÄ…cego nieprawdopodobnymi zdolnoÅ›ciami wokalnymi, pozwalajÄ…c mu na emitowanie rozdzierajÄ…cego uszy krzyku na obszarze przyjmujÄ…cym ksztaÅ‚t stożka. Każda istota znajdujÄ…ca siÄ™ objÄ™ta dziaÅ‚aniem tego czaru staje siÄ™ gÅ‚ucha przez dziewięć rund, a także otrzymuje 4k6 magicznych obrażeÅ„. Rzut obronny przeciw czarom neguje gÅ‚uchotÄ™ i obniża otrzymane obrażenia o poÅ‚owÄ™.~ +%atsymbol%41=~Okrzyk~ +%atsymbol%40=~Pociski mocy Mordenkainena +(Inwokacje) +Poziom: 4 +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: natychmiastowy +Czas rzucania: 4 +Obszar dziaÅ‚ania: w promieniu 0,5 metra +Rzut obronny: specjalny +ZaklÄ™cie to powoÅ‚uje do istnienia poÅ‚yskujÄ…cÄ… kulÄ™ magicznej energii, która wystrzeliwuje z dÅ‚oni czarodzieja, trafiajÄ…c bezbÅ‚Ä™dnie ofiarÄ™. Można tutaj dostrzec duże podobieÅ„stwo do czaru Magiczny pocisk. Czarodziej tworzy jeden pocisk na 7. poziomie oraz kolejny pocisk, co każde trzy poziomy po poziomie siódmym (czyli dwa pociski na 10. poziomie, trzy na 13. poziomie, cztery na 16. poziomie itd., aż do maksymalnej iloÅ›ci siedmiu pocisków na 25. poziomie. Każdy pocisk zadaje ofierze 2k4 obrażeÅ„, a nastÄ™pnie wywoÅ‚uje falÄ™ uderzeniowÄ… o promieniu 0,5 metra, zadajÄ…cÄ… 1 obrażenie na poziom czarujÄ…cego. PrzykÅ‚adowo, czarodziej 12. poziomu może stworzyć dwa pociski, z których każdy zadaje 2k4 +12 magicznych obrażeÅ„. Zaatakowane istoty mogÄ… wykonać rzut obronny przeciw czarom, aby uniknąć obrażeÅ„ pochodzÄ…cych od fali uderzeniowej, lecz nie od samego pocisku. ZaklÄ™cie maga 1. poziomu o nazwie Tarcza unieszkodliwia pociski mocy, w tym obrażenia wywoÅ‚ane falÄ… uderzeniowÄ….~ +%atsymbol%39=~Pociski mocy Mordenkainena~ +%atsymbol%38=~Beznadzieja~ +%atsymbol%37=~OgÅ‚uszony~ +%atsymbol%36=~Emocje: beznadziejność +(Zaczarowania/Zauroczenia) +Poziom: 4 +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: 1 tura +Czas rzucania: 4 +Obszar dziaÅ‚ania: w promieniu 2 metrów +Rzut obronny: neguje +Czar ten wywoÅ‚uje uczucie beznadziejnoÅ›ci na caÅ‚ym obszarze dziaÅ‚ania. Wszyscy wrogowie, którzy nie wykonajÄ… rzutu obronnego przeciw czarom stojÄ… bezczynnie przez jednÄ… turÄ™. Po rzuceniu, zaklÄ™cie to anuluje, na obszarze swego dziaÅ‚ania, efekty czaru Emocje: nadzieja.~ +%atsymbol%35=~Emocje: beznadziejność~ +%atsymbol%34=~Panika~ +%atsymbol%33=~Emocje: strach +(Zaczarowania/Zauroczenia) +Poziom: 4 +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: 5 rund +Czas rzucania: 4 +Obszar dziaÅ‚ania: w promieniu 2 metrów +Rzut obronny: neguje +Czar ten wywoÅ‚uje uczucie strachu na caÅ‚ym obszarze dziaÅ‚ania. Wszyscy wrogowie, którzy nie wykonajÄ… rzutu obronnego przeciw czarom, uciekajÄ… w panice przez pięć rund. W momencie rzucenia, zaklÄ™cie to niweluje dziaÅ‚anie czaru Emocje: odwaga.~ +%atsymbol%32=~Emocje: strach~ +%atsymbol%31=~Emocje: nadzieja +(Zaczarowania/Zauroczenia) +Poziom: 4 +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: 1 godzina +Czas rzucania: 4 +Obszar dziaÅ‚ania: w promieniu 2 metrów +Rzut obronny: brak +Czar ten wywoÅ‚uje uczucie nadziei na caÅ‚ym obszarze dziaÅ‚ania. Wszystkie istoty znajdujÄ…ce siÄ™ pod jego wpÅ‚ywem otrzymujÄ… premiÄ™ +2 do rzutów obronnych, testów ataku oraz obrażeÅ„, a ponadto wzrasta ich morale. W momencie rzucenia, zaklÄ™cie to niweluje dziaÅ‚anie czaru Emocje: beznadziejność.~ +%atsymbol%30=~Emocje: nadzieja~ +%atsymbol%29=~Emocje: odwaga +(Zaczarowania/Zauroczenia) +Poziom: 4 +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: 1 godzina +Czas rzucania: 4 +Obszar dziaÅ‚ania: w promieniu 2 metrów +Rzut obronny: brak +Czar ten wywoÅ‚uje uczucie odwagi na caÅ‚ym obszarze dziaÅ‚ania. Wszystkie istoty znajdujÄ…ce siÄ™ pod jego wpÅ‚ywem otrzymujÄ… premiÄ™ +1 do testów trafienia, +3 do testów obrażeÅ„ oraz +5 tymczasowych punktów życia (punkty te mogÄ… przekroczyć maksymalnÄ… dla danej istoty ilość). ZaklÄ™cie to niweluje wszelkie efekty strachu, aktywne na obszarze jego dziaÅ‚ania w momencie rzucenia.~ +%atsymbol%28=~Emocje: odwaga~ +%atsymbol%27=~SzaÅ‚~ +%atsymbol%26=~PÅ‚onÄ…ca krew Beltyna +(Nekromancja) +Poziom: 4 +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: 1 runda/2 poziomy +Czas rzucania: 4 +Obszar dziaÅ‚ania: 1 istota +Rzut obronny: neguje +Czar ten sprawia, że krew wybranej istoty wybucha żywym ogniem, sprawiajÄ…c, że otrzymuje ona 3k4 obrażeÅ„ co rundÄ™, a także wpada w berserk bÄ™dÄ…cy wynikiem odczuwanego bólu. Ofiara musi co rundÄ™ wykonywać rzut obronny przeciw czarom; udany pozwala uniknąć obrażeÅ„ oraz wpadniÄ™cia w szaÅ‚. ZaklÄ™cie to nie dziaÅ‚a na nieumarÅ‚ych oraz istoty pozaplanarne nieposiadajÄ…ce krwi (takie jak żywioÅ‚aki). JeÅ›li stworzenie jest odporne na ogieÅ„, odporność ta obniży lub caÅ‚kowicie zredukuje obrażenia otrzymane w wyniku dziaÅ‚ania tego czaru.~ +%atsymbol%25=~PÅ‚onÄ…ca krew Beltyna~ +%atsymbol%24=~Lanca zmÄ…cenia +(Inwokacje) +Poziom: 3 +ZasiÄ™g: 33 metry +Czas dziaÅ‚ania: natychmiastowy +Czas rzucania: 3 +Obszar dziaÅ‚ania: specjalny +Rzut obronny: 1/2 +Czar ten tworzy lancÄ™ mocy, która wystrzeliwuje z rÄ™ki czarujÄ…cego w kierunku wybranego przezeÅ„ punktu, znajdujÄ…cego siÄ™ w odlegÅ‚oÅ›ci nie wiÄ™kszej, niż 33 metry. Każda istota znajdujÄ…ca siÄ™ na drodze lancy otrzymuje 5k4 obrażeÅ„ obuchowych plus 2 obrażenia na poziom czarujÄ…cego (maksymalnie +30). Rzut obronny przeciw czarom obniża obrażenia poÅ‚owÄ™.~ +%atsymbol%23=~Lanca zmÄ…cenia~ +%atsymbol%22=~OszoÅ‚omienie~ +%atsymbol%21=~Lodowa lanca +(WywoÅ‚ywanie) +Poziom: 3 +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: natychmiastowy +Czas rzucania: 3 +Obszar dziaÅ‚ania: 1 istota +Rzut obronny: specjalny +Czar ten wystrzeliwuje w kierunku wybranego przez czarodzieja celu magicznÄ… lodowÄ… lancÄ™. Trafia ona automatycznie, zadajÄ…c 5k6 obrażeÅ„ od zimna i zmuszajÄ…c ofiarÄ™ do wykonania rzutu obronnego przeciw czarom, by uniknąć ogÅ‚uszenia na trzy rundy.~ +%atsymbol%20=~Lodowa lanca~ +%atsymbol%19=~Modyfikator zrÄ™cznoÅ›ci~ +%atsymbol%18=~Zwinność kota +(Przemiany) +Poziom: 2 +ZasiÄ™g: dotyk +Czas dziaÅ‚ania: 1 godzina/poziom +Czas rzucania: 2 +Obszar dziaÅ‚ania: 1 istota +Rzut obronny: brak +Po rzuceniu tego zaklÄ™cia ZrÄ™czność wskazanej istoty zostaje w magiczny sposób zwiÄ™kszona o ilość zależnÄ… od jej klasy. Åotrzykowie otrzymujÄ… 1k8 punktów, wojownicy i czarodzieje 1k6 punktów, a kapÅ‚ani 1k4 punkty. JeÅ›li postać posiada wiÄ™cej niż jednÄ… klasÄ™, stosowana jest wyższa kostka. Zwinność kota nie może zwiÄ™kszyć ZrÄ™cznoÅ›ci powyżej 20.~ +%atsymbol%17=~Zwinność kota~ +%atsymbol%16=~Laska mocy~ +%atsymbol%15=~Laska mocy~ +%atsymbol%14=~Laska mocy +(WywoÅ‚ywanie) +Poziom: 2 +ZasiÄ™g: 0 +Czas dziaÅ‚ania: 3 rundy + 1 runda/poziom +Czas rzucania: 2 +Obszar dziaÅ‚ania: rzucajÄ…cy czar +Rzut obronny: brak +ZaklÄ™cie to tworzy w rÄ™ku czarujÄ…cego laskÄ™ mocy. Zadaje ona 1k6 obrażeÅ„ i jest traktowana jak magiczna broÅ„ +1, na potrzeby okreÅ›lenia istot, które może zranić. BroÅ„ ta należy do kategorii kijów, tak wiÄ™c jeÅ›li czarujÄ…cy nie posiada biegÅ‚oÅ›ci w walce tym typem broni, wówczas Laska mocy używana jest z modyfikatorem ujemnym. BroÅ„ ta posiada również moc wysysania z ofiary 1k2 punktów życia po każdym trafieniu. Punkty te sÄ… dodawane do puli czarujÄ…cego, ale mogÄ… one jedynie uleczyć odniesione przez niego obrażenia i nie mogÄ… podnieść iloÅ›ci punktów życia ponad ustalone dla niego maksimum.~ +%atsymbol%13=~Laska mocy~ +%atsymbol%12=~~ +%atsymbol%11=~Lawina Å›nieżnych kul Snilloca +(WywoÅ‚ywanie) +Poziom: 2 +ZasiÄ™g: pole widzenia rzucajÄ…cego czar +Czas dziaÅ‚ania: natychmiastowy +Czas rzucania: 2 +Obszar dziaÅ‚ania: w promieniu 5 metrów +Rzut obronny: 1/2 +Po rzuceniu tego zaklÄ™cia, z wybranego miejsca, znajdujÄ…cego siÄ™ w obrÄ™bie dziaÅ‚ania czaru, wystrzeliwuje chmara kul Å›niegowych. TrafiajÄ… one we wszystko, co znajduje siÄ™ w zasiÄ™gu funkcjonowania efektu, zadajÄ…c 1k3 obrażeÅ„ od zimna na poziom czarujÄ…cego, aż do maksymalnie 8k3 obrażeÅ„ na 8. poziomie. Przeciw istotom posÅ‚ugujÄ…cym siÄ™ ogniem lub zrodzonym z ognia, czar ten zadaje 1k6 obrażeÅ„ na poziom czarujÄ…cego, aż do maksymalnie 8k6 obrażeÅ„ na 8. poziomie.~ +%atsymbol%10=~~ +%atsymbol%9=~Lawina Å›nieżnych kul Snilloca~ +%atsymbol%8=~Oko umysÅ‚u blokuje dziaÅ‚anie efektu, po czym zanika.~ +%atsymbol%7=~Oko miecza blokuje dziaÅ‚anie efektu, po czym zanika.~ +%atsymbol%6=~Oko maga blokuje dziaÅ‚anie efektu, po czym zanika.~ +%atsymbol%5=~Oko jadowe blokuje dziaÅ‚anie efektu, po czym zanika.~ +%atsymbol%4=~Oko duchowe blokuje dziaÅ‚anie efektu, po czym zanika.~ +%atsymbol%3=~Oko hartu ducha blokuje dziaÅ‚anie efektu, po czym zanika.~ +%atsymbol%2=~Oko kamienia blokuje dziaÅ‚anie efektu, po czym zanika.~ +%atsymbol%1=~Wybrana postać zostaÅ‚a uzdrowiona. Przywrócono 11 punktów życia.~ diff --git a/iwdification/dw_iwdspells_resource/tra/ru_ru/iwdspells.tra b/iwdification/dw_iwdspells_resource/tra/ru_ru/iwdspells.tra new file mode 100644 index 0000000..fd7d2f0 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/tra/ru_ru/iwdspells.tra @@ -0,0 +1,1211 @@ +%atsymbol%359=~Отвага~ +%atsymbol%358=~Ðадежда~ +%atsymbol%357=~ÐšÐ¾ÑˆÐ°Ñ‡ÑŒÑ Ð³Ñ€Ð°Ñ†Ð¸Ñ~ +%atsymbol%356=~Праведный гнев верующего~ +%atsymbol%355=~Молитва~ +%atsymbol%354=~ÐšÑ€Ð¾Ð²Ð°Ð²Ð°Ñ ÑроÑÑ‚ÑŒ~ +%atsymbol%353=~ДекламациÑ~ +%atsymbol%352=~ЭкзальтациÑ~ +%atsymbol%351=~Ð–Ð¸Ð²Ð¾Ñ‚Ð½Ð°Ñ ÑроÑÑ‚ÑŒ~ +%atsymbol%350=~Железное тело~ +%atsymbol%349=~Ðаложено окаменение~ +%atsymbol%348=~ÐепреходÑÑ‰Ð°Ñ ÑвÑтоÑÑ‚ÑŒ ума~ +%atsymbol%347=~Боль~ +%atsymbol%346=~Фазирование~ +%atsymbol%345=~Помощь~ +%atsymbol%344=~ЧиÑтый разум~ +%atsymbol%343=~Превращение в ÑÐ»ÐµÐ¼ÐµÐ½Ñ‚Ð°Ð»Ñ Ð·ÐµÐ¼Ð»Ð¸~ +%atsymbol%342=~Превращение в ÑÐ»ÐµÐ¼ÐµÐ½Ñ‚Ð°Ð»Ñ Ð¾Ð³Ð½Ñ~ +%atsymbol%341=~Ð‘Ð¾ÐµÐ²Ð°Ñ Ð¿ÐµÑнь Ситта — Ð‘Ð¾Ð½ÑƒÑ Ðº защите и регенерациÑ~ +%atsymbol%340=~«Военный гимн Ситта» +Ð’Ñе Ñоюзники в радиуÑе 30 футов получают ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ +2 к клаÑÑу защиты, +10% к Ñопротивлению рубÑщему, режущему, дробÑщему и метательному урону, а также ÑпоÑобноÑÑ‚ÑŒ к регенерации 2 пунктов Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ Ð² раунд.~ +%atsymbol%339=~Ð‘Ð¾ÐµÐ²Ð°Ñ Ð¿ÐµÑнь Ситта~ +%atsymbol%338=~Порабощение~ +%atsymbol%337=~Стон Сирены — Порабощает ÑущеÑтва~ +%atsymbol%336=~«Плач Сирены» +Ð’Ñе враги в радиуÑе 30 футов, провалившие ÑпаÑброÑок против заклинаниÑ, завлекаютÑÑ Ð¿Ð»Ð°Ñ‡ÐµÐ¼ и терÑÑŽÑ‚ ÑпоÑобноÑÑ‚ÑŒ дейÑтвовать на протÑжении на 1 раунда, или до Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð¼Ð¸ урона.~ +%atsymbol%335=~Стон Сирены~ +%atsymbol%334=~ПеÑÐ½Ñ ÐšÐ°ÑƒÐ´Ð¸ÐµÑ â€” Сопротивление звуковым атакам~ +%atsymbol%333=~«ПеÑнь КаудиеÑ» +Ð’Ñе Ñоюзники в радиуÑе 30 футов Ñ Ð²ÐµÑ€Ð¾ÑтноÑтью 50% избавлÑÑŽÑ‚ÑÑ Ð¾Ñ‚ воздейÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ð¹ «Тишина», «Крик», «Великий крик», «Приказ», «Великий приказ» и других, ÑвÑзанных Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð½ÐµÑением Ñлов.~ +%atsymbol%332=~ПеÑÐ½Ñ ÐšÐ°ÑƒÐ´Ð¸ÐµÑ~ +%atsymbol%331=~ÐœÐµÐ»Ð¾Ð´Ð¸Ñ Ð¢Ð¸Ð¼Ð¾Ñ€Ñ‹ — Улучшение удачи и навыков~ +%atsymbol%330=~Â«ÐœÐµÐ»Ð¾Ð´Ð¸Ñ Ð¢Ð¸Ð¼Ð¾Ñ€Ñ‹Â» +Ð’Ñе Ñоюзники в радиуÑе 30 футов получают +1 к удаче, +3 к ÑпаÑброÑкам, +10 к знанию легенд, а также +10% ко вÑем воровÑким навыкам.~ +%atsymbol%329=~ÐœÐµÐ»Ð¾Ð´Ð¸Ñ Ð¢Ð¸Ð¼Ð¾Ñ€Ñ‹~ +%atsymbol%328=~Сага о Курране Храброе Сердце — Иммунитет к Ñтраху~ +%atsymbol%327=~«Сага о Курране Храброе Сердце» +Ð’Ñе Ñоюзники в радиуÑе 30 футов избавлÑÑŽÑ‚ÑÑ Ð¾Ñ‚ любого воздейÑÑ‚Ð²Ð¸Ñ Ñтраха и получают к нему иммунитет на Ð²Ñ€ÐµÐ¼Ñ Ð¸ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿ÐµÑни.~ +%atsymbol%326=~Сага о Курране Храброе Сердце~ +%atsymbol%325=~Баллада о трех героÑÑ… — Боевые улучшениÑ~ +%atsymbol%324=~«Баллада о трех героÑх» +Ð’Ñе Ñоюзники в радиуÑе 30 футов получают +1 к броÑкам атаки, +1 к урону и +1 ко вÑем ÑпаÑброÑкам.~ +%atsymbol%323=~Баллада о трех героÑÑ…~ +%atsymbol%322=~ИÑпуÑкает киÑлотное облако~ +%atsymbol%321=~Страдает от отмираниÑ~ +%atsymbol%320=~Отмирание +(ÐекромантиÑ) +Уровень: 7 +Сфера: ИÑцеление +ДальноÑÑ‚ÑŒ: каÑание +ДлительноÑÑ‚ÑŒ: 1 раунд/2 ÑƒÑ€Ð¾Ð²Ð½Ñ +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 7 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: одно ÑущеÑтво +СпаÑброÑок: отменÑет дейÑтвие +Это мощное заклинание при каÑании вызывает поÑтепенное отмирание внутренних органов цели. Ð’ конце концов органы могут отказать ÑовÑем, еÑли цель не Ñделает уÑпешный ÑпаÑброÑок против Ñмерти Ñ ÑƒÑ…ÑƒÐ´ÑˆÐµÐ½Ð¸ÐµÐ¼ −4. Жертва терÑет 3 пункта Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ Ð² Ñекунду. Заклинание длитÑÑ 1 раунд на каждые 2 ÑƒÑ€Ð¾Ð²Ð½Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ, или пока не будет развеÑно. Ðапример, заклинание, прочитанное жрецом 14 уровнÑ, Ñнимает Ñ Ð¶ÐµÑ€Ñ‚Ð²Ñ‹ по 18 пунктов Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ Ð·Ð° каждый из 7 раундов. Это заклинание не дейÑтвует на нежить, механизмы и ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… планов. Оно доÑтупно только перÑонажам Ñо злым мировоззрением.~ +%atsymbol%319=~Отмирание~ +%atsymbol%318=~РаÑпев +(Вызывание/Призывание) +Уровень: 2 +Сфера: Бой +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: 1 ход +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 9 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: в радиуÑе 60 футов +СпаÑброÑок: нет +Жрец взывает к оÑобому раÑположению Ð´Ð»Ñ ÑÐµÐ±Ñ Ð¸ Ñвоей группы, а также причинÑет вред противникам. ПоÑле его Ð¿Ñ€Ð¾Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð²Ñе дружеÑтвенные заклинателю ÑущеÑтва в облаÑти дейÑÑ‚Ð²Ð¸Ñ Ð¿Ð¾Ð»ÑƒÑ‡Ð°ÑŽÑ‚ ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ +1 к ÑпаÑброÑкам, броÑкам атаки, броÑкам лечениÑ, минимальному урону. Кроме того, броÑки урона любых Ñффектов, направленные на объект, находÑщийÑÑ Ð¿Ð¾Ð´ дейÑтвием Ñтого заклинаниÑ, за иÑключением базового урона Ð¾Ñ€ÑƒÐ¶Ð¸Ñ ÑƒÐ¼ÐµÐ½ÑŒÑˆÐ°ÑŽÑ‚ÑÑ Ð½Ð° 1. Ðапример, «Огненный шар» вмеÑто 6d6 урона от Ð¾Ð³Ð½Ñ Ð±ÑƒÐ´ÐµÑ‚ причинÑÑ‚ÑŒ только 6d5, а пылающий длинный меч, который наноÑит 1d8+2 рубÑщего и 1d3 огненного урона, будет наноÑить только 1d8+2 рубÑщего и 1d5 огненного урона. Враги жреца получают противоположный Ñффект ко вÑем аналогичным параметрам. +Многократные Ñффекты Ñтого Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð½Ðµ ÑуммируютÑÑ. Это заклинание требует от Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ концентрации, так что жрец не Ñможет иÑпользовать другие Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð²Ð¾ Ð²Ñ€ÐµÐ¼Ñ Ñ€Ð°Ñпева, а ÑкороÑÑ‚ÑŒ его Ð¿ÐµÑ€ÐµÐ´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ ÑƒÐ¼ÐµÐ½ÑŒÑˆÐ°ÐµÑ‚ÑÑ Ð²Ð´Ð²Ð¾Ðµ.~ +%atsymbol%317=~РаÑпев~ +%atsymbol%316=~Fart Repellent for Bombardier Beetles. +Do not translate~ +%atsymbol%315=~Жук-точильщик~ +%atsymbol%314=~Жук-точильщик~ +%atsymbol%313=~Жук-бомбардир~ +%atsymbol%312=~Жук-бомбардир~ +%atsymbol%311=~ГигантÑкое наÑекомое +(Изменение) +Уровень: 4 +Сфера: Животные +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: 8 чаÑов +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 7 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: оÑÐ¾Ð±Ð°Ñ +СпаÑброÑок: нет +Призывает двух или трех жуков, точильщиков или бомбардиров, которые будут ÑражатьÑÑ Ð½Ð° Ñтороне Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ Ð´Ð¾ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ñрока дейÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ пока не будут убиты.~ +%atsymbol%310=~ГигантÑкое наÑекомое~ +%atsymbol%309=~ÐанеÑти критичеÑкие раны +(ÐекромантиÑ) +Уровень: 5 +Сфера: ИÑцеление +ДальноÑÑ‚ÑŒ: каÑание +ДлительноÑÑ‚ÑŒ: мгновенно +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 8 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: одно ÑущеÑтво +СпаÑброÑок: Ñнижает урон вдвое +Прочитав заклинание и дотронувшиÑÑŒ до ÑущеÑтва, жрец наноÑит ему 27 единиц урона (половину при уÑпешном ÑпаÑброÑке против заклинаниÑ). Это заклинание не дейÑтвует на нежить, механизмы и ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… планов. Оно доÑтупно только злым перÑонажам.~ +%atsymbol%308=~ÐанеÑти критичеÑкие раны~ +%atsymbol%307=~ÐанеÑти Ñерьезные раны +(ÐекромантиÑ) +Уровень: 4 +Сфера: ИÑцеление +ДальноÑÑ‚ÑŒ: каÑание +ДлительноÑÑ‚ÑŒ: мгновенно +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 5 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: одно ÑущеÑтво +СпаÑброÑок: Ñнижает урон вдвое +Прочитав заклинание и дотронувшиÑÑŒ до ÑущеÑтва, жрец наноÑит ему 17 единиц урона (половину при уÑпешном ÑпаÑброÑке против заклинаниÑ). Это заклинание не дейÑтвует на нежить, механизмы и ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… планов. Оно недоÑтупно добрым перÑонажам.~ +%atsymbol%306=~ÐанеÑти Ñерьезные раны~ +%atsymbol%305=~Откачано два уровнÑ~ +%atsymbol%304=~Отток Ñнергии +(ÐекромантиÑ) +Уровень: 7 +Сфера: ÐÐµÐºÑ€Ð¾Ð¼Ð°Ð½Ñ‚Ð¸Ñ +ДальноÑÑ‚ÑŒ: каÑание +ДлительноÑÑ‚ÑŒ: поÑтоÑнно +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 3 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: одно ÑущеÑтво +СпаÑброÑок: нет +Открывает канал между планом, на котором находитÑÑ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»ÑŒ, и Планом Ðегативной Энергии. Сам заклинатель ÑтановитÑÑ ÑвÑзующим звеном, Ð¾Ñ‚ÐºÐ°Ñ‡Ð¸Ð²Ð°Ñ Ð¸ переправлÑÑ Ð¶Ð¸Ð·Ð½ÐµÐ½Ð½ÑƒÑŽ Ñилу жертвы на План Ðегативной Энергии, таким образом, Ð»Ð¸ÑˆÐ°Ñ ÐµÐµ двух уровней опыта. Уровни терÑÑŽÑ‚ÑÑ Ð½Ð°Ð²Ñегда вмеÑте Ñ Ð¿ÑƒÐ½ÐºÑ‚Ð°Ð¼Ð¸ Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ Ð¸ полученными ÑпоÑобноÑÑ‚Ñми. Вернуть вÑÑ‘ Ñто можно только Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ жречеÑкого Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Â«Ð’Ð¾ÑÑтановление». Это заклинание не дейÑтвует на нежить, механизмы и ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… планов. Оно доÑтупно только перÑонажам Ñо злым мировоззрением.~ +%atsymbol%303=~Отток Ñнергии~ +%atsymbol%302=~Запутывание~ +%atsymbol%301=~ÐŸÐ¾Ð»Ð·ÑƒÑ‡Ð°Ñ ÐºÑƒÑ‡Ð°~ +%atsymbol%300=~ÐŸÐ¾Ð»Ð·ÑƒÑ‡Ð°Ñ ÐºÑƒÑ‡Ð°~ +%atsymbol%299=~ПреÑледователь +(Вызывание) +Уровень: 7 +Сфера: РаÑÑ‚ÐµÐ½Ð¸Ñ +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: 8 чаÑов +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 9 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: оÑÐ¾Ð±Ð°Ñ +СпаÑброÑок: нет +ПоÑвлÑÑŽÑ‚ÑÑ Ð´Ð²Ðµ ползучие кучи Ñ ÑƒÑ€Ð¾Ð²Ð½ÐµÐ¼ Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ 11, которые охотно помогают заклинателю в бою и выполнÑÑŽÑ‚ любые приказы, которые Ñмогут.~ +%atsymbol%298=~ПреÑледователь~ +%atsymbol%297=~Туман Эльдат +(ПроÑвление) +Уровень: 7 +Сфера: Ð¡Ñ‚Ð¸Ñ…Ð¸Ñ +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: мгновенно +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 9 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: в радиуÑе 7 футов +СпаÑброÑок: нет +ОблаÑÑ‚ÑŒ дейÑÑ‚Ð²Ð¸Ñ Ð¾ÐºÑƒÑ‚Ñ‹Ð²Ð°ÐµÑ‚ ÑеребриÑто-голубой туман. Ð’Ñе ÑущеÑтва в тумане избавлÑÑŽÑ‚ÑÑ Ð¾Ñ‚ болезней и Ñдов и воÑÑтанавливают по 25 пунктов здоровьÑ.~ +%atsymbol%296=~Туман Эльдат~ +%atsymbol%295=~Великий щит Латандера +(Вызывание) +Уровень: 7 +Сфера: Охрана +ДальноÑÑ‚ÑŒ: каÑание +ДлительноÑÑ‚ÑŒ: 3 раунда +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 9 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: одно ÑущеÑтво +СпаÑброÑок: нет +Ðа Ð²Ñ€ÐµÐ¼Ñ Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ñ†ÐµÐ»ÑŒ неуÑзвима Ð´Ð»Ñ Ð»ÑŽÐ±Ð¾Ð³Ð¾ урона и получает 100% Ñопротивление магии. Злые ÑущеÑтва не могут быть защищены Ñтим заклинанием. «Великий щит Латандера» могут читать только добрые перÑонажи.~ +%atsymbol%294=~Великий щит Латандера~ +%atsymbol%293=~Уничтожение +(ÐекромантиÑ) +Уровень: 7 +Сфера: ИÑцеление +ДальноÑÑ‚ÑŒ: каÑание +ДлительноÑÑ‚ÑŒ: мгновенно +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 9 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: на ÑÐµÐ±Ñ +СпаÑброÑок: оÑобый +Цель моментально уничтожаетÑÑ, разлетаÑÑÑŒ на мелкие куÑочки. Удачный ÑпаÑброÑок против Ñмерти Ñ ÑƒÑ…ÑƒÐ´ÑˆÐµÐ½Ð¸ÐµÐ¼ −4 позволÑет избежать ÑƒÐ½Ð¸Ñ‡Ñ‚Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¸ получить 8d6 единиц магичеÑкого урона. Это заклинание могут читать только злые перÑонажи. Обратите внимание, что перÑонаж, убитый «Уничтожением», не Ñможет воÑÑтать из мертвых под дейÑтвием заклинаний «Оживление» или «ВоÑкрешение».~ +%atsymbol%292=~Уничтожение~ +%atsymbol%291=~Заклинание не подейÑтвовало~ +%atsymbol%290=~ÐÐµÐ¿Ñ€Ð¾Ð½Ð¸Ñ†Ð°ÐµÐ¼Ð°Ñ Ñ‡Ð¸Ñтота разума +(Ограждение) +Уровень: 7 +Сфера: Защита +ДальноÑÑ‚ÑŒ: 0 +ДлительноÑÑ‚ÑŒ: 1 ход/уровень +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 9 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: на ÑÐµÐ±Ñ +СпаÑброÑок: нет +УкреплÑет разум заклинателÑ, Ð·Ð°Ñ‰Ð¸Ñ‰Ð°Ñ ÐµÐ³Ð¾ от внешних воздейÑтвий. Во Ð²Ñ€ÐµÐ¼Ñ Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¾Ð½ не подвергаетÑÑ Ð¾Ñ‡Ð°Ñ€Ð¾Ð²Ð°Ð½Ð¸ÑŽ, замешательÑтву, Ñтраху, Ñлабоумию, удержанию, уÑыплению, попаданию в лабиринт, ÑоÑтоÑнию берÑерка и опьÑнению. ~ +%atsymbol%289=~ÐÐµÐ¿Ñ€Ð¾Ð½Ð¸Ñ†Ð°ÐµÐ¼Ð°Ñ Ñ‡Ð¸Ñтота разума~ +%atsymbol%288=~Символ: БезнадежноÑÑ‚ÑŒ +(Вызывание/Призывание) +Уровень: 7 +Сфера: Охрана +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: 2 хода +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 3 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: в радиуÑе 15 футов +СпаÑброÑок: отменÑет дейÑтвие +Это мощное заклинание, которое позволÑет жрецу начертить Ñимвол на земле или другой поверхноÑти. Символ оÑтаетÑÑ Ð½Ð° меÑте до тех пор, пока кто-нибудь не подойдет к нему Ñлишком близко, поÑле чего он взрываетÑÑ, и вÑе в облаÑти его дейÑтвиÑ, кто провалит ÑпаÑброÑок против Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ñ ÑƒÑ…ÑƒÐ´ÑˆÐµÐ½Ð¸ÐµÐ¼ −2, оÑтанавливаютÑÑ, мучаÑÑÑŒ унынием и Ñознанием безыÑходноÑти. Они никак не будут защищатьÑÑ Ð¾Ñ‚ нападениÑ. Ð’ момент Ð¿Ñ€Ð¾Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñет вÑе Ñффекты Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Â«Ð­Ð¼Ð¾Ñ†Ð¸Ñ: Ðадежда» в облаÑти дейÑтвиÑ.~ +%atsymbol%287=~Символ: БезнадежноÑÑ‚ÑŒ~ +%atsymbol%286=~УжаÑные боли~ +%atsymbol%285=~Символ: Боль +(Вызывание/Призывание) +Уровень: 7 +Сфера: Охрана +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: 11 ходов +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 3 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: в радиуÑе 15 футов +СпаÑброÑок: отменÑет дейÑтвие +Ð’Ñе враги в пределах 15 футов от Ñимвола боли должны Ñделать ÑпаÑброÑок против заклинаниÑ. Провалив ÑпаÑброÑок, они мучаютÑÑ Ñтрашной болью и получают ухудшение −4 к броÑкам на атаку, а ловкоÑÑ‚ÑŒ и клаÑÑ Ð·Ð°Ñ‰Ð¸Ñ‚Ñ‹ у них ÑнижаютÑÑ Ð½Ð° 2.~ +%atsymbol%284=~Символ: Боль~ +%atsymbol%283=~Духовный гнев +(ПроÑвление) +Уровень: 6 +Сфера: Бой +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: мгновенно +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 2 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: оÑÐ¾Ð±Ð°Ñ +СпаÑброÑок: Ñнижает урон вдвое +Ð’ теле жреца концентрируетÑÑ Ð´ÑƒÑ…Ð¾Ð²Ð½Ð°Ñ Ð¼Ð¾Ñ‰ÑŒ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð·Ð°Ñ‚ÐµÐ¼ вылетает в четырех направлениÑÑ…, как разрÑды молнии. Любое ÑущеÑтво на пути у разрÑда получает 4d10 единиц урона магией (вдвое меньше при удачном ÑпаÑброÑке). СущеÑтва, разделÑющие Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»ÐµÐ¼ моральные ÑƒÐ±ÐµÐ¶Ð´ÐµÐ½Ð¸Ñ (добрые, нейтральные, злые), не подвержены дейÑтвию заклинаниÑ.~ +%atsymbol%282=~Духовный гнев~ +%atsymbol%281=~Вихрь +(ПроÑвление) +Уровень: 6 +Сфера: Ð¡Ñ‚Ð¸Ñ…Ð¸Ñ (Воздух) +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: оÑÐ¾Ð±Ð°Ñ +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 9 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: оÑÐ¾Ð±Ð°Ñ +СпаÑброÑок: оÑобый +Около Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ Ð¿Ð¾ÑвлÑетÑÑ Ð½ÐµÐ±Ð¾Ð»ÑŒÑˆÐ¾Ð¹ вихрь, который можно отправить в любую точку в поле зрениÑ. ДоÑтигнув Ñтой точки, вихрь выходит из-под ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ Ð¸ начинает беÑпорÑдочно кружить, Ð¿Ð¾Ñ€Ð°Ð¶Ð°Ñ Ð²Ñех подрÑд. Его дейÑтвию не подвергаетÑÑ Ñам заклинатель, а также Ñлементали и другие огромные ÑущеÑтва. Любой, кто окажетÑÑ Ð½Ð° пути у вихрÑ, получает 2d8 дробÑщего и 2d8 рубÑщего урона, а при неудачном ÑпаÑброÑке против Ð¾Ñ€ÑƒÐ¶Ð¸Ñ Ð´Ñ‹Ñ…Ð°Ð½Ð¸Ñ ÐµÑ‰Ðµ и Ñтрадает от контузии на 2 раунда. СущеÑтва Ñ ÑƒÑ€Ð¾Ð²Ð½ÐµÐ¼ Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ Ð½Ðµ выше 2 автоматичеÑки погибают. Вихрь поражает не более 8 целей, а затем раÑÑеиваетÑÑ.~ +%atsymbol%280=~Вихрь~ +%atsymbol%279=~Щит Ñнтропии +(Отречение) +Уровень: 6 +Сфера: Защита +ДальноÑÑ‚ÑŒ: 0 +ДлительноÑÑ‚ÑŒ: 1 раунд/уровень +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 9 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: на ÑÐµÐ±Ñ +СпаÑброÑок: нет +Ð—Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ Ð¾ÐºÑ€ÑƒÐ¶Ð°ÐµÑ‚ защитный ÑнергетичеÑкий вихрь, который поглощает или отражает большую чаÑÑ‚ÑŒ атак. Жрец получает улучшение +6 к клаÑÑу защиты и 50% Ñопротивление к ÑлектричеÑкому, огненному, холодному и киÑлотному урону. Кроме того, заклинатель ÑтановитÑÑ Ð½ÐµÑƒÑзвим к «Пламенному удару» и вÑем ÑнарÑдам, в том чиÑле магичеÑким.~ +%atsymbol%278=~Щит Энтропии~ +%atsymbol%277=~ÐанеÑти множеÑтвенные легкие раны +(ÐекромантиÑ) +Уровень: 5 +Сфера: ИÑцеление +ДальноÑÑ‚ÑŒ: 0 +ДлительноÑÑ‚ÑŒ: мгновенно +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 5 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: в радиуÑе 15 футов +СпаÑброÑок: Ñнижает урон вдвое +Жрец наноÑит врагам Ñ€Ñдом 1d8 единиц урона + 1 единица за каждый уровень заклинателÑ. УÑпешный ÑпаÑброÑок против Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ñнижает урон вдвое. Эта заклинание не дейÑтвует на нежить, механизмы и ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… планов. Оно доÑтупно только перÑонажам Ñо злым мировоззрением.~ +%atsymbol%276=~ÐанеÑти множеÑтвенные легкие раны~ +%atsymbol%275=~Ð–Ð¸Ð²Ð¾Ñ‚Ð½Ð°Ñ ÑроÑÑ‚ÑŒ +(Зачарование) +Уровень: 5 +Сфера: Бой +ДальноÑÑ‚ÑŒ: каÑание +ДлительноÑÑ‚ÑŒ: 15 раундов +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 8 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: одно ÑущеÑтво +СпаÑброÑок: нет +Цель ÑтановитÑÑ Ñвирепой, Ñловно дикий зверь. Ее Ñила возраÑтает до 19, она получает 20 дополнительных пунктов здоровьÑ, прибавку +20% к ÑкороÑти Ð¿ÐµÑ€ÐµÐ´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¸ +2 ко вÑем ÑпаÑброÑкам. Ðа Ð²Ñ€ÐµÐ¼Ñ Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ñ†ÐµÐ»ÑŒ терÑет ÑпоÑобноÑÑ‚ÑŒ колдовать. Ее можно нормально контролировать, пока в ее поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð½Ðµ попадет враг. Тогда цель тут же атакует его в ближнем бою, пользуÑÑÑŒ тем оружием, что держит в руках. С вероÑтноÑтью 5% каждый раунд цель может впаÑÑ‚ÑŒ в ÑоÑтоÑние берÑерка и Ñтанет нападать на вÑех подрÑд.~ +%atsymbol%274=~Ð–Ð¸Ð²Ð¾Ñ‚Ð½Ð°Ñ ÑроÑÑ‚ÑŒ~ +%atsymbol%273=~Оберег от нежити +(ÐекромантиÑ) +Уровень: 5 +Сфера: Опека +ДальноÑÑ‚ÑŒ: 0 +ДлительноÑÑ‚ÑŒ: 1 ход +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 7 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: в радиуÑе 10 футов +СпаÑброÑок: нет +УÑиливает воздейÑтвие жреца на нежить в той облаÑти, где было прочитано. Оно изгонÑет любую нежить, вошедшую в Ñту облаÑÑ‚ÑŒ, как еÑли бы Ñто делал Ñам жрец. ПоÑле неудачной попытки Ð¸Ð·Ð³Ð½Ð°Ð½Ð¸Ñ Ñто заклинание переÑтает влиÑÑ‚ÑŒ на неживое Ñоздание, еÑли только оно не покинет облаÑÑ‚ÑŒ дейÑÑ‚Ð²Ð¸Ñ Ð¸ не войдет в нее Ñнова.~ +%atsymbol%272=~Оберег от нежити~ +%atsymbol%271=~Щит Латандера +(Вызывание) +Уровень: 5 +Сфера: Охрана +ДальноÑÑ‚ÑŒ: каÑание +ДлительноÑÑ‚ÑŒ: 2 раунда +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 8 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: одно ÑущеÑтво +СпаÑброÑок: нет +Ðа Ð²Ñ€ÐµÐ¼Ñ Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ñ†ÐµÐ»ÑŒ ÑтановитÑÑ Ð½ÐµÑƒÑзвима Ð´Ð»Ñ Ð»ÑŽÐ±Ð¾Ð³Ð¾ урона. Злые ÑущеÑтва не могут быть защищены Ñтим заклинанием. «Щит Латандера» могут читать только добрые и нейтральные перÑонажи.~ +%atsymbol%270=~Щит Латандера~ +%atsymbol%269=~ШипаÑтые камни +(Изменение, Зачарование) +Уровень: 5 +Сфера: Ð¡Ñ‚Ð¸Ñ…Ð¸Ñ (ЗемлÑ) +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: 12 раундов +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 6 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: в радиуÑе 8 футов +СпаÑброÑок: оÑобый +ИзменÑет камни вокруг, Ð¿Ñ€ÐµÐ²Ñ€Ð°Ñ‰Ð°Ñ Ð¸Ñ… в оÑтрые шипы, торчащие из земли. Любое ÑущеÑтво, Ð·Ð°Ñ…Ð¾Ð´Ñ Ð² зону поражениÑ, получает 2d4 колющего урона каждый раунд, а еÑли ему не удаетÑÑ ÑпаÑброÑок против заклинаниÑ, то ÑкороÑÑ‚ÑŒ его Ð¿ÐµÑ€ÐµÐ´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð°Ð´Ð°ÐµÑ‚ на 30%.~ +%atsymbol%268=~ШипаÑтые камни~ +%atsymbol%267=~Праведный гнев верующего +(Зачарование/Очарование) +Уровень: 5 +Сфера: Бой +ДальноÑÑ‚ÑŒ: 0 +ДлительноÑÑ‚ÑŒ: 1 раунд/уровень +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 8 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: в радиуÑе 17 футов +СпаÑброÑок: нет +Приводит Ñоюзников жреца в ÑоÑтоÑние Ñвоеобразного религиозного ÑкÑтаза, улучшающего их ÑпоÑобноÑти в бою. Ð’Ñе Ñоюзники жреца, попавшие в облаÑÑ‚ÑŒ дейÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ, получают улучшение +1 к броÑкам на атаку и ÑпаÑброÑкам, а также 8 дополнительных пунктов Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ (здоровье может превыÑить нормальный макÑимум). ПерÑонажи одного Ð¼Ð¸Ñ€Ð¾Ð²Ð¾Ð·Ð·Ñ€ÐµÐ½Ð¸Ñ Ñо жрецом получают дополнительную атаку за раунд и улучшение +2 к броÑкам на атаку, урон и ÑпаÑброÑкам. ПоÑле Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ñрока дейÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð²Ñе, на кого оно дейÑтвовало, чувÑтвуют уÑталоÑÑ‚ÑŒ.~ +%atsymbol%266=~Праведный гнев верующего~ +%atsymbol%265=~Стена лунного Ñвета +(ПроÑвление) +Уровень: 4 +Сфера: Защита, Солнце +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: 1 ход +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 7 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: Ñтена длиной в 8 футов и шириной в 5 футов +СпаÑброÑок: нет +Ð’ указанном меÑте поÑвлÑетÑÑ Ð¼ÐµÑ€Ñ†Ð°ÑŽÑ‰Ð°Ñ ÑнергетичеÑÐºÐ°Ñ Ð·Ð°Ð²ÐµÑа бело-Ñиней раÑцветки. Стена неоÑÑзаема, не требует привÑзки к материальному предмету, Ñквозь нее можно без труда пройти. Злые ÑущеÑтва при проходе Ñквозь Ñтену получают 2d10 единиц магичеÑкого урона, а Ð·Ð»Ð°Ñ Ð½ÐµÐ¶Ð¸Ñ‚ÑŒ — 5d10 единиц. Урон наноÑитÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ при первом переÑечении Ñтены.~ +%atsymbol%264=~Стена лунного Ñвета~ +%atsymbol%263=~Колючие брызги +(Изменение) +Уровень: 4 +Сфера: РаÑÑ‚ÐµÐ½Ð¸Ñ +ДальноÑÑ‚ÑŒ: 30 футов +ДлительноÑÑ‚ÑŒ: мгновенно +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 3 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: 90-градуÑный ÐºÐ¾Ð½ÑƒÑ Ð² 17 футов +СпаÑброÑок: Ñнижает урон вдвое +Заклинатель выбраÑывает из рук множеÑтво шипов, колючек и иголок. Они разлетаютÑÑ Ð² пределах конуÑа длиной в 17 футов, наноÑÑ Ð²Ñем ÑущеÑтвам в облаÑти дейÑÑ‚Ð²Ð¸Ñ 2d10 единиц колющего урона (половину при уÑпешном ÑпаÑброÑке против Ñмерти).~ +%atsymbol%262=~Колючие брызги~ +%atsymbol%261=~Без ÑознаниÑ~ +%atsymbol%260=~Ð¡Ð¾ÐºÑ€ÑƒÑˆÐ¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð²Ð¾Ð»Ð½Ð° +(ПроÑвление) +Уровень: 4 +Сфера: Ð¡Ñ‚Ð¸Ñ…Ð¸Ñ (Вода) +ДальноÑÑ‚ÑŒ: 100 футов +ДлительноÑÑ‚ÑŒ: мгновенно +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 9 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: оÑÐ¾Ð±Ð°Ñ +СпаÑброÑок: оÑобый +Ð’ направлении, указанном заклинателем, движетÑÑ Ð¼Ð¾Ñ‰Ð½Ð°Ñ Ð²Ð¾Ð»Ð½Ð° воды, ÑÐ¼ÐµÑ‚Ð°Ñ Ð²ÑÑ‘ на Ñвоем пути. Волна наноÑит 4d10 дробÑщего урона, а также может контузить ÑущеÑтво на 2 раунда (вероÑтноÑÑ‚ÑŒ 25%) или лишить ÑÐ¾Ð·Ð½Ð°Ð½Ð¸Ñ (вероÑтноÑÑ‚ÑŒ 5%). УÑпешный ÑпаÑброÑок против Ð¾Ñ€ÑƒÐ¶Ð¸Ñ Ð´Ñ‹Ñ…Ð°Ð½Ð¸Ñ Ð½Ð°Ð¿Ð¾Ð»Ð¾Ð²Ð¸Ð½Ñƒ Ñнижает урон и позволÑет избежать контузии и потери ÑознаниÑ.~ +%atsymbol%259=~Ð¡Ð¾ÐºÑ€ÑƒÑˆÐ¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð²Ð¾Ð»Ð½Ð°~ +%atsymbol%258=~Дубинка из звездного металла~ +%atsymbol%257=~Дубинка из звездного металла~ +%atsymbol%256=~Дубинка из звездного металла +(Вызывание) +Уровень: 4 +Сфера: Бой +ДальноÑÑ‚ÑŒ: 0 +ДлительноÑÑ‚ÑŒ: 3 хода +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 7 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: на ÑÐµÐ±Ñ +СпаÑброÑок: нет +Ð’ руке Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ Ð¿Ð¾ÑвлÑетÑÑ Ð²Ð¾Ð»ÑˆÐµÐ±Ð½Ð°Ñ Ð´ÑƒÐ±Ð¸Ð½ÐºÐ° из метеоритного железа, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð½Ð°Ð½Ð¾Ñит 1d6+2 единиц дробÑщего урона, дает улучшение +2 к атаке и урону. При определении, каких ÑущеÑтв можно ей поразить, она раÑцениваетÑÑ ÐºÐ°Ðº оружие Ñ Ð·Ð°Ñ‡Ð°Ñ€Ð¾Ð²Ð°Ð½Ð¸ÐµÐ¼ +4. ДейÑтвуют вÑе ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ Ð¸ ÑƒÑ…ÑƒÐ´ÑˆÐµÐ½Ð¸Ñ Ð¿Ð¾ Ñиле, навыкам и Ñпециализации. ПротивоеÑтеÑтвенным ÑущеÑтвам (нежити, ÑлементалÑм, големам, ÑущеÑтвам Ñ Ð²Ð½ÐµÑˆÐ½Ð¸Ñ… планов и так далее) дубинка дополнительно наноÑит 2d6 дробÑщего урона.~ +%atsymbol%255=~Дубинка из звездного металла~ +%atsymbol%254=~Ð‘ÐµÐ·ÑƒÐ¿Ñ€ÐµÑ‡Ð½Ð°Ñ Ð²Ñ‹Ð½Ð¾ÑливоÑÑ‚ÑŒ +(ÐекромантиÑ) +Уровень: 4 +Сфера: ÐÐµÐºÑ€Ð¾Ð¼Ð°Ð½Ñ‚Ð¸Ñ +ДальноÑÑ‚ÑŒ: каÑание +ДлительноÑÑ‚ÑŒ: мгновенно +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 9 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: одно ÑущеÑтво +СпаÑброÑок: нет +ПрикоÑнувшиÑÑŒ к цели, заклинатель возвращает ей Ñилы, пропавшие от уÑталоÑти.~ +%atsymbol%253=~Ð‘ÐµÐ·ÑƒÐ¿Ñ€ÐµÑ‡Ð½Ð°Ñ Ð²Ñ‹Ð½Ð¾ÑливоÑÑ‚ÑŒ~ +%atsymbol%252=~Чумное облако +(Изменение) +Уровень: 4 +Сфера: Бой, Ð¡Ñ‚Ð¸Ñ…Ð¸Ñ (Воздух) +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: 4 раунда +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 7 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: в радиуÑе 12 футов +СпаÑброÑок: отменÑет дейÑтвие +Воздух в облаÑти дейÑÑ‚Ð²Ð¸Ñ Ð¿Ñ€ÐµÐ²Ñ€Ð°Ñ‰Ð°ÐµÑ‚ÑÑ Ð² тошнотворные Ñероватые клубы тумана. Облако не влиÑет на Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ Ð¸ неживых ÑущеÑтв. Каждый раунд, проведенный в зараженном облаке, жертва получает 3 единицы магичеÑкого урона, терÑет по 3 единицы Ñилы и ловкоÑти и Ñлепнет. Эти Ñффекты ÑохранÑÑŽÑ‚ÑÑ Ð½Ð° 1 ход. Это заклинание могут читать только злые перÑонажи.~ +%atsymbol%251=~Чумное облако~ +%atsymbol%250=~ÐанеÑти контузию~ +%atsymbol%249=~Пункты Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ Ð²Ð¾ÑÑтановлены~ +%atsymbol%248=~ÐšÑ€Ð¾Ð²Ð°Ð²Ð°Ñ ÑроÑÑ‚ÑŒ +(Изменение) +Уровень: 4 +Сфера: Бой +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: 2 хода +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 7 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: одно ÑущеÑтво +СпаÑброÑок: нет +ДейÑтвует только на перÑонажей игрока или их Ñоюзников. Цель впадает в ÑоÑтоÑние берÑерка, атакует ближайшее ÑущеÑтво, пока оно не погибнет, а затем переходит к Ñледующему. Заклинание делает цель неуÑзвимой Ð´Ð»Ñ Ð¾Ñ‡Ð°Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ, Ñна, Ñтраха, удержаниÑ, контузии, замешательÑтва, заклинаниÑм Ñимволов и Ñмоций и аналогичного воздейÑтвиÑ. Также цель получает ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ +2 к атаке, +3 к урону и 10 дополнительных пунктов здоровьÑ, увеличиваетÑÑ ÐµÐµ ÑкороÑÑ‚ÑŒ передвижениÑ, а Ñила возраÑтает на 2. Ðо у Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ ÐµÑÑ‚ÑŒ и недоÑтатки. Оно не позволÑет Ñледить за уровнем Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ Ñ†ÐµÐ»Ð¸ и лечить ее. По окончании дейÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ñ†ÐµÐ»ÑŒ ощущает уÑталоÑÑ‚ÑŒ, а ее Ñила на 2 хода ÑнижаетÑÑ Ð´Ð¾ 3. Â«ÐšÑ€Ð¾Ð²Ð°Ð²Ð°Ñ ÑроÑть» не дейÑтвует на законопоÑлушных ÑущеÑтв, и читать ее могут только нейтральные и хаотичные перÑонажи.~ +%atsymbol%247=~ÐšÑ€Ð¾Ð²Ð°Ð²Ð°Ñ ÑроÑÑ‚ÑŒ~ +%atsymbol%246=~Ð”ÐµÐºÐ»Ð°Ð¼Ð°Ñ†Ð¸Ñ +(Ограждение, ПроÑвление/Воплощение) +Уровень: 4 +Сфера: Бой +ДальноÑÑ‚ÑŒ: 0 +ДлительноÑÑ‚ÑŒ: 1 раунд/уровень +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 7 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: в радиуÑе 25 футов +СпаÑброÑок: нет +Ð”ÐµÐºÐ»Ð°Ð¼Ð¸Ñ€ÑƒÑ Ð¾Ñ‚Ñ€Ñ‹Ð²Ð¾Ðº ÑвÑщенного текÑта или гимн, жрец призывает на ÑÐµÐ±Ñ Ð¸ Ñоюзников благоÑловение Ñвоего божеÑтва, одновременно Ð¿Ð¾Ð²ÐµÑ€Ð³Ð°Ñ Ð¿Ñ€Ð¾Ñ‚Ð¸Ð²Ð½Ð¸ÐºÐ¾Ð² в ÑмÑтение и оÑлаблÑÑ Ð¸Ñ…. Жрец и его Ñоюзники делают атаки и ÑпаÑброÑки Ñ ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸ÐµÐ¼ +2, а враги — Ñ ÑƒÑ…ÑƒÐ´ÑˆÐµÐ½Ð¸ÐµÐ¼ −2. Это заклинание не отменÑет Ñффект «Молитвы» — их можно применить вмеÑте, и воздейÑтвие будет ÑкладыватьÑÑ.~ +%atsymbol%245=~ДекламациÑ~ +%atsymbol%244=~ЭлектроÑтатичеÑкий разрÑд~ +%atsymbol%243=~СтатичеÑкий разрÑд +(Изменение) +Уровень: 4 +Сфера: Погода +ДальноÑÑ‚ÑŒ: 0 +ДлительноÑÑ‚ÑŒ: 1 ход/уровень +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 9 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +СпаÑброÑок: Ñнижает урон вдвое +Это заклинание дейÑтвует примерно так же, как заклинание «Вызвать молнию», но его можно иÑпользовать в помещении. Оно окружает каждое ÑущеÑтво в облаÑти дейÑÑ‚Ð²Ð¸Ñ ÑтатичеÑким зарÑдом, который наноÑит урон ÑлектричеÑтвом, 2d8 Ð¿Ð»ÑŽÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾ 1d8 на каждый уровень опыта заклинателÑ. Ð’ течение вÑего Ñрока дейÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ñ€Ð°Ð·Ñ€Ñд бьет каждый ход.~ +%atsymbol%242=~СтатичеÑкий разрÑд~ +%atsymbol%241=~Сотворить огонь +(Изменение) +Уровень: 4 +Сфера: Ð¡Ñ‚Ð¸Ñ…Ð¸Ñ (Огонь) +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: 1 раунд +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 7 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: в радиуÑе 4 футов +СпаÑброÑок: нет +Из указанной заклинателем точки вырываетÑÑ Ð¾Ð³Ð¾Ð½ÑŒ, который наноÑит вÑем ÑущеÑтвам в облаÑти дейÑÑ‚Ð²Ð¸Ñ 1d4 единиц урона от Ð¾Ð³Ð½Ñ Ð¿Ð»ÑŽÑ 1 единицу за каждый уровень заклинателÑ. Жертвы получают Ð¿Ð¾Ð²Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñ Ð¾Ð´Ð¸Ð½ раз в раунд незавиÑимо от того, когда они вошли в зону охвата.~ +%atsymbol%240=~Сотворить огонь~ +%atsymbol%239=~МилоÑÑ‚ÑŒ Ильматера +(ÐекромантиÑ) +Уровень: 3 +Сфера: ÐекромантиÑ, Защита +ДальноÑÑ‚ÑŒ: 30 футов +ДлительноÑÑ‚ÑŒ: мгновенно +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 6 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: одно ÑущеÑтво +СпаÑброÑок: нет +Вызвав Ñто заклинание, заклинатель обмениваетÑÑ Ñвоими жизненными Ñилами Ñ Ñ†ÐµÐ»ÑŒÑŽ, Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰Ð°Ñ Ð²Ñе повреждениÑ. Это заклинание дейÑтвует только еÑли у Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ Ð±Ð¾Ð»ÑŒÑˆÐµ пунктов здоровьÑ, чем у его цели. Обмен жизненными Ñилами оÑтаетÑÑ Ð½ÐµÐ¸Ð·Ð¼ÐµÐ½Ð½Ñ‹Ð¼ до тех пор, пока не иÑпользуютÑÑ Ð¾Ð±Ñ‹Ñ‡Ð½Ñ‹Ðµ ÑпоÑобы лечениÑ. Его невозможно провеÑти Ñ Ñ€Ð°ÑÑтоÑниÑ, превышающего допуÑтимую дальноÑÑ‚ÑŒ. ПеремещаютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ пункты здоровьÑ; заклинатель не может принÑÑ‚ÑŒ на ÑÐµÐ±Ñ Ð½ÐµÐ³Ð°Ñ‚Ð¸Ð²Ð½Ð¾Ðµ ÑоÑтоÑние цели, такое как болезнь, отравление, опъÑнение или другие недуги. +Это заклинание недоÑтупно перÑонажам Ñо злым мировоззрением. Оно не дейÑтвует на нежить, механизмы и ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… планов.~ +%atsymbol%238=~МилоÑÑ‚ÑŒ Ильматера~ +%atsymbol%237=~ÐанеÑти Ñредние раны +(ÐекромантиÑ) +Уровень: 3 +Сфера: ИÑцеление +ДальноÑÑ‚ÑŒ: каÑание +ДлительноÑÑ‚ÑŒ: мгновенно +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 5 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: одно ÑущеÑтво +СпаÑброÑок: Ñнижает урон вдвое +Прочитав Ñто заклинание и дотронувшиÑÑŒ до ÑущеÑтва, жрец нанеÑет ему 14 единиц урона (или вдвое меньше при уÑпешном ÑпаÑброÑке против заклинаниÑ). Это заклинание не дейÑтвует на нежить, механизмы и ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… планов, а также недоÑтупно добрым перÑонажам.~ +%atsymbol%236=~ÐанеÑти Ñредние раны~ +%atsymbol%235=~Оболочка бури +(Ограждение) +Уровень: 3 +Сфера: Защита, Погода +ДальноÑÑ‚ÑŒ: 0 +ДлительноÑÑ‚ÑŒ: 1 ход +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 6 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: на ÑÐµÐ±Ñ +СпаÑброÑок: нет +Вокруг Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ‚ Ñ‚ÐµÐ¼Ð½Ð°Ñ Ð¾Ð±Ð¾Ð»Ð¾Ñ‡ÐºÐ° разрушительной Ñнергии, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿ÐµÑ€ÐµÐ´Ð²Ð¸Ð³Ð°ÐµÑ‚ÑÑ Ð²Ð¼ÐµÑте Ñ Ð½Ð¸Ð¼. Любой урон от огнÑ, холода и ÑлектричеÑтва Ð±Ð»Ð°Ð³Ð¾Ð´Ð°Ñ€Ñ Ð¾Ð±Ð¾Ð»Ð¾Ñ‡ÐºÐµ уменьшаютÑÑ Ð½Ð°Ð¿Ð¾Ð»Ð¾Ð²Ð¸Ð½Ñƒ.~ +%atsymbol%234=~Оболочка бури~ +%atsymbol%233=~ПрикоÑновение плеÑени +(Изменение) +Уровень: 3 +Сфера: РаÑÑ‚ÐµÐ½Ð¸Ñ +ДальноÑÑ‚ÑŒ: каÑание +ДлительноÑÑ‚ÑŒ: оÑÐ¾Ð±Ð°Ñ +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 6 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: в радиуÑе 10 футов +СпаÑброÑок: оÑобый +Заклинатель прикаÑаетÑÑ Ðº ÑущеÑтву и поражает его коричневой плеÑенью, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±Ñ‹Ñтро раÑпроÑтранÑетÑÑ. Жертве разрешаетÑÑ Ñделать ÑпаÑброÑок против заклинаниÑ; в Ñлучае провала заражение ÑтановитÑÑ Ñерьезным, и ÑущеÑтво получает урон: +1-й раунд: 4d6 единиц +2-й раунд: 3d6 единиц +3-й раунд: 2d6 единиц +4-й раунд: 1d6 единиц +При уÑпешном ÑпаÑброÑке урон меньше: +1-й раунд: 2d6 единиц +2-й раунд: 1d6 единиц +3-й раунд: 1d6 единиц +Каждый раунд, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñо второго, ближайшее из ÑущеÑтв, находÑщихÑÑ Ð² пределах 10 футов от жертвы, поражаетÑÑ Ð¿Ð»ÐµÑенью в полную Ñилу, еÑли не Ñделает уÑпешный ÑпаÑброÑок от заклинаний. Это продолжаетÑÑ, пока не кончатÑÑ Ð¿Ð¾Ð´Ñ…Ð¾Ð´Ñщие жертвы Ð´Ð»Ñ Ð¿Ð»ÐµÑени. СущеÑтва, уже находÑщиеÑÑ Ð¿Ð¾Ð´ ее воздейÑтвием, не могут заразитьÑÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾. По иÑтечении Ñрока дейÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ ÐºÐ¾Ñ€Ð¸Ñ‡Ð½ÐµÐ²Ð°Ñ Ð¿Ð»ÐµÑень быÑтро погибает.~ +%atsymbol%232=~ПрикоÑновение плеÑени~ +%atsymbol%231=~Ливень +(ПроÑвление) +Уровень: 3 +Сфера: Ð¡Ñ‚Ð¸Ñ…Ð¸Ñ (Вода) +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: 2 раунда +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 6 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: в радиуÑе 17 футов +СпаÑброÑок: нет +Вызывает волшебный дождь, который проходит в облаÑти дейÑтвиÑ. СущеÑтва, живущие в огне или льдах или иÑпользующие огненные или ледÑные атаки, получают каждый раунд 2d3 единиц магичеÑкого урона. Помимо Ñтого, любое ÑущеÑтво в облаÑти дейÑÑ‚Ð²Ð¸Ñ Ñ Ð²ÐµÑ€Ð¾ÑтноÑтью 50% каждый раунд может Ñтать жертвой удара молнии, который наноÑит 2d6 урона от ÑлектричеÑтва (вдвое меньше при уÑпешном ÑпаÑброÑке против заклинаниÑ). «Ливень» гаÑит ауры Ñаламандр, Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Â«ÐŸÐ»Ð°Ð¼ÐµÐ½Ð½Ñ‹Ð¹ клинок» и «Саван пламени».~ +%atsymbol%230=~Ливень~ +%atsymbol%229=~РаÑтущие шипы +(Изменение) +Уровень: 3 +Сфера: Ð¡Ñ‚Ð¸Ñ…Ð¸Ñ (ЗемлÑ) +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: 1 ход +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 6 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: в радиуÑе 15 футов +СпаÑброÑок: нет +Ð—ÐµÐ¼Ð»Ñ Ð²Ð¾ÐºÑ€ÑƒÐ³ покрываетÑÑ ÐºÐ¾Ð²Ñ€Ð¾Ð¼ шипаÑÑ‚Ñ‹Ñ… раÑтений. Любое ÑущеÑтво, вÑтупив в облаÑÑ‚ÑŒ охвата, получает 1d4 колющего и 1d4 рубÑщего урона каждый раунд до иÑÑ‚ÐµÑ‡ÐµÐ½Ð¸Ñ Ñрока дейÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ.~ +%atsymbol%228=~РаÑтущие шипы~ +%atsymbol%227=~КоÑÑ‚Ñной круг +(ÐекромантиÑ) +Уровень: 3 +Сфера: Охрана, Созидание +ДальноÑÑ‚ÑŒ: 0 +ДлительноÑÑ‚ÑŒ: 3 раунда +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 3 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: в радиуÑе 3 футов +СпаÑброÑок: нет +Вокруг Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ Ð½Ð°Ñ‡Ð¸Ð½Ð°ÐµÑ‚ быÑтро вращатьÑÑ Ð±Ð°Ñ€ÑŒÐµÑ€ из коÑтей. Любой, кто окажетÑÑ Ñƒ них на пути, каждый раунд получает 1d6 дробÑщего и 1d6 рубÑщего урона. Заклинатель не может передвигатьÑÑ, пока коÑÑ‚Ñной круг активен. Это заклинание недоÑтупно добрым перÑонажам.~ +%atsymbol%226=~КоÑÑ‚Ñной круг~ +%atsymbol%225=~Лунный клинок~ +%atsymbol%224=~Лунный клинок~ +%atsymbol%223=~Лунный клинок +(ПроÑвление) +Уровень: 3 +Сфера: Бой, Солнце +ДальноÑÑ‚ÑŒ: 0 +ДлительноÑÑ‚ÑŒ: 2 хода +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 6 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: на ÑÐµÐ±Ñ +СпаÑброÑок: нет +Ð’ руке Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ Ð¿Ð¾ÑвлÑетÑÑ Ð±ÐµÑшумный невеÑомый клинок, ÑоÑтоÑщий из лунного Ñвета. У Ð¾Ñ€ÑƒÐ¶Ð¸Ñ Ð½ÐµÑ‚ бонуÑа к THAC0, но оно раÑцениваетÑÑ ÐºÐ°Ðº +4, еÑли нужно ударить ÑущеÑтво, неуÑзвимое Ð´Ð»Ñ Ð¾Ð±Ñ‹Ñ‡Ð½Ð¾Ð³Ð¾ оружиÑ. ПоÑкольку лунный клинок имеет нематериальную природу, при обращении Ñ Ð½Ð¸Ð¼ не учитываютÑÑ ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ Ð¿Ð¾ Ñиле. +Лунный клинок вытÑгивает у цели жизненные Ñилы, наноÑÑ 1d12+4 единиц магичеÑкого урона. Ðежить чувÑтвительна к Ñтому оружию и получает дополнительно 1d12 единиц урона. Кроме того, попадание на Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿ÑƒÑ‚Ñ‹Ð²Ð°ÐµÑ‚ магию, поÑтому любое заклинание, которое жертва прочитает в Ñледующем раунде, провалитÑÑ.~ +%atsymbol%222=~Лунный клинок~ +%atsymbol%221=~УÑыпление~ +%atsymbol%220=~Ð­ÐºÐ·Ð°Ð»ÑŒÑ‚Ð°Ñ†Ð¸Ñ +(Ограждение) +Уровень: 3 +Сфера: ИÑцеление +ДальноÑÑ‚ÑŒ: каÑание +ДлительноÑÑ‚ÑŒ: 1 ход +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 9 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: одно ÑущеÑтво +СпаÑброÑок: нет +Этим заклинанием жрец может помочь и дать защиту любому ÑущеÑтву, кроме ÑÐµÐ±Ñ Ñамого. ПрикоÑнувшиÑÑŒ к цели, заклинатель Ñнимает Ñффекты Ñтраха, Ñна, ÑлабоумиÑ, потери ÑознаниÑ, отравлениÑ, ÑроÑти и раÑтерÑнноÑти, а также на Ð²Ñ€ÐµÐ¼Ñ Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð´ÐµÐ»Ð°ÐµÑ‚ цель неуÑзвимой Ð´Ð»Ñ Ð°Ñ‚Ð°Ðº и заклинаний, вызывающих такие Ñффекты.~ +%atsymbol%219=~ЭкзальтациÑ~ +%atsymbol%218=~ÐаÑлать болезнь +(ÐекромантиÑ) +Уровень: 3 +Сфера: ИÑцеление +ДальноÑÑ‚ÑŒ: каÑание +ДлительноÑÑ‚ÑŒ: 8 чаÑов +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 9 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: одно ÑущеÑтво +СпаÑброÑок: отменÑет дейÑтвие +ДотронувшиÑÑŒ до цели, жрец наÑылает на нее болезнь, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð²Ñ‹ÑаÑывает 5d4 единиц Ñилы. УÑпешный ÑпаÑброÑок против Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ñет избежать воздейÑтвиÑ. Заклинание не дейÑтвует на нежить, механизмы и ÑущеÑтва Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… планов. Добрые перÑонажи не могут иÑпользовать «ÐаÑлать болезнь».~ +%atsymbol%217=~ÐаÑлать болезнь~ +%atsymbol%216=~Ð£Ñ…ÑƒÐ´ÑˆÐµÐ½Ð¸Ñ Ð² бою~ +%atsymbol%215=~Ð£Ð»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ Ð² бою~ +%atsymbol%214=~Молитва +(Вызывание/Призывание) +Уровень: 3 +Сфера: Бой +ДальноÑÑ‚ÑŒ: 0 +ДлительноÑÑ‚ÑŒ: 1 раунд/уровень +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 6 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: в радиуÑе 30 футов +СпаÑброÑок: нет +Молитва дарует божеÑтвенное благоÑловение жрецу и его Ñоюзникам, а их врагов проклинает. Союзники получают улучшение +1 к броÑкам на атаку, на урон и к ÑпаÑброÑкам, а враги — ухудшение −1. Ð’Ñе ÑущеÑтва, находившиеÑÑ Ð² облаÑти дейÑÑ‚Ð²Ð¸Ñ Ð²Ð¾ Ð²Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ, оÑтанутÑÑ Ð¿Ð¾Ð´ дейÑтвием «Молитвы» и поÑле того, как покинут Ñту зону, так что, еÑли воины броÑÑÑ‚ÑÑ Ð² погоню за убегающим гоблином, Ñффект Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¾ÑтанетÑÑ Ñ Ð½Ð¸Ð¼Ð¸.~ +%atsymbol%213=~Молитва~ +%atsymbol%212=~ÐанеÑти умеренные раны +(ÐекромантиÑ) +Уровень: 2 +Сфера: ИÑцеление +ДальноÑÑ‚ÑŒ: каÑание +ДлительноÑÑ‚ÑŒ: мгновенно +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 5 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: одно ÑущеÑтво +СпаÑброÑок: Ñнижает урон вдвое +Прочитав заклинание и дотронувшиÑÑŒ до ÑущеÑтва, жрец наноÑит ему 11 единиц урона (при уÑпешном ÑпаÑброÑке вдвое меньше). Это заклинание не дейÑтвует на нежить, механизмы и ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… планов. Оно недоÑтупно добрым перÑонажам.~ +%atsymbol%211=~ÐанеÑти умеренные раны~ +%atsymbol%210=~Коготь зверÑ~ +%atsymbol%209=~Коготь зверÑ~ +%atsymbol%208=~Коготь Ð·Ð²ÐµÑ€Ñ +(Изменение) +Уровень: 2 +Сфера: Бой +ДальноÑÑ‚ÑŒ: 0 +ДлительноÑÑ‚ÑŒ: 1 ход +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 5 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: на ÑÐµÐ±Ñ +СпаÑброÑок: нет +Руки Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ Ð¿Ñ€ÐµÐ²Ñ€Ð°Ñ‰Ð°ÑŽÑ‚ÑÑ Ð² когти мощного зверÑ, Ð¿Ñ€Ð¸Ð´Ð°Ð²Ð°Ñ ÐµÐ¼Ñƒ Ñилу 18/72 и возможноÑÑ‚ÑŒ наноÑить врагу 2d4 (+ добавочные за Ñилу) единиц рубÑщего урона. Заклинатель может бить когтÑми дважды за раунд, атака производитÑÑ Ñ ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸ÐµÐ¼ +2.~ +%atsymbol%207=~Коготь зверÑ~ +%atsymbol%206=~ОчерчиваетÑÑ ÑеребриÑтым ÑиÑнием (штраф −2 к КЗ)~ +%atsymbol%205=~Копье аликорна +(ПроÑвление) +Уровень: 2 +Сфера: Бой +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: мгновенно +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 5 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: одно ÑущеÑтво +СпаÑброÑок: оÑобый +Создает ÑеребриÑтое, чаÑтично Ñфирное копье в форме аликорна (рога единорога). Копье тут же летит в выбранную заклинателем цель, наноÑÑ ÐµÐ¹ 3d6 единиц колющего урона (половину при уÑпешном ÑпаÑброÑке против заклинаниÑ). ПоÑле удара копье иÑчезает, но еще 3 раунда вокруг цели оÑтаетÑÑ ÑеребриÑтое ÑиÑние, которое временно Ñнижает клаÑÑ Ð·Ð°Ñ‰Ð¸Ñ‚Ñ‹ цели на 2.~ +%atsymbol%204=~Копье Ðликорна~ +%atsymbol%203=~Здоровье воÑÑтановлено~ +%atsymbol%202=~Вылечить умеренные раны +(ÐекромантиÑ) +Уровень: 2 +Сфера: ИÑцеление +ДальноÑÑ‚ÑŒ: каÑание +ДлительноÑÑ‚ÑŒ: мгновенно +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 5 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: одно ÑущеÑтво +СпаÑброÑок: нет +УÑÐ¸Ð»ÐµÐ½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð¶Ñ€ÐµÑ‡ÐµÑкого Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ 1-го ÑƒÑ€Ð¾Ð²Ð½Ñ Â«Ð’Ñ‹Ð»ÐµÑ‡Ð¸Ñ‚ÑŒ легкие раны». ВоÑÑтанавливает 11 пунктов Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ Ñƒ ÑущеÑтва и Ñнимает опьÑнение. Это заклинание не дейÑтвует на нежить, механизмы и ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… планов.~ +%atsymbol%201=~Вылечить умеренные раны~ +%atsymbol%200=~ОÑлепление~ +%atsymbol%199=~Солнечный ожог +(ПроÑвление) +Уровень: 1 +Сфера: Солнце +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: мгновенно +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 4 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: одно ÑущеÑтво +СпаÑброÑок: оÑобый +Ðа выбранную заклинателем цель Ñ Ð½ÐµÐ±ÐµÑ Ð¿Ð°Ð´Ð°ÐµÑ‚ обжигающий луч Ñвета. СпаÑброÑок против Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ñет цели Ñократить урон от ожога вдвое. Жертва получает 1d6 единиц урона + 1 единицу за каждый уровень заклинателÑ. Ðежить и монÑтры, чувÑтвительные к Ñркому Ñвету, получают 1d6 единиц урона + 2 единицы за каждый уровень заклинателÑ. Жертва также оÑлеплÑетÑÑ Ð½Ð° 3 раунда.~ +%atsymbol%198=~Солнечный ожог~ +%atsymbol%197=~ÐанеÑти легкие раны +(ÐекромантиÑ) +Уровень: 1 +Сфера: ИÑцеление +ДальноÑÑ‚ÑŒ: каÑание +ДлительноÑÑ‚ÑŒ: мгновенно +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 5 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: одно ÑущеÑтво +СпаÑброÑок: Ñнижает урон вдвое +Прочитав заклинание и дотронувшиÑÑŒ до ÑущеÑтва, жрец наноÑит ему 8 единиц урона (половину при уÑпешном ÑпаÑброÑке против заклинаниÑ). Это заклинание не дейÑтвует на нежить, механизмы и ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… планов. Оно недоÑтупно добрым перÑонажам.~ +%atsymbol%196=~ÐанеÑти легкие раны~ +%atsymbol%195=~ПроклÑтие~ +%atsymbol%194=~ПроклÑтие +(Вызывание/Призывание) +Уровень: 1 +Сфера: Ð’Ñе +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: 6 раундов +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 9 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: в радиуÑе 15 футов +СпаÑброÑок: нет +Снижает боевой дух врагов и ухудшает на 1 их ÑпаÑброÑки и броÑки на атаку. Как только заклинание прочитано, оно оказывает Ñвое дейÑтвие на вÑех ÑущеÑтв внутри 15-футового куба Ñ Ñ†ÐµÐ½Ñ‚Ñ€Ð¾Ð¼ в точке, указанной заклинателем. Таким образом, ÑущеÑтва, покинувшие границы куба поÑле Ñтого, продолжают находитьÑÑ Ð¿Ð¾Ð´ дейÑтвием заклинаниÑ, а те, кто вошел в зону охвата, ему уже не подвергаютÑÑ.~ +%atsymbol%193=~ПроклÑтие~ +%atsymbol%192=~Око ÐºÐ°Ð¼Ð½Ñ +Единожды предохранÑет Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ Ð¾Ñ‚ Ð¿Ñ€ÐµÐ²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð² камень. +Это око также можно иÑпользовать как магичеÑкое заклинание 3-го ÑƒÑ€Ð¾Ð²Ð½Ñ Â«Ð£Ð´ÐµÑ€Ð¶Ð°Ñ‚ÑŒ перÑону», которое делает неподвижными человекоподобных ÑущеÑтв на 1 раунд за уровень (только еÑли они провалÑÑ‚ ÑпаÑброÑок против заклинаниÑ).~ +%atsymbol%191=~Око камнÑ~ +%atsymbol%190=~Око духа +Блокирует магичеÑкую атаку, вызывающую мгновенную Ñмерть («Смертельное заклÑтие», «ПерÑÑ‚ Ñмерти», «Слово Ñилы: Умри», «Умерщвление», «Уничтожение»). +Это око можно иÑпользовать как магичеÑкое заклинание 2-го ÑƒÑ€Ð¾Ð²Ð½Ñ Â«Ð›ÑƒÑ‡ оÑлаблениÑ», которое Ñнижает Ñилу цели до 5 (только еÑли она провалит ÑпаÑброÑок против заклинаниÑ).~ +%atsymbol%189=~Око духа~ +%atsymbol%188=~Око ÑтойкоÑти +Предотвращает контузию, глухоту, Ñлепоту или немоту. +Это око также можно иÑпользовать как магичеÑкое заклинание 4-го ÑƒÑ€Ð¾Ð²Ð½Ñ Â«ÐšÑ€Ð¸ÐºÂ», которое наноÑит 4d6 единиц магичеÑкого урона и оглушает ÑущеÑтв на раÑÑтоÑнии конуÑа в 35 футов. ЕÑли ÑущеÑтва уÑпешно выполнÑÑ‚ ÑпаÑброÑок против заклинаниÑ, то ÑнизÑÑ‚ урон вдвое и не оглохнут.~ +%atsymbol%187=~Око ÑтойкоÑти~ +%atsymbol%186=~Око Ñда +ОÑтанавливает одну атаку или дейÑтвие, ÑпоÑобные отравить заклинателÑ. +Это око можно иÑпользовать как жречеÑкое заклинание 4-го ÑƒÑ€Ð¾Ð²Ð½Ñ Â«Ð¯Ð´Â», которое наноÑит 20 единиц урона в течение 20 Ñекунд одному ÑущеÑтву (только еÑли оно провалит ÑпаÑброÑок против Ñда).~ +%atsymbol%185=~Око Ñда~ +%atsymbol%184=~Око меча +Отражает первую физичеÑкую атаку, направленную на заклинателÑ. +Это око можно иÑпользовать как магичеÑкое заклинание 1-го ÑƒÑ€Ð¾Ð²Ð½Ñ Â«ÐœÐ°Ð³Ð¸Ñ‡ÐµÑкий ÑнарÑд», которое Ñоздает до 5 ÑнарÑдов (один за каждые два ÑƒÑ€Ð¾Ð²Ð½Ñ Ð¾Ð¿Ñ‹Ñ‚Ð°, кроме первого), которые наноÑÑÑ‚ цели 1d4+1 единиц магичеÑкого урона.~ +%atsymbol%183=~Око меча~ +%atsymbol%182=~Око мага +Поглощает одну атаку холодом, огнем, ÑлектричеÑтвом или киÑлотой. +Это око можно иÑпользовать как магичеÑкое заклинание 3-го ÑƒÑ€Ð¾Ð²Ð½Ñ Â«Ð Ð°Ð·Ñ€Ñд молнии», которое наноÑит 1d6 единиц урона от ÑлектричеÑтва вÑем ÑущеÑтвам на Ñвоем пути.~ +%atsymbol%181=~Око мага~ +%atsymbol%180=~Око разума +Защищает Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ Ð¾Ñ‚ воздейÑÑ‚Ð²Ð¸Ñ Ð½Ð° разум, к примеру, очарованиÑ, Ñмоций, Ñтраха. +Это око можно иÑпользовать как магичеÑкое заклинание 1-го ÑƒÑ€Ð¾Ð²Ð½Ñ Â«ÐžÑ‡Ð°Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ перÑону», которое на 1 ход подчинÑет воле Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ Ð¾Ð´Ð½Ð¾ человекоподобное ÑущеÑтво (только еÑли оно провалит ÑпаÑброÑок против заклинаниÑ).~ +%atsymbol%179=~Око разума~ +%atsymbol%178=~ÐÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚ÑŒ Ñто заклинание, пока не закончено чтение текущего заклинаниÑ.~ +%atsymbol%177=~Семь очей +(Ограждение) +Уровень: 7 +ДальноÑÑ‚ÑŒ: 0 +ДлительноÑÑ‚ÑŒ: 2 хода +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 7 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: на ÑÐµÐ±Ñ +СпаÑброÑок: нет +Ðад головой Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ Ð¿Ð¾ÑвлÑÑŽÑ‚ÑÑ Ñемь магичеÑких Ñфер, медленно летающих по кругу. У каждого ока еÑÑ‚ÑŒ возможноÑÑ‚ÑŒ защиты или нападениÑ, но иÑпользовать его можно только Ð´Ð»Ñ Ñ‡ÐµÐ³Ð¾-либо одного, а затем он терÑет Ñилу. До иÑÑ‚ÐµÑ‡ÐµÐ½Ð¸Ñ Ñрока дейÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð²Ð¾Ð»ÑˆÐµÐ±Ð½Ð¸Ðº не может прочитать «Семь очей» Ñнова, незавиÑимо от того, оÑталиÑÑŒ ли еще неиÑпользованные очи. СвойÑтва очей опиÑаны ниже. +Око разума — защищает Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ Ð¾Ñ‚ воздейÑÑ‚Ð²Ð¸Ñ Ð½Ð° разум, к примеру, зачарованиÑ, Ñмоций, Ñтраха. Может быть иÑпользовано как магичеÑкое заклинание 1-го ÑƒÑ€Ð¾Ð²Ð½Ñ Â«ÐžÑ‡Ð°Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ перÑону», Ð±Ð»Ð°Ð³Ð¾Ð´Ð°Ñ€Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¼Ñƒ при неудачном ÑпаÑброÑке против Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»ÑŒ может управлÑÑ‚ÑŒ жертвой в течение 1 хода. +Око меча — отражает первую физичеÑкую атаку, направленную на заклинателÑ. Может быть иÑпользовано как магичеÑкое заклинание 1-го ÑƒÑ€Ð¾Ð²Ð½Ñ Â«ÐœÐ°Ð³Ð¸Ñ‡ÐµÑкий ÑнарÑд», которое выпуÑкает до 5 ÑнарÑдов (по одному за каждые два ÑƒÑ€Ð¾Ð²Ð½Ñ Ð¾Ð¿Ñ‹Ñ‚Ð°, помимо первого) Ñ ÑƒÑ€Ð¾Ð½Ð¾Ð¼ 1d4+1 от магии. +Око мага — поглощает одну атаку холодом, огнем, ÑлектричеÑтвом или киÑлотой. Может быть иÑпользовано как магичеÑкое заклинание 3-го ÑƒÑ€Ð¾Ð²Ð½Ñ Â«Ð Ð°Ð·Ñ€Ñд молнии», которое наноÑит 1d6 урона ÑлектричеÑтвом за уровень Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ (до макÑимума в 10d6) вÑем ÑущеÑтвам на Ñвоем пути. +Око Ñда — оÑтанавливает одну атаку или дейÑтвие, ÑпоÑобные отравить заклинателÑ. Может быть иÑпользовано как жречеÑкое заклинание 4-го ÑƒÑ€Ð¾Ð²Ð½Ñ Â«Ð¯Ð´Â», которое при неудачном ÑпаÑброÑке против Ñда наноÑит жертве 20 единиц урона в течение 20 Ñекунд. +Око духа — блокирует магичеÑкую атаку, вызывающую мгновенную Ñмерть («Смертельное заклÑтие», «ПерÑÑ‚ Ñмерти», «Слово Ñилы: Умри», «Умерщвление», «Уничтожение»). Может быть иÑпользовано как магичеÑкое заклинание 2-го ÑƒÑ€Ð¾Ð²Ð½Ñ Â«Ð›ÑƒÑ‡ оÑлаблениÑ», которое при неудачном ÑпаÑброÑке против Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ñнижает Ñилу жертвы до 5. +Око ÑтойкоÑти — предотвращает контузию, глухоту, Ñлепоту или молчание. Также может быть иÑпользовано как магичеÑкое заклинание 4-го ÑƒÑ€Ð¾Ð²Ð½Ñ Â«ÐšÑ€Ð¸ÐºÂ», которое наноÑит 4d6 магичеÑкого урона и оглушает жертв в радиуÑе 35-футового конуÑа. При уÑпешном ÑпаÑброÑке против Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¶ÐµÑ€Ñ‚Ð²Ñƒ не контузит, и она получает лишь половину урона. +Око ÐºÐ°Ð¼Ð½Ñ â€” предохранÑет Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ Ð¾Ñ‚ Ð¿Ñ€ÐµÐ²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð² камень. Также может быть иÑпользован как магичеÑкое заклинание 3-го ÑƒÑ€Ð¾Ð²Ð½Ñ Â«Ð£Ð´ÐµÑ€Ð¶Ð°Ñ‚ÑŒ перÑону», которое при неудачном ÑпаÑброÑке против Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¾Ð±ÐµÐ·Ð´Ð²Ð¸Ð¶Ð¸Ð²Ð°ÐµÑ‚ жертву размером Ñ Ñ‡ÐµÐ»Ð¾Ð²ÐµÐºÐ° или меньше на 1 раунд/уровень. +До Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ñрока дейÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ Ñнова прочитать «Семь очей», даже еÑли вÑе глаза уже были иÑпользованы.~ +%atsymbol%176=~Семь очей~ +%atsymbol%175=~ЯроÑÑ‚ÑŒ Малавона +(Воплощение) +Уровень: 7 +ДальноÑÑ‚ÑŒ: 0 +ДлительноÑÑ‚ÑŒ: мгновенно +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 1 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: в радиуÑе 7 футов +СпаÑброÑок: Ñнижает урон вдвое +Это заклинание разработал маг-дроу Малавон. Из тела Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ Ð²Ð¾ вÑех направлениÑÑ… вылетают Ñтрелы из чиÑтой Ñнергии, поражающие и друзей, и врагов. Эти ÑнергетичеÑкие конуÑÑ‹ наноÑÑÑ‚ 20d4 единиц колющего урона любой цели, что окажетÑÑ Ñƒ них на пути. Заклинание оÑобенно Ñффективно, еÑли маг оказалÑÑ Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½ противниками.~ +%atsymbol%174=~ЯроÑÑ‚ÑŒ Малавона~ +%atsymbol%173=~РазÑщий удар~ +%atsymbol%172=~Смерть~ +%atsymbol%171=~Ðежить уничтожена~ +%atsymbol%170=~Уничтожено ÑущеÑтво Ñ Ð’Ð½ÐµÑˆÐ½ÐµÐ³Ð¾ Плана~ +%atsymbol%169=~Тени +(ИллюзиÑ/Фантом) +Уровень: 6 +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: 1 раунд/уровень +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 6 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: оÑÐ¾Ð±Ð°Ñ +СпаÑброÑок: нет +Это заклинание дейÑтвует подобно заклинаниÑм «Чудовища тени» и «Чудовища полутени» — оно позволÑет заклинателю Ñоздавать из материи полуплана Теней призрачных ÑущеÑтв, которые подчинÑÑŽÑ‚ÑÑ ÐµÐ³Ð¾ приказам, пока не погибнут или не иÑтечет Ñрок дейÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ. Тени Ñильнее, чем чудовища тени и чудовища полутени.~ +%atsymbol%168=~Тени~ +%atsymbol%167=~ПрикоÑновение лича~ +%atsymbol%166=~ПрикоÑновение лича~ +%atsymbol%165=~ПрикоÑновение лича +(ÐекромантиÑ) +Уровень: 6 +ДальноÑÑ‚ÑŒ: каÑание +ДлительноÑÑ‚ÑŒ: 1 раунд/уровень +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 6 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: на ÑÐµÐ±Ñ +СпаÑброÑок: оÑобый +Заклинатель, подобно личу, ÑтановитÑÑ Ð½ÐµÑƒÑзвим к параличу и Ñтраху на Ð²Ñ€ÐµÐ¼Ñ Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ, а его руки обретают Ñилу прикоÑÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ð»Ð¸Ñ‡Ð° — они излучают неземной зеленый Ñвет, который наноÑит 1d10 урона от холода цели, которой каÑаетÑÑ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»ÑŒ, и парализует ее, еÑли жертва провалит ÑпаÑброÑок против парализации. Ðе дейÑтвует на нежить.~ +%atsymbol%164=~ПрикоÑновение лича~ +%atsymbol%163=~Эффекты развеÑны~ +%atsymbol%162=~ÐнтимагичеÑÐºÐ°Ñ Ð¾Ð±Ð¾Ð»Ð¾Ñ‡ÐºÐ° +(Ограждение) +Уровень: 6 +ДальноÑÑ‚ÑŒ: 0 +ДлительноÑÑ‚ÑŒ: 1 ход/уровень +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 1 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: на ÑÐµÐ±Ñ +СпаÑброÑок: нет +Окружает Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ Ð½ÐµÐ²Ð¸Ð´Ð¸Ð¼Ñ‹Ð¼ барьером, который перемещаетÑÑ Ð²Ð¼ÐµÑте Ñ Ð½Ð¸Ð¼. Эта оболочка защищает Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ Ð¾Ñ‚ любых магичеÑких атак, но при Ñтом не дает ему читать заклинаниÑ, кроме направленных на ÑÐµÐ±Ñ Ñамого. Кроме того, она развеивает глухоту и Ñлабоумие.~ +%atsymbol%161=~ÐнтимагичеÑÐºÐ°Ñ Ð¾Ð±Ð¾Ð»Ð¾Ñ‡ÐºÐ°~ +%atsymbol%160=~Крепкий человек-Ñщер~ +%atsymbol%159=~Элитный гоблин~ +%atsymbol%158=~Элитный гоблин~ +%atsymbol%157=~Чудовища полутени +(ИллюзиÑ/Фантом) +Уровень: 5 +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: 1 раунд/уровень +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 5 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: оÑÐ¾Ð±Ð°Ñ +СпаÑброÑок: нет +Это заклинание дейÑтвует подобно заклинанию «Чудовища тени» 4-го уровнÑ, но вызывает более мощных ÑущеÑтв.~ +%atsymbol%156=~Чудовища полутени~ +%atsymbol%155=~Оружие троллей~ +%atsymbol%154=~Тролль~ +%atsymbol%153=~Тролль~ +%atsymbol%152=~Чудовища тени +(ИллюзиÑ/Фантом) +Уровень: 4 +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: 1 раунд/уровень +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 4 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: оÑÐ¾Ð±Ð°Ñ +СпаÑброÑок: нет +Создает иллюзорных чудовищ из материи Полуплана Тени. Единовременно можно призвать до 6 ÑущеÑтв, однако Ñумма их уровней Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ Ð½Ðµ может превыÑить макÑимальный Ð·Ð°Ð¿Ð°Ñ Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ.~ +%atsymbol%151=~Чудовища тени~ +%atsymbol%150=~Под дейÑтвием уÑкорениÑ~ +%atsymbol%149=~Замедление~ +%atsymbol%148=~Замедление~ +%atsymbol%147=~БыÑтрое отÑтупление +(Изменение) +Уровень: 1 +ДальноÑÑ‚ÑŒ: 0 +ДлительноÑÑ‚ÑŒ: 3 раунда +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 1 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: на ÑÐµÐ±Ñ +СпаÑброÑок: нет +ÐžÐ±Ñ‹Ñ‡Ð½Ð°Ñ ÑкороÑÑ‚ÑŒ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ Ð²Ð¾Ð·Ñ€Ð°Ñтает вдвое на некоторое времÑ... обычно доÑтаточное, чтобы убежать. Во Ð²Ñ€ÐµÐ¼Ñ Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ Â«Ð‘Ñ‹Ñтрого отÑтуплениÑ» на цель не влиÑÑŽÑ‚ другие заклинаниÑ, затрагивающие передвижение, например, «УÑкорение» и «Замедление». Кроме того, заклинатель не Ñможет атаковать, читать заклинаниÑ, иÑпользовать предметы или ÑпоÑобноÑти... он Ñможет только бежать.~ +%atsymbol%146=~БыÑтрое отÑтупление~ +%atsymbol%145=~Меч Морденкайнена~ +%atsymbol%144=~Меч Морденкайнена~ +%atsymbol%143=~Меч Морденкайнена +(Воплощение) +Уровень: 7 +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: 1 раунд/уровень +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 7 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: оÑÐ¾Ð±Ð°Ñ +СпаÑброÑок: нет +Создает иÑкрÑщийÑÑ ÐºÐ»Ð¸Ð½Ð¾Ðº Ñилы, который заклинатель контролирует ментально. Меч бьет так, как еÑли бы им пользовалÑÑ Ð²Ð¾Ð¸Ð½ ÑƒÑ€Ð¾Ð²Ð½Ñ Ð²Ð´Ð²Ð¾Ðµ меньшего, чем маг. ÐеÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° то, что заклинатель держит меч в руках, им можно атаковать любое ÑущеÑтво в поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð¼Ð°Ð³Ð°. Улучшений к атаке у клинка нет, но он может поразить врага, уÑзвимого только Ð´Ð»Ñ Ð¾Ñ€ÑƒÐ¶Ð¸Ñ, зачарованного на +2 и выше. РубÑщий урон, наноÑимый мечом, ÑоÑтавлÑет 5d6 единиц.~ +%atsymbol%142=~Меч Морденкайнена~ +%atsymbol%141=~Водный Ñлементаль~ +%atsymbol%140=~Водный Ñлементаль~ +%atsymbol%139=~Вызвать ÑÐ»ÐµÐ¼ÐµÐ½Ñ‚Ð°Ð»Ñ Ð²Ð¾Ð´Ñ‹ +(Вызывание/Призывание) +Уровень: 5 +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: 1 ход/уровень +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 9 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: оÑÐ¾Ð±Ð°Ñ +СпаÑброÑок: нет +Призывает ÑÐ»ÐµÐ¼ÐµÐ½Ñ‚Ð°Ð»Ñ Ñо Стихийного Плана Воды и заÑтавлÑет подчинитьÑÑ Ð²Ð¾Ð»Ðµ заклинателÑ. Элементаль ÑражаетÑÑ Ð½Ð° Ñтороне заклинателÑ, пока не погибнет или не иÑтечет Ð²Ñ€ÐµÐ¼Ñ Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ.~ +%atsymbol%138=~Вызвать ÑÐ»ÐµÐ¼ÐµÐ½Ñ‚Ð°Ð»Ñ Ð²Ð¾Ð´Ñ‹~ +%atsymbol%137=~Элементаль воздуха~ +%atsymbol%136=~Элементаль воздуха~ +%atsymbol%135=~Вызвать ÑÐ»ÐµÐ¼ÐµÐ½Ñ‚Ð°Ð»Ñ Ð²Ð¾Ð·Ð´ÑƒÑ…Ð° +(Вызывание/Призывание) +Уровень: 6 +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: 1 ход/уровень +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 9 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: оÑÐ¾Ð±Ð°Ñ +СпаÑброÑок: нет +Заклинатель открывает оÑобые врата на Стихийный План Воздуха, и поблизоÑти от него поÑвлÑетÑÑ Ñлементаль воздуха Ñ ÑƒÑ€Ð¾Ð²Ð½ÐµÐ¼ Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ 8. Элементаль выполнÑет команды заклинателÑ, пока не будет убит, или не иÑтечет Ñрок дейÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ.~ +%atsymbol%134=~Вызвать ÑÐ»ÐµÐ¼ÐµÐ½Ñ‚Ð°Ð»Ñ Ð²Ð¾Ð·Ð´ÑƒÑ…Ð°~ +%atsymbol%133=~Огненный Ñлементаль~ +%atsymbol%132=~Огненный Ñлементаль~ +%atsymbol%131=~Вызвать ÑÐ»ÐµÐ¼ÐµÐ½Ñ‚Ð°Ð»Ñ Ð¾Ð³Ð½Ñ +(Вызывание/Призывание) +Уровень: 5 +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: 1 ход/уровень +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 9 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: оÑÐ¾Ð±Ð°Ñ +СпаÑброÑок: нет +Волшебник призывает ÑÐ»ÐµÐ¼ÐµÐ½Ñ‚Ð°Ð»Ñ Ñ ÑƒÑ€Ð¾Ð²Ð½ÐµÐ¼ Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ 8 Ñо Стихийного Плана ÐžÐ³Ð½Ñ Ð¸ управлÑет им. Элементаль ÑражаетÑÑ Ð½Ð° Ñтороне заклинателÑ, а по иÑтечении Ñрока дейÑÑ‚Ð²Ð¸Ñ Ñ‡Ð°Ñ€ возвращаетÑÑ Ð½Ð° родной план, еÑли оÑталÑÑ Ð² живых.~ +%atsymbol%130=~Вызвать ÑÐ»ÐµÐ¼ÐµÐ½Ñ‚Ð°Ð»Ñ Ð¾Ð³Ð½Ñ~ +%atsymbol%129=~ЗемлÑной Ñлементаль~ +%atsymbol%128=~ЗемлÑной Ñлементаль~ +%atsymbol%127=~Вызвать ÑÐ»ÐµÐ¼ÐµÐ½Ñ‚Ð°Ð»Ñ Ð·ÐµÐ¼Ð»Ð¸ +(Вызывание/Призывание) +Уровень: 5 +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: 1 ход/уровень +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 9 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: оÑÐ¾Ð±Ð°Ñ +СпаÑброÑок: нет +Волшебник призывает ÑÐ»ÐµÐ¼ÐµÐ½Ñ‚Ð°Ð»Ñ Ñ ÑƒÑ€Ð¾Ð²Ð½ÐµÐ¼ Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ 8 Ñо Стихийного Плана Земли и управлÑет им. Элементаль ÑражаетÑÑ Ð½Ð° Ñтороне заклинателÑ, а по иÑтечении Ñрока дейÑÑ‚Ð²Ð¸Ñ Ñ‡Ð°Ñ€ возвращаетÑÑ Ð½Ð° родной план, еÑли оÑталÑÑ Ð² живых.~ +%atsymbol%126=~Вызвать ÑÐ»ÐµÐ¼ÐµÐ½Ñ‚Ð°Ð»Ñ Ð·ÐµÐ¼Ð»Ð¸~ +%atsymbol%125=~Призывание монÑтров III +(Вызывание/Призывание) +Уровень: 5 +ДальноÑÑ‚ÑŒ: 20 футов +ДлительноÑÑ‚ÑŒ: 4 раунда + 1 раунд/уровень +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 5 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: оÑÐ¾Ð±Ð°Ñ +СпаÑброÑок: нет +Ппризывает 1d4 монÑтров третьего уровнÑ. Они поÑвлÑÑŽÑ‚ÑÑ Ð² облаÑти дейÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¸ подчинÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð¸ÐºÐ°Ð·Ð°Ð¼ заклинателÑ, Ð°Ñ‚Ð°ÐºÑƒÑ ÐµÐ³Ð¾ врагов. По иÑтечении Ñрока дейÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¾ÑтавшиеÑÑ Ð² живых монÑтры иÑчезают.~ +%atsymbol%124=~Призывание монÑтров III~ +%atsymbol%123=~Человек-Ñщер~ +%atsymbol%122=~Человек-Ñщер~ +%atsymbol%121=~Призывание монÑтров II +(Вызывание/Призывание) +Уровень: 4 +ДальноÑÑ‚ÑŒ: 20 футов +ДлительноÑÑ‚ÑŒ: 3 раунда + 1 раунд/уровень +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 4 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: оÑÐ¾Ð±Ð°Ñ +СпаÑброÑок: нет +Призывает 1d6 монÑтров второго уровнÑ. Они поÑвлÑÑŽÑ‚ÑÑ Ð² облаÑти дейÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¸ атакуют врагов Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ Ð´Ð¾ иÑÑ‚ÐµÑ‡ÐµÐ½Ð¸Ñ Ñрока дейÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ пока не будут убиты.~ +%atsymbol%120=~Призывание монÑтров II~ +%atsymbol%119=~Гоблин~ +%atsymbol%118=~Гоблин~ +%atsymbol%117=~Призывание монÑтров I +(Вызывание/Призывание) +Уровень: 3 +ДальноÑÑ‚ÑŒ: 20 футов +ДлительноÑÑ‚ÑŒ: 2 раунда + 1 раунд/уровень +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 3 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: оÑÐ¾Ð±Ð°Ñ +СпаÑброÑок: нет +Призывает 2d3 монÑтров первого уровнÑ. Они поÑвлÑÑŽÑ‚ÑÑ Ð² облаÑти дейÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¸ подчинÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð¸ÐºÐ°Ð·Ð°Ð¼ заклинателÑ, Ð°Ñ‚Ð°ÐºÑƒÑ ÐµÐ³Ð¾ врагов. По иÑтечении Ñрока дейÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¾ÑтавшиеÑÑ Ð² живых монÑтры иÑчезают.~ +%atsymbol%116=~Призывание монÑтров I~ +%atsymbol%115=~Ðтака~ +%atsymbol%114=~Минотавр~ +%atsymbol%113=~Минотавр~ +%atsymbol%112=~Призывание монÑтров V +(Вызывание/Призывание) +Уровень: 7 +ДальноÑÑ‚ÑŒ: 20 футов +ДлительноÑÑ‚ÑŒ: 6 раундов + 1 раунд/уровень +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 7 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: оÑÐ¾Ð±Ð°Ñ +СпаÑброÑок: нет +Призывает 1d3 монÑтров пÑтого уровнÑ. Они поÑвлÑÑŽÑ‚ÑÑ Ð² облаÑти дейÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¸ подчинÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð¸ÐºÐ°Ð·Ð°Ð¼ заклинателÑ, Ð°Ñ‚Ð°ÐºÑƒÑ ÐµÐ³Ð¾ врагов. По иÑтечении Ñрока дейÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¾ÑтавшиеÑÑ Ð² живых монÑтры иÑчезают.~ +%atsymbol%111=~Призывание монÑтров V~ +%atsymbol%110=~Salamander spear +1d8 piercing +1d6 fire damage +do not translate~ +%atsymbol%109=~Frost salamander spear +1d8 piercing ++1d6 cold +do not trans~ +%atsymbol%108=~Саламандра~ +%atsymbol%107=~Саламандра~ +%atsymbol%106=~ЛедÑÐ½Ð°Ñ Ñаламандра~ +%atsymbol%105=~ЛедÑÐ½Ð°Ñ Ñаламандра~ +%atsymbol%104=~Призывание монÑтров VI +(Вызывание/Призывание) +Уровень: 8 +ДальноÑÑ‚ÑŒ: 20 футов +ДлительноÑÑ‚ÑŒ: 7 раундов + 1 раунд/уровень +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 8 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: оÑÐ¾Ð±Ð°Ñ +СпаÑброÑок: нет +Призывает 1d3 монÑтров шеÑтого уровнÑ. Они поÑвлÑÑŽÑ‚ÑÑ Ð² облаÑти дейÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¸ подчинÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð¸ÐºÐ°Ð·Ð°Ð¼ заклинателÑ, Ð°Ñ‚Ð°ÐºÑƒÑ ÐµÐ³Ð¾ врагов. По иÑтечении Ñрока дейÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¾ÑтавшиеÑÑ Ð² живых монÑтры иÑчезают.~ +%atsymbol%103=~Призывание монÑтров VI~ +%atsymbol%102=~Ðтака~ +%atsymbol%101=~Бурый увалень~ +%atsymbol%100=~Бурый увалень~ +%atsymbol%99=~КоÑÑ‚Ñной Ñтраж~ +%atsymbol%98=~КоÑÑ‚Ñной Ñтраж~ +%atsymbol%97=~Призывание монÑтров VII +(Вызывание/Призывание) +Уровень: 9 +ДальноÑÑ‚ÑŒ: 20 футов +ДлительноÑÑ‚ÑŒ: 8 раундов + 1 раунд/уровень +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 9 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: оÑÐ¾Ð±Ð°Ñ +СпаÑброÑок: нет +Призывает 1d2 монÑтров Ñедьмого или воÑьмого уровнÑ. Они поÑвлÑÑŽÑ‚ÑÑ Ð² облаÑти дейÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¸ подчинÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð¸ÐºÐ°Ð·Ð°Ð¼ заклинателÑ, Ð°Ñ‚Ð°ÐºÑƒÑ ÐµÐ³Ð¾ врагов. По иÑтечении Ñрока дейÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¾ÑтавшиеÑÑ Ð² живых монÑтры иÑчезают.~ +%atsymbol%96=~Призывание монÑтров VII~ +%atsymbol%95=~Призывание монÑтров IV +(Вызывание/Призывание) +Уровень: 6 +ДальноÑÑ‚ÑŒ: 20 футов +ДлительноÑÑ‚ÑŒ: 5 раундов + 1 раунд/уровень +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 6 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: оÑÐ¾Ð±Ð°Ñ +СпаÑброÑок: нет +Призывает 1d3 монÑтров четвертого уровнÑ. Они поÑвлÑÑŽÑ‚ÑÑ Ð² облаÑти дейÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¸ подчинÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð¸ÐºÐ°Ð·Ð°Ð¼ заклинателÑ, Ð°Ñ‚Ð°ÐºÑƒÑ ÐµÐ³Ð¾ врагов. По иÑтечении Ñрока дейÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¾ÑтавшиеÑÑ Ð² живых монÑтры иÑчезают.~ +%atsymbol%94=~Призывание монÑтров IV~ +%atsymbol%93=~Череп~ +%atsymbol%92=~Monster Transparency +Do not translate~ +%atsymbol%91=~Monster Transparancy Item~ +%atsymbol%90=~Тень~ +%atsymbol%89=~Тень~ +%atsymbol%88=~Призвать тень +(Вызывание/Призывание, ÐекромантиÑ) +Уровень: 5 +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: 1 раунд + 1 раунд/уровень +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 5 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: оÑÐ¾Ð±Ð°Ñ +СпаÑброÑок: нет +Призывает три тени Ñ ÑƒÑ€Ð¾Ð²Ð½ÐµÐ¼ Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ 4. Тени подчинÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð¸ÐºÐ°Ð·Ð°Ð¼ заклинателÑ, Ð°Ñ‚Ð°ÐºÑƒÑ ÐµÐ³Ð¾ врагов или выполнÑÑ Ð´Ñ€ÑƒÐ³Ð¸Ðµ заданиÑ, пока не будут убиты или не кончитÑÑ Ñрок дейÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ.~ +%atsymbol%87=~Призвать тень~ +%atsymbol%86=~Железный кулак~ +%atsymbol%85=~Железный кулак~ +%atsymbol%84=~Пораженный отвратительной болезнью~ +%atsymbol%83=~Болеет~ +%atsymbol%82=~Отравление~ +%atsymbol%81=~Яд~ +%atsymbol%80=~Железное тело +(Изменение) +Уровень: 8 +ДальноÑÑ‚ÑŒ: 0 +ДлительноÑÑ‚ÑŒ: 2 хода +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 8 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: на ÑÐµÐ±Ñ +СпаÑброÑок: нет +Тело Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ Ð¿Ñ€ÐµÐ²Ñ€Ð°Ñ‰Ð°ÐµÑ‚ÑÑ Ð² наÑтоÑщее железо и ÑтановитÑÑ Ñ‚Ð°ÐºÐ¸Ð¼ же крепким и уÑтойчивым к урону. Во Ð²Ñ€ÐµÐ¼Ñ Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¾Ð½ получает 100% ÑÐ¾Ð¿Ñ€Ð¾Ñ‚Ð¸Ð²Ð»ÐµÐ½Ð¸Ñ ÑлектричеÑтву, 50% ÑÐ¾Ð¿Ñ€Ð¾Ñ‚Ð¸Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ð³Ð½ÑŽ и 25% ÑÐ¾Ð¿Ñ€Ð¾Ñ‚Ð¸Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ñ€Ð¾Ð±Ñщему урону. ЗаклинаниÑ, влиÑющие на дыхание или физиологичеÑкие процеÑÑÑ‹ заклинателÑ, не дейÑтвуют. При Ñтом Ñила Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ Ð²Ð¾Ð·Ñ€Ð°Ñтает до 25, и он дважды за раунд атакует железными кулаками, наноÑÑ 2d4 единиц урона (Ð¿Ð»ÑŽÑ ÑоответÑтвующую прибавку по Ñиле). +К Ñожалению, Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ ÑтановÑÑ‚ÑÑ Ð¼ÐµÐ´Ð»ÐµÐ½Ð½Ñ‹Ð¼Ð¸ и неловкими: ÑкороÑÑ‚ÑŒ его Ð¿ÐµÑ€ÐµÐ´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ ÑнижаетÑÑ Ð´Ð¾ 25% от нормы, и он не может колдовать.~ +%atsymbol%79=~Железное тело~ +%atsymbol%78=~Без ÑознаниÑ~ +%atsymbol%77=~Великий крик +(ПроÑвление) +Уровень: 8 +ДальноÑÑ‚ÑŒ: 0 +ДлительноÑÑ‚ÑŒ: мгновенно +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 1 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: 15-градуÑный ÐºÐ¾Ð½ÑƒÑ Ð² 17 фут +СпаÑброÑок: Ñнижает урон вдвое +Заклинатель издает поразительно громкий крик, который раÑпроÑтранÑетÑÑ Ð² коничеÑкой облаÑти длиной в 17 футов и диаметром 15 футов. «Великий крик» — крайне Ñложное и опаÑное заклинание. Сам заклинатель получает 2d4 единицы урона и должен Ñделать ÑпаÑброÑок против заклинаниÑ, чтобы не потерÑÑ‚ÑŒ Ñознание на 1 ход. СущеÑтва в облаÑти дейÑтвиÑ, уровень Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… не выше 5, мгновенно погибают. ОÑтальные делают ÑпаÑброÑок против Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¸ при неудаче Ñтрадают от контузии на 2 раунда, лишаютÑÑ Ñлуха на 4 раунда и получают 4d12 единиц магичеÑкого урона. При уÑпешном ÑпаÑброÑке жертвы Ñтрадают от контузии на 1 раунд, лишаютÑÑ Ñлуха на 2 раунда и получают 2d12 урона.~ +%atsymbol%76=~Великий крик~ +%atsymbol%75=~Очарование~ +%atsymbol%74=~Жуткое очарование~ +%atsymbol%73=~Подчинение~ +%atsymbol%72=~Падение боевого духа: Паника~ +%atsymbol%71=~ОпьÑнение~ +%atsymbol%70=~ЗамешательÑтво~ +%atsymbol%69=~Ð’Ñзкое мышление~ +%atsymbol%68=~Удержание~ +%atsymbol%67=~Паралич~ +%atsymbol%66=~Удержание~ +%atsymbol%65=~ЧиÑтый разум +(Ограждение) +Уровень: 8 +ДальноÑÑ‚ÑŒ: 0 +ДлительноÑÑ‚ÑŒ: 24 чаÑа +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 1 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: на ÑÐµÐ±Ñ +СпаÑброÑок: нет +Оберегает Ñознание и мыÑли Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ Ð¾Ñ‚ чужого контролÑ. ПредоÑтавлÑет защиту практичеÑки от вÑех видов ментального воздейÑтвиÑ: очарованиÑ, лабиринта, приказа, ÑлабоумиÑ, замешательÑтва, Ñтраха, опьÑнениÑ, берÑерка, ÑƒÐ´ÐµÑ€Ð¶Ð°Ð½Ð¸Ñ Ð¸ окаменениÑ.~ +%atsymbol%64=~ЧиÑтый разум~ +%atsymbol%63=~Удушение +(Изменение) +Уровень: 7 +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: 4 раунда +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 7 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: в радиуÑе 7 футов +СпаÑброÑок: оÑобый +Ð’Ñе ÑущеÑтва в облаÑти дейÑÑ‚Ð²Ð¸Ñ Ñ‡ÑƒÐ²Ñтвуют удушье (те, кто не дышит воздухом, не подвержены дейÑтвию заклинаниÑ). Жертвы «УдушениÑ» получают ухудшение клаÑÑа защиты −4, такое же ухудшение к атаке, −6 к ловкоÑти, делают за раунд на одну атаку меньше, передвигаютÑÑ Ð²Ð´Ð²Ð¾Ðµ медленнее и получают 4d8 единиц магичеÑкого урона каждый раунд. УÑпешный ÑпаÑброÑок позволÑет Ñократить урон до 2d8 единиц за раунд и избежать оÑтальных Ñффектов. ПоÑледÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¿Ð¾Ñтепенно Ñойдут на нет, когда ÑущеÑтво покинет облаÑÑ‚ÑŒ дейÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ, но у него может уйти раунд на то, чтобы отдышатьÑÑ.~ +%atsymbol%62=~Удушение~ +%atsymbol%61=~КиÑÐ»Ð¾Ñ‚Ð½Ð°Ñ Ð±ÑƒÑ€Ñ +(Воплощение) +Уровень: 7 +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: 1 раунд/уровень +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 7 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: в радиуÑе 12 футов +СпаÑброÑок: Ñнижает урон вдвое +Ð’ облаÑти дейÑÑ‚Ð²Ð¸Ñ Ð²Ñ‹Ð¿Ð°Ð´Ð°ÐµÑ‚ киÑлотный дождь. Первые три раунда он наноÑит 1d4 урона от киÑлоты за раунд, Ñледующие три —1d6 за раунд, а каждый поÑледующий раунд — 1d8. Ð’Ñ‹Ð¹Ð´Ñ Ð¸Ð· зоны охвата, поÑтрадавшее ÑущеÑтво продолжает получать урон, так как киÑлота въедаетÑÑ Ð² кожу, и вÑе, кто находилÑÑ Ð² облаÑти дейÑÑ‚Ð²Ð¸Ñ Ð² момент произнеÑÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ, веÑÑŒ Ñрок его дейÑÑ‚Ð²Ð¸Ñ Ð¿Ð¾Ð»ÑƒÑ‡Ð°ÑŽÑ‚ урон. Пораженные киÑлотным дождем ÑущеÑтва каждый раунд делают ÑпаÑброÑок против заклинаниÑ, и еÑли он будет уÑпешным, то они получают в Ñтот раунд только половину урона.~ +%atsymbol%60=~КиÑлотный Шторм~ +%atsymbol%59=~СтойкоÑÑ‚ÑŒ Ñ‚Ñ€Ð¾Ð»Ð»Ñ +(ÐекромантиÑ) +Уровень: 6 +ДальноÑÑ‚ÑŒ: 0 +ДлительноÑÑ‚ÑŒ: 2 хода +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 6 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: на ÑÐµÐ±Ñ +СпаÑброÑок: нет +Заклинатель ÑтановитÑÑ Ñтойким, как тролль, и регенерирует 5 пунктов Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ ÐºÐ°Ð¶Ð´Ñ‹Ð¹ раунд, пока не воÑÑтановит здоровье полноÑтью.~ +%atsymbol%58=~СтойкоÑÑ‚ÑŒ троллÑ~ +%atsymbol%57=~Скелет~ +%atsymbol%56=~Скелет~ +%atsymbol%55=~Пожиратель душ +(ÐекромантиÑ) +Уровень: 6 +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: мгновенно +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 5 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: в радиуÑе 7 футов +СпаÑброÑок: нет +Ð’Ñе живые ÑущеÑтва в радиуÑе 7 футов получают 3d8 магичеÑкого урона. Те, кто при Ñтом погибает, иÑчезают навÑегда, а их ÑущноÑÑ‚ÑŒ воплощаетÑÑ Ð² виде подчиненных заклинателю Ñкелетов 3 ÑƒÑ€Ð¾Ð²Ð½Ñ Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ. Помимо Ñтого, за каждое убитое заклинанием ÑущеÑтво заклинатель на 1 ход получает прибавку +1 к Ñиле, ловкоÑти и телоÑложению. Ðежить, Ñлементали и механизмы не подвержены дейÑтвию Â«ÐŸÐ¾Ð¶Ð¸Ñ€Ð°Ñ‚ÐµÐ»Ñ Ð´ÑƒÑˆÂ».~ +%atsymbol%54=~Пожиратель душ~ +%atsymbol%53=~КоÑÑ‚Ñной дротик +3~ +%atsymbol%52=~КоÑÑ‚Ñной дротик~ +%atsymbol%51=~КоÑÑ‚Ñные дротики +(ÐекромантиÑ) +Уровень: 6 +ДальноÑÑ‚ÑŒ: 0 +ДлительноÑÑ‚ÑŒ: 5 раундов +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 5 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: на ÑÐµÐ±Ñ +СпаÑброÑок: нет +У Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ Ð² руках поÑвлÑетÑÑ Ð´ÐµÐ²ÑÑ‚ÑŒ дротиков, которые Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð±Ñ€Ð¾Ñить, пока не иÑтечет Ñрок дейÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ. Дротики зачарованы на +3, наноÑÑÑ‚ 1d4+3 единиц метательного урона, а пораженное ими ÑущеÑтво при провале ÑпаÑброÑка против Ñмерти получает дополнительно 2d6 единиц магичеÑкого урона и терÑет 3 единицы Ñилы на 5 раундов. Ухудшение Ñилы не ÑкладываетÑÑ Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ изменениÑми, а провал ÑпаÑброÑка не увеличивает продолжительноÑÑ‚ÑŒ его дейÑтвиÑ. Ðавык Ð¾Ð±Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ñ Ð´Ñ€Ð¾Ñ‚Ð¸ÐºÐ°Ð¼Ð¸ (или его отÑутÑтвие) никак не влиÑет на вероÑтноÑÑ‚ÑŒ поразить цель.~ +%atsymbol%50=~КоÑÑ‚Ñные дротики~ +%atsymbol%49=~Ð—Ð°Ð¼Ð¾Ñ€Ð°Ð¶Ð¸Ð²Ð°ÑŽÑ‰Ð°Ñ Ñфера Отилюка +(Изменение, Воплощение) +Уровень: 6 +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: мгновенно +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 6 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: одно ÑущеÑтво +СпаÑброÑок: отменÑет дейÑтвие +ÐаправлÑет в цель шар холода, который наноÑит 1d4+2 урона холодом за каждый уровень заклинателÑ. Ðо еÑли цель Ñделает удачный ÑпаÑброÑок против заклинаниÑ, она уклонÑетÑÑ Ð¾Ñ‚ цели и не получает никаких повреждений.~ +%atsymbol%48=~Ð—Ð°Ð¼Ð¾Ñ€Ð°Ð¶Ð¸Ð²Ð°ÑŽÑ‰Ð°Ñ Ñфера Отилюка~ +%atsymbol%47=~Саван пламени +(ПроÑвление) +Уровень: 5 +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: 1 раунд/2 ÑƒÑ€Ð¾Ð²Ð½Ñ (оÑобаÑ) +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 5 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: в радиуÑе 5 футов +СпаÑброÑок: отменÑет дейÑтвие +ЕÑли цель не Ñделает удачный ÑпаÑброÑок против заклинаниÑ, ее окутает пламÑ. СущеÑтво будет гореть, Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ 2d6 урона каждый раунд. Языки пламени, окружающего жертву, наноÑÑÑ‚ 1d4 урона от Ð¾Ð³Ð½Ñ Ð²Ñем ÑущеÑтвам в радиуÑе 12 футов. ЕÑли обожженный Ñзыком Ð¾Ð³Ð½Ñ Ð¿Ñ€Ð¾Ð²Ð°Ð»Ð¸Ñ‚ ÑпаÑброÑок, то тоже будет поражен Ñаваном пламени. Огонь раÑÑеиваетÑÑ, еÑли заклинатель и цель переÑтанут находитьÑÑ Ð² одной облаÑти. Это заклинание оÑобенно полезно Ð´Ð»Ñ Ð¸ÑÑ‚Ñ€ÐµÐ±Ð»ÐµÐ½Ð¸Ñ Ð³Ñ€ÑƒÐ¿Ð¿ троллей и ледÑных Ñаламандр.~ +%atsymbol%46=~Саван пламени~ +%atsymbol%45=~КиÑлотный шар +(Вызывание) +Уровень: 4 +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: оÑÐ¾Ð±Ð°Ñ +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 4 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: в радиуÑе 5 футов +СпаÑброÑок: оÑобый +Заклинатель может направить в любую цель в облаÑти дейÑÑ‚Ð²Ð¸Ñ ÑветÑщийÑÑ Ð¸Ð·ÑƒÐ¼Ñ€ÑƒÐ´Ð½Ð¾-зеленый шар киÑлоты. Попав в цель, он взрываетÑÑ, Ð¾Ð±Ð»Ð¸Ð²Ð°Ñ Ð¶ÐµÑ€Ñ‚Ð²Ñƒ киÑлотой. Цель получает 1d4 единицы урона киÑлотой на каждый уровень Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ Ð²Ð¿Ð»Ð¾Ñ‚ÑŒ до макÑимума в 12d4 единиц. ÐеÑколько Ñледующих раундов она получает вторичный урон, еÑли провалит ÑпаÑброÑок. С каждым раундом урон уменьшаетÑÑ Ð½Ð° два броÑка: так, «КиÑлотный шар» волшебника 8-го ÑƒÑ€Ð¾Ð²Ð½Ñ Ð½Ð°Ð½Ð¾Ñит 8d4 единиц урона за первый раунд, 6d4 за второй, 4d4 за третий, 2d4 за четвертый, а на пÑтый раунд заклинание прекращает дейÑтвовать. Каждый раунд жертва может Ñделать ÑпаÑброÑок против заклинаниÑ, чтобы избежать дальнейших повреждений. +Кроме того, шар разбрызгивает киÑлоту на раÑÑтоÑние до 5 футов от цели. Любое ÑущеÑтво в Ñтой облаÑти должно Ñделать ÑпаÑброÑок против превращений/паралича, иначе его поразÑÑ‚ брызги, наноÑÑщие 1d4 урона на каждые пÑÑ‚ÑŒ уровней заклинателÑ. Вторичного урона брызги не наноÑÑÑ‚.~ +%atsymbol%44=~КиÑлотный шар~ +%atsymbol%43=~Глухота~ +%atsymbol%42=~Крик +(ПроÑвление) +Уровень: 4 +ДальноÑÑ‚ÑŒ: 0 +ДлительноÑÑ‚ÑŒ: мгновенно +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 1 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: 15-градуÑный ÐºÐ¾Ð½ÑƒÑ Ð² 17 футов +СпаÑброÑок: оÑобый +Ð“Ð¾Ð»Ð¾Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ ÑтановитÑÑ Ð½ÐµÐ²ÐµÑ€Ð¾Ñтно мощным, и он может издать оглушительный рев, который раÑпроÑтранÑетÑÑ Ð² форме конуÑа. Любое ÑущеÑтво в облаÑти дейÑÑ‚Ð²Ð¸Ñ Ð³Ð»Ð¾Ñ…Ð½ÐµÑ‚ на 9 раундов и получает 4d6 единиц магичеÑкого урона. ЕÑли жертва Ñделает уÑпешный ÑпаÑброÑок против заклинаниÑ, то не оглохнет и получит только половину урона.~ +%atsymbol%41=~Крик~ +%atsymbol%40=~Силовые ÑнарÑды Морденкайнена +(ПроÑвление) +Уровень: 4 +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: мгновенно +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 4 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: в радиуÑе 2 футов +СпаÑброÑок: оÑобый +Из руки Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ Ð²Ñ‹Ð»ÐµÑ‚Ð°ÐµÑ‚ Ñверкающий шар магичеÑкой Ñнергии, который уÑтремлÑетÑÑ Ðº цели и без промаха поражает ее, как магичеÑкий ÑнарÑд. Ðа 7-м уровне волшебник может выпуÑтить один ÑнарÑд, а за каждые три ÑƒÑ€Ð¾Ð²Ð½Ñ Ð¿Ð¾Ñле 7-го получает один дополнительный: на 10-м уровне — два ÑнарÑда, на 13-м — три и так далее, до шеÑти ÑнарÑдов на 25-м уровне. Каждый ÑнарÑд наноÑит 2d4 единицы магичеÑкого урона и затем взрываетÑÑ, Ð¿Ð¾Ñ€Ð°Ð¶Ð°Ñ Ð²Ñех в радиуÑе 2 футов и наноÑÑ Ð¿Ñ€Ð¸ Ñтом 1 единицу урона на каждый уровень заклинателÑ. К примеру, волшебник 12-го ÑƒÑ€Ð¾Ð²Ð½Ñ Ñоздает два ÑнарÑда, каждый из которых наноÑит 2d4+12 единиц урона. СпаÑброÑок против Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ñет уклонитьÑÑ Ð¾Ñ‚ взрыва, но урона непоÑредÑтвенно от зарÑда таким образом избежать нельзÑ. МагичеÑкое заклинание 1-го ÑƒÑ€Ð¾Ð²Ð½Ñ Â«Ð©Ð¸Ñ‚Â» поглощает Ñиловые ÑнарÑды и урон от взрыва.~ +%atsymbol%39=~Силовые ÑнарÑды Морденкайнена~ +%atsymbol%38=~БезнадежноÑÑ‚ÑŒ~ +%atsymbol%37=~КонтузиÑ~ +%atsymbol%36=~ЭмоциÑ: БезнадежноÑÑ‚ÑŒ +(Зачарование/Очарование) +Уровень: 4 +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: 1 ход +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 4 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: в радиуÑе 7 футов +СпаÑброÑок: отменÑет дейÑтвие +Вызывает чувÑтво безнадежноÑти у вÑех ÑущеÑтв в облаÑти дейÑтвиÑ. Ð’Ñе ÑущеÑтва, провалившие ÑпаÑброÑок против заклинаниÑ, будут ÑтоÑÑ‚ÑŒ на меÑте и ничего не делать в течение 1 хода. Ð’ момент Ð¿Ñ€Ð¾Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñет вÑе Ñффекты Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Â«Ð­Ð¼Ð¾Ñ†Ð¸Ñ: Ðадежда» в облаÑти дейÑтвиÑ.~ +%atsymbol%35=~ЭмоциÑ: БезнадежноÑÑ‚ÑŒ~ +%atsymbol%34=~Ð’ панике~ +%atsymbol%33=~ЭмоциÑ: Страх +(Зачарование/Очарование) +Уровень: 4 +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: 5 раундов +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 4 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: в радиуÑе 7 футов +СпаÑброÑок: отменÑет дейÑтвие +РаÑпроÑтранÑет Ñтрах в облаÑти дейÑтвиÑ. Ð’Ñе ÑущеÑтва, подвергшиеÑÑ ÐµÐ³Ð¾ воздейÑтвию, на 5 раундов бегут Ñ Ð¿Ð¾Ð»Ñ Ð±Ð¾Ñ. Ð’ момент Ð¿Ñ€Ð¾Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñет Ñффект Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Â«Ð­Ð¼Ð¾Ñ†Ð¸Ñ: Отвага» в облаÑти дейÑтвиÑ.~ +%atsymbol%32=~ЭмоциÑ: Страх~ +%atsymbol%31=~ЭмоциÑ: Ðадежда +(Зачарование/Очарование) +Уровень: 4 +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: 1 Ñ‡Ð°Ñ +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 4 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: в радиуÑе 7 футов +СпаÑброÑок: нет +РаÑпроÑтранÑет надежду в облаÑти дейÑтвиÑ. Ð’Ñе ÑущеÑтва, подвергшиеÑÑ Ð²Ð¾Ð·Ð´ÐµÐ¹Ñтвию заклинаниÑ, повышают Ñвой боевой дух и получают улучшение +2 ко вÑем ÑпаÑброÑкам, броÑкам атаки и урона. Ð’ момент Ð¿Ñ€Ð¾Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñет Ñффект Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Â«Ð­Ð¼Ð¾Ñ†Ð¸Ñ: БезнадежноÑть» в облаÑти дейÑтвиÑ.~ +%atsymbol%30=~ЭмоциÑ: Ðадежда~ +%atsymbol%29=~ЭмоциÑ: Отвага +(Зачарование/Очарование) +Уровень: 4 +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: 1 Ñ‡Ð°Ñ +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 4 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: в радиуÑе 7 футов +СпаÑброÑок: нет +РаÑпроÑтранÑет отвагу в облаÑти дейÑтвиÑ. Ð’Ñе ÑущеÑтва, подвергшиеÑÑ Ð²Ð¾Ð·Ð´ÐµÐ¹Ñтвию заклинаниÑ, получают +1 к атаке, +3 к броÑкам на урон и +5 временных пунктов Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ (в Ñумме пункты Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ Ð¼Ð¾Ð³Ñƒ превышать нормальный макÑимум). Ð’ момент Ð¿Ñ€Ð¾Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñет вÑе Ñффекты Ñтраха в облаÑти дейÑтвиÑ.~ +%atsymbol%28=~ЭмоциÑ: Отвага~ +%atsymbol%27=~БерÑерк~ +%atsymbol%26=~ГорÑÑ‰Ð°Ñ ÐºÑ€Ð¾Ð²ÑŒ Бельтина +(ÐекромантиÑ) +Уровень: 4 +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: 1 раунд/2 ÑƒÑ€Ð¾Ð²Ð½Ñ +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 4 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: одно ÑущеÑтво +СпаÑброÑок: отменÑет дейÑтвие +Превращает кровь цели в огонь, Ð¾Ñ‚Ð½Ð¸Ð¼Ð°Ñ 3d4 пункта Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ ÐºÐ°Ð¶Ð´Ñ‹Ð¹ раунд и Ð¿Ñ€Ð¸Ð²Ð¾Ð´Ñ Ñ†ÐµÐ»ÑŒ в ÑроÑÑ‚ÑŒ от боли. Каждый раунд жертва делает ÑпаÑброÑок против заклинаниÑ, уÑпешный ÑпаÑброÑок отменÑет урон и ÑоÑтоÑние ÑроÑти. Заклинание не дейÑтвует на нежить и инопланарных ÑущеÑтв, не имеющих крови (например, Ñлементалей). ЕÑли ÑущеÑтво обладает Ñопротивлением огню, оно уменьшает или нейтрализует урон от заклинаниÑ.~ +%atsymbol%25=~ГорÑÑ‰Ð°Ñ ÐºÑ€Ð¾Ð²ÑŒ Белтина~ +%atsymbol%24=~Копье Ñ€Ð°Ð·Ñ€ÑƒÑˆÐµÐ½Ð¸Ñ +(ПроÑвление) +Уровень: 3 +ДальноÑÑ‚ÑŒ: 100 футов +ДлительноÑÑ‚ÑŒ: мгновенно +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 3 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: оÑÐ¾Ð±Ð°Ñ +СпаÑброÑок: Ñнижает урон вдвое +Из руки Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ Ð² указанную точку на раÑÑтоÑнии до 100 футов от него летит Ñиловое копье. Каждое ÑущеÑтво на пути ÐºÐ¾Ð¿ÑŒÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð°ÐµÑ‚ 5d4 единиц дробÑщего урона + 2 единицы на каждый уровень Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ (макÑимум +30). УÑпешный ÑпаÑброÑок против Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ñнижает урон вдвое.~ +%atsymbol%23=~Копье разрушениÑ~ +%atsymbol%22=~КонтузиÑ~ +%atsymbol%21=~ЛедÑное копье +(Воплощение) +Уровень: 3 +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: мгновенно +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 3 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: одно ÑущеÑтво +СпаÑброÑок: оÑобый +БроÑает волшебное копье в выбранную цель. Оно попадает автоматичеÑки и наноÑит 5d6 единиц урона от холода. ЗаÑтавлÑет цель Ñделать ÑпаÑброÑок против Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¸ при провале контузит ее на 3 раунда.~ +%atsymbol%20=~ЛедÑное копье~ +%atsymbol%19=~Изменение ловкоÑти~ +%atsymbol%18=~ÐšÐ¾ÑˆÐ°Ñ‡ÑŒÑ Ð³Ñ€Ð°Ñ†Ð¸Ñ +(Изменение) +Уровень: 2 +ДальноÑÑ‚ÑŒ: каÑание +ДлительноÑÑ‚ÑŒ: 1 чаÑ/уровень +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 2 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: одно ÑущеÑтво +СпаÑброÑок: нет +ЛовкоÑÑ‚ÑŒ цели увеличиваетÑÑ Ð¼Ð°Ð³Ð¸Ñ‡ÐµÑким ÑпоÑобом. Прибавка завиÑит от клаÑÑа: у плутов ловкоÑÑ‚ÑŒ возраÑтает на 1d8 единиц, у воинов и волшебников на 1d6, а у жрецов на 1d4. При Ñтом значение характериÑтики не может превыÑить 20.~ +%atsymbol%17=~ÐšÐ¾ÑˆÐ°Ñ‡ÑŒÑ Ð³Ñ€Ð°Ñ†Ð¸Ñ~ +%atsymbol%16=~МегапоÑох~ +%atsymbol%15=~МегапоÑох~ +%atsymbol%14=~МегапоÑох +(Воплощение) +Уровень: 2 +ДальноÑÑ‚ÑŒ: 0 +ДлительноÑÑ‚ÑŒ: 3 раунда + 1 раунд/уровень +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 2 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: на ÑÐµÐ±Ñ +СпаÑброÑок: нет +Ð’ руке Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ Ð¿Ð¾ÑвлÑетÑÑ Ñиловое поле, принимающее форму поÑоха. Он раÑцениваетÑÑ ÐºÐ°Ðº магичеÑкое оружие и может поражать ÑущеÑтв, имеющих иммунитет к обычному оружию. ЕÑли у Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ Ð½ÐµÑ‚ навыка Ð²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñохом, применÑÑŽÑ‚ÑÑ Ð¾Ð±Ñ‹Ñ‡Ð½Ñ‹Ðµ штрафы за незнакомое оружие. ПоÑох наноÑит 1d6 единиц урона при каждом ударе, а при первом попадании по цели вытÑгивает у противника 1d2 пунктов Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ Ð¸ передает их заклинателю. Эти пункты могут лишь воÑÑтанавливать здоровье заклинателÑ, но не превышать его макÑимум.~ +%atsymbol%13=~МегапоÑох~ +%atsymbol%12=~~ +%atsymbol%11=~Снегопад Сниллока +(Воплощение) +Уровень: 2 +ДальноÑÑ‚ÑŒ: поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ +ДлительноÑÑ‚ÑŒ: мгновенно +Ð’Ñ€ÐµÐ¼Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: 2 +ОблаÑÑ‚ÑŒ дейÑтвиÑ: в радиуÑе 15 футов +СпаÑброÑок: Ñнижает урон вдвое +Шквал Ñнежков вырываетÑÑ Ð¸Ð· выбранной заклинателем точки. Снежки поражают вÑех в облаÑти дейÑÑ‚Ð²Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ, наноÑÑ 1d3 единиц урона от холода за уровень Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ñ‚ÐµÐ»Ñ (макÑимальный урон 8d3 единиц на 8 уровне). СущеÑтвам, иÑпользующим огонь или живущим в нём, заклинание наноÑит 1d6 единиц урона на уровень (макÑимальный урон 8d6 единиц на 8 уровне).~ +%atsymbol%10=~~ +%atsymbol%9=~Снегопад Сниллока~ +%atsymbol%8=~Око разума блокирует воздейÑтвие и иÑчезает.~ +%atsymbol%7=~Око меча блокирует воздейÑтвие и иÑчезает.~ +%atsymbol%6=~Око мага блокирует воздейÑтвие и иÑчезает.~ +%atsymbol%5=~Око Ñда блокирует воздейÑтвие и иÑчезает.~ +%atsymbol%4=~Око духа блокирует воздейÑтвие и иÑчезает.~ +%atsymbol%3=~Око ÑтойкоÑти блокирует воздейÑтвие и иÑчезает.~ +%atsymbol%2=~Око ÐºÐ°Ð¼Ð½Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€ÑƒÐµÑ‚ воздейÑтвие и иÑчезает.~ +%atsymbol%1=~ИÑцелÑет выбранного перÑонажа, воÑÑÑ‚Ð°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°Ñ 11 пунктов здоровьÑ.~ diff --git a/iwdification/dw_iwdspells_resource/tra/tr_tr/iwdspells.tra b/iwdification/dw_iwdspells_resource/tra/tr_tr/iwdspells.tra new file mode 100644 index 0000000..5ccd66e --- /dev/null +++ b/iwdification/dw_iwdspells_resource/tra/tr_tr/iwdspells.tra @@ -0,0 +1,1173 @@ +@359=~Cesaret~ +@358=~Umut~ +@357=~Kedi Zarafeti~ +@356=~Ä°nananın Haklı Gazabı~ +@355=~Dua~ +@354=~Kan Öfkesi~ +@353=~Kıraat~ +@352=~Yüceltme~ +@351=~Hayvan Öfkesi~ +@350=~Demirden Vücut~ +@349=~TaÅŸlaÅŸmış~ +@348=~Zihnin Sarsılmaz MukaddesliÄŸi~ +@347=~Acı~ +@346=~Fazlandı~ +@345=~Destek~ +@344=~Zihin BoÅŸaltımı~ +@343=~Toprak Elementali Dönüşümü~ +@342=~AteÅŸ Elementali Dönüşümü~ +@341=~Sith'in SavaÅŸ Ä°lahisi -Zırh Bonusları ve Tazeleme~ +@340=~"Sith'in SavaÅŸ Ä°lahisi" +9 mt içindeki tüm müttefikler Zırh Seviyesi'ne +2 bonus; kesme, delme, ezme hasarları ile menzilli hasarına karşı +%10 direnç ve tur başına 2 Can Puanı tazeleme kabiliyeti kazanır.~ +@339=~War Chant of Sith~ +@338=~Enthralled~ +@337=~Sirenin Hasreti - Yaratıkları KöleleÅŸtirme~ +@336=~"Sirenin Hasreti" +9 mt içindeki tüm müttefikler büyüye karşı kurtarış gerçekleÅŸtirmelidir. BaÅŸarısız olurlarsa ya büyülenir ve 1 raunt boyunca eylem gerçekleÅŸtiremez ya da hasar alırlar.~ +@335=~The Siren's Yearning~ +@334=~Kaudies'in Åžarkısı - Ses Saldırılarına Direnç~ +@333=~"Kaudies'in Åžarkısı" +9 m içindeki tüm müttefikler Sustur, Nara, Etkili Nara, Buyruk, Büyük Buyruk ve diÄŸer her türlü ses tabanlı saldırılara karşı %50 etkilenmeme olasılığı elde ederler.~ +@332=~The Song of Kaudies~ +@331=~Tymora'nın Ezgisi - Åžans ve Yetenek Bonusları~ +@330=~"Tymora'nın Ezgisi" +9 mt içindeki tüm müttefikler ÅŸansa +1, Kurtarış Zarları'na +3, kültüre +10 ve tüm hırsızlık yeteneklerine +%10 bonus kazanır.~ +@329=~Tymora's Melody~ +@328=~Curran Güçlüyürek'in Hikayesi - Korkuya Bağışıklık~ +@327=~"Curran Güçlüyürek'in Hikayesi" +9 mt içindeki tüm müttefikler ÅŸarkı sona erinceye kadar korku etkilerine karşı bağışıklık kazanır ve üzerlerindeki mevcut korku etkileri ortadan kalkar.~ +@326=~Curran Güçlüyürek'in Hikayesi~ +@325=~Üç Kahramanın Balatı - Dövüş Bonusları~ +@324=~"Üç Kahramanın Balatı" +9 m içindeki tüm müttefikler vurabilmeye +1, hasara +1 ve tüm Kurtarış Zarları'na +1 kazanır.~ +@323=~Üç Kahramanın Balatı~ +@322=~Asidik Buhar Çıkartıyor~ +@321=~Kurutma~ +@320=~Kurutma +(Ölüm Ä°lmi) +Seviye: 7 +Küre: Ä°yileÅŸtirme +Menzil: Temas +Etki Süresi: 1 raunt/2 seviye +Büyü Yapma Süresi: 7 +Etki Alanı: 1 yaratık +Kurtarış Zarı: Etkisiz +Bu kuvvetli büyü temas edilen yaratığın, -4 ceza puanıyla Ölüme Karşı Kurtarış yapmadığı müddetçe, organlarının iÅŸleyiÅŸine son vermesine ve kuruyup gitmesine sebep olur. Etkilenen yaratık saniyede 3 Can Puanı'nı kaybeder. Etkisi büyü bozuluncaya ya da rahibin her 2 seviyesi başına 1 raunt doluncaya kadar devam eder. ÖrneÄŸin 14. seviyedeki bir rahip hedefteki yaratığın 7 raunt boyunca raunt başına 18 Can Puanı kaybetmesine sebep olur. Bu büyünün hortlaklar, yapılar ya da düzlemdışı yaratıklar üzerinde etkisi yoktur; iyi yönelimli karakterlerce yapılamaz.~ +@319=~Kurutma~ +@318=~Ä°lahi (Çağırma) +Seviye: 2 +Küre: Çarpışma +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: 1 tur +Büyü Yapma Süresi: 1 raunt +Etki Alanı: 9 mt yarıçapında +Kurtarış Zarı: Yok +Ä°lahi büyüsü aracılığıyla rahip kendisine ve grubuna özel bir lütuf bahÅŸedilmesini saÄŸlarken düşmanlarında zarara sebep olur. Ä°lahi büyüsü tamamlandığında etki alanı içindeki rahibin tüm müttefikleri saldırı, hasar ve kurtarış zarlarına +1 kazanırken düşmanları ise saldırı, hasar ve kurtarışlarına -1 ceza alırlar. Birden çok Ä°lahi büyüsünün etkisi üst üste eklenmez. Bu büyünün yapılışı icracının orta derecede konsantrasyonunu gerektirir; yani Ä°lahi'nin süresi boyunca rahip herhangi bir büyü icra edemez ve hareket hızı yarıya düşer.~ +@317=~Ä°lahi~ +@316=~Fart Repellent for Bombardier Beetles. +Do not translate~ +@315=~Delici Böcek~ +@314=~Delici Böcek~ +@313=~Topçu BöceÄŸi~ +@312=~Topçu BöceÄŸi~ +@311=~Dev Böcek (BaÅŸkalaşım) +Seviye: 4 +Küre: Hayvan +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: 8 saat +Büyü Yapma Süresi: 7 +Etki Alanı: 1-6 böcek +Kurtarış Zarı: Yok +Bu büyü icracı için küçük böcekler çağırır, sonra da onları devasa boyutlara getirerek korkunç müttefiklere çevirir. Böceklerin gücü ve türü icracının seviyesine baÄŸlı olarak deÄŸiÅŸir; icracının seviyesi ne kadar yüksekse çaÄŸrılan böcekler de o kadar güçlü olur.~ +@310=~Dev Böcek~ +@309=~Ağır Yaralar Açış +(Ölüm Ä°lmi) +Seviye: 5 +Küre: Ä°yileÅŸtirme +Menzil: Temas +Etki Süresi: Anında +Büyü Yapma Süresi: 8 +Etki Alanı: 1 yaratık +Kurtarış Zarı: 1/2 +Bu büyüyü yapıp elini bir yaratığın üzerine koyduÄŸunda rahip yaratığın bedenine 27 puanlık hasar (yarım hasar için kurtarış zarı) verir. Bu büyünün hortlaklarda, yapılarda, düzlemdışı yaratıklarda etkisi yoktur. Ağır Yaralar Açış büyüsü yalnızca kötü karakterlerce yapılabilir.~ +@308=~Ağır Yaralar Açış~ +@307=~Ciddi Yaralar Açış +(Ölüm Ä°lmi) +Seviye: 4 +Küre: Ä°yileÅŸtirme +Menzil: Temas +Etki Süresi: Anında +Büyü Yapma Süresi: 5 +Etki Alanı: 1 yaratık +Kurtarış Zarı: 1/2 +Bu büyüyü yapıp elini bir yaratığın üzerine koyduÄŸunda rahip yaratığın bedenine 17 puanlık hasar (yarı-hasar için kurtarış zarı) verir. Bu büyünün hortlaklarda, yapılarda veya düzlemdışı yaratıklarda etkisi yoktur. Ciddi Yaralar Açış büyüsü iyi yönelimli karakterlerce yapılamaz.~ +@306=~Ciddi Yaralar Açış~ +@305=~Ä°ki Seviye Emildi~ +@304=~Enerji SoÄŸurma +(Ölüm Ä°lmi) +Seviye: 7 +Küre: Ölüm Ä°lmi +Menzil: Temas +Etki Süresi: Sürekli +Büyü Yapma Süresi: 3 +Etki Alanı: 1 yaratık +Kurtarış Zarı: Yok +Bu büyüyü yapmak büyü icracısının düzlemi ile Negatif Enerji Düzlemi arasında bir kanal açar. Ä°cracı iki düzlem arasında nakil hattı görevi görür; kurbanın yaÅŸamını emerek bunu Negatif Enerji Düzlemi'ne aktarır ve 2 seviyelik tecrübesini soÄŸurur. Büyünün hedefindeki seviyelerini, Can Zarları'nı, Can Puanları'nı ve kabiliyetlerini kalıcı olarak kaybeder. Bu seviyeler sadece bir rahibin Onarım büyüsüyle geri alınabilir. Bu büyünün hortlaklar, yapılar ya da düzlemdışı yaratıklar üzerinde etkisi yoktur; iyi yönelimli karakterlerce yapılamaz.~ +@303=~Enerji SoÄŸurma~ +@302=~SarmaÅŸtırılmış~ +@301=~Ayak Sürüyen Tepecik~ +@300=~Ayak Sürüyen Tepecik~ +@299=~Ä°zsüren (Çağırma) +Seviye: 7 +Küre: Bitki +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: 8 saat +Büyü Yapma Süresi: 1 raunt +Etki Alanı: Özel +Kurtarış Zarı: Yok +Bu büyü iki ayak sürüyen tepecik yaratır. Bu yaratıklar kendi rızalarıyla icracıya dövüşte yardımcı olur ya da kendilerine verilen, kabiliyetleri dahilindeki diÄŸer görevleri yerine getirir.~ +@298=~Ä°zsüren~ +@297=~Eldath'ın Sisi (OluÅŸturma) +Seviye: 7 +Küre: Elemental +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: 1 raunt +Büyü Yapma Süresi: 1 raunt +Etki Alanı: 3 mt yarıçapında +Kurtarış Zarı: Yok +Bu büyü etki alanını gümüş-mavi bir sisle örter - sisin içindeki tüm yaratıkların hastalıkları tedavi olur, zehirden arınırlar ve 25 puanlık hasarları iyileÅŸir.~ +@296=~Eldath'ın Sisi~ +@295=~Lathander'ın Büyük Kalkanı +(Çağırma) +Seviye: 7 +Küre: Muhafız +Menzil: Temas +Etki Süresi: 3 raunt +Büyü Yapma Süresi: 9 +Etki Alanı: 1 yaratık +Kurtarış Zarı: Yok +Bu büyü hedefe, büyünün etki süresi boyunca %100 büyü direnci ve hasara karşı bağışıklık bahÅŸeder. Kötü yönelimli karakterler Lathander'ın Büyük Kalkanı'nca korunamazlar. Bu büyü sadece iyi yönelimli karakterlerce yapılabilir.~ +@294=~Lathander'ın Büyük Kalkanı~ +@293=~Ä°mha (Ölüm Ä°lmi) +Seviye: 7 +Küre: Ä°yileÅŸtirme +Menzil: Temas +Etki Süresi: Anında +Büyü Yapma Süresi: 1 raunt +Etki Alanı: Büyü Ä°cracısı +Kurtarış Zarı: Özel +Bu büyü bir hedefi anında imha eder; onu patlatarak küçük parçalara ayırır. Kurbanın -4 ile ölüme karşı kurtarış yapmasına izin verilir; baÅŸarılı olursa hedef imha olmak yerine 8z6 puanlık hasar alır. Ä°mha yalnızca kötü karakterlerce yapılabilir. Ä°mha büyüsüyle vurulan bir karakterin Ölü Kaldırma ya da DiriltiÅŸ büyüleriyle ölümden döndürülemeyeceÄŸi unutulmamalıdır.~ +@292=~Ä°mha~ +@291=~Büyü Etkisiz~ +@290=~Zihnin Sarsılmaz MukaddesliÄŸi +(Sakınma) +Seviye: 7 +Küre: Koruma +Menzil: Ä°cracı +Etki Süresi: 1 tur/seviye +Büyü Yapma Süresi: 1 raunt +Etki Alanı: Büyü Ä°cracısı +Kurtarış Zarı: Yok +Bu büyü icracının zihnini her türlü dış etkiye karşı çelik gibi saÄŸlamlaÅŸtırır. Büyü etkin olduÄŸu müddetçe Ä°cracıya yöneltilen Efsun, Buyruk, ÅžaÅŸkınlık, Hakimiyet, Korku, AptallaÅŸtırma, SabitleyiÅŸ, Uyku büyüleri ile her türlü zihinsel saldırı baÅŸarısızlığa uÄŸrar.~ +@289=~Zihnin Sarsılmaz MukaddesliÄŸi~ +@288=~Umutsuzluk Sembolü +(Çağırma) +Seviye: 7 +Küre: Muhafız +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: 2 tur +Büyü Yapma Süresi: 3 +Etki Alanı: 18 mt yarıçapında +Kurtarış Zarı: Etkisiz +ZikredildiÄŸinde umutsuzluk sembolünün 18 metre etki alanı içindeki tüm yaratıklar -2 ceza ile büyüye karşı kurtarış zarı atmalıdır. BaÅŸarısız olanlar moral bozukluÄŸu ve pes etmiÅŸlik içinde olduÄŸu yerde durur; kendilerini saldırılardan korumak için hiçbir hareket yapmazlar.~ +@287=~Umutsuzluk Sembolü~ +@286=~Harap Eden Acılar~ +@285=~Acı Sembolü +(Çağırma) +Seviye: 7 +Küre: Muhafız +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: 2-20 tur +Büyü Yapma Süresi: 3 +Etki Alanı: 18 mt yarıçapında +Kurtarış Zarı: Etkisiz +ZikredildiÄŸinde Acı Sembolü'nün 18 metre etki alanı içindeki tüm yaratıklar büyüye karşı kurtarış zarı atmalıdır. BaÅŸarısız olanlar acıya yenik düşerler; saldırı zarlarına -4, Çeviklikler'ine -2 ve Zırh Seviyeleri'ne -2 alırlar.~ +@284=~Acı Sembolü~ +@283=~Ruhani Gazap (OluÅŸturma) +Seviye: 6 +Küre: Çarpışma +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: Anında +Büyü Yapma Süresi: 2 +Etki Alanı: Özel +Kurtarış Zarı: 1/2 +Bu büyüyü tamamladığında rahip ruhani enerjinin bir odak noktası haline gelir; daha sonra bu enerji yıldırım gibi icracıdan fırlayarak dört bir yana gider. Ä°cracı ışınlardan biri için bir yön belirler ve diÄŸer ışınlar o yönün zıttı ile dikeyleri yönünde hızla hareket eder; çarpı ÅŸeklinde bir yapı oluÅŸturur. Işınların yolundaki tüm yaratıklar 6-42 puanlık büyü hasarı alır, kurtarış zarı hasarı yarıya indirir. Ä°cracıyla aynı ahlaki yönelime (iyi, tarafsız, kötü) sahip yaratıklar büyüden etkilenmez.~ +@282=~Ruhani Gazap~ +@281=~Hortum +(OluÅŸturma) +Seviye: 6 +Küre: Elemental (Hava) +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: Özel +Büyü Yapma Süresi: 9 +Etki Alanı: Özel +Kurtarış Zarı: Özel +Bu büyü icracının yakınında, geliÅŸigüzel savrulan, dost düşman ayırt etmeksizin önüne gelene zarar veren bir hortum oluÅŸturur. Ä°cracı kendi büyüsünden etkilenmez; ayrıca elementaller ve diÄŸer devasa yaratıklar da büyüden etkilenmez. Åžayet bir yaratık hortumun yoluna çıkacak olursa 2z8 ezme hasarı, 2z8 kesme hasarı alır ve nefese karşı kurtarış gerçekleÅŸtirmelidir, aksi takdirde 2 raunt boyunca sersemler. Büyü 2 can zarı ya da daha azına sahip yaratıkları anında öldürür. Büyüden en fazla 8 hedef etkilenebilir, bundan sonra hortum dağılarak yok olur.~ +@280=~Hortum~ +@279=~Entropi Kalkanı (Sakınma) +Seviye: 6 +Küre: Koruma +Menzil: Ä°cracı +Etki Süresi: 1 raunt/seviye +Büyü Yapma Süresi: 9 +Etki Alanı: Büyü Ä°cracısı +Kurtarış Zarı: Yok +Yapıldığında bu büyü icracıyı, pek çok saldırıyı bloklayan ya da saptıran savunma amaçlı bir enerji girdabıyla çevreler. Büyü rahibin zırh seviyesine +6 bonus verir ve çoÄŸu saldırı biçimine karşı %50lik direnç kazandırır: elektrik, ateÅŸ, soÄŸuk, vb gibi. Ayrıca icracının tüm kurtarış zarlarına +2 verir ve tüm menzilli saldırılara karşı bağışıklık saÄŸlar.~ +@278=~Entropi Kalkanı~ +@277=~Toplu Hafif Yaralar Açış +(Ölüm Ä°lmi) +Seviye: 5 +Küre: Ä°yileÅŸtirme +Menzil: 0 +Etki Süresi: Anında +Büyü Yapma Süresi: 5 +Etki Alanı: 9 mt yarıçapında +Kurtarış Zarı: 1/2 +Bu büyüyü yaparak rahip yakındaki düşmanlara sahip olduÄŸu her seviye başına 1z8+1'lik hasar verir; baÅŸarılı bir Büyüye Karşı Kurtarış hasarı yarıya indirir. Bu büyünün hortlaklarda, yapılarda ya da düzlemdışı yaratıklarda etkisi yoktur. Ä°yi yönelimli karakterlerce yapılamaz.~ +@276=~Toplu Hafif Yaralar Açış~ +@275=~Hayvan Öfkesi (Efsunlama) +Seviye: 5 +Küre: Çarpışma +Menzil: Temas +Etki Süresi: 15 raunt +Büyü Yapma Süresi: 8 +Etki Alanı: 1 yaratık +Kurtarış Zarı: Yok +Bu büyü hedefteki yaratığa hayvani bir vahÅŸilik aşılar. Hedefteki yaratığın kuvveti 19 olur, can puanına +20, hareket hızına +%20 ve tüm kurtarış zarlarına +2 kazanır. Hayvan Öfkesi etkinken hedef büyü icra etme kabiliyetini kaybeder. Görünürde düşman olmadığı müddetçe normal ÅŸekilde kontrol edilebilir; ancak düşman görürse elinde her ne varsa onunla anında yakın dövüşle saldırır. Her rauntta hedefin %5 cinnet geçirme olasılığı vardır; cinnet durumunda dost düşman bakmaksızın herkese saldırır.~ +@274=~Hayvan Öfkesi~ +@273=~Hortlak Korunağı (Ölüm Ä°lmi) +Seviye: 5 +Küre: Koruyucular +Menzil: Ä°cracı +Etki Süresi: 1 tur +Büyü Yapma Süresi: 7 +Etki Alanı: 6 mt yarıçapında +Kurtarış Zarı: Yok +Bu büyü rahibin hortlaklar üzerindeki nüfuzunu güçlendirir; ancak büyü yapıldığı anda rahibi çevreleyen alana baÄŸlıdır ve hareket etmez. Etki alanına giren her türlü hortlak yaratık, büyüyü yapmış olan rahipçe defedilmiÅŸ gibi etkilenir. Defetme baÅŸarısız olursa hortlak yaratık, etki alanını terk edip yeniden girmediÄŸi müddetçe, büyünün sonraki defetme giriÅŸimlerine karşı bağışık olur.~ +@272=~Hortlak Korunağı~ +@271=~Lathander'ın Kalkanı +(Çağırma) +Seviye: 5 +Küre: Muhafız +Menzil: Temas +Etki Süresi: 2 raunt +Büyü Yapma Süresi: 8 +Etki Alanı: 1 yaratık +Kurtarış Zarı: Yok +Bu büyü hedefe, büyünün etki süresi boyunca hasara karşı bağışıklık bahÅŸeder. Kötü yönelimli karakterler bu büyüyü yapamaz veya Lathander'ın Kalkanı'nca korunamazlar.~ +@270=~Lathander'ın Kalkanı~ +@269=~Sivri TaÅŸlar +(BaÅŸkalaşım, Efsunlama) +Seviye: 5 +Küre: Elemental (Toprak) +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: 12 raunt +Büyü Yapma Süresi: 6 +Etki Alanı: 4,5 mt yarıçapında +Kurtarış Zarı: Yok +Bu büyü çevredeki kayaları çarpıtıp yeniden ÅŸekillendirerek araziyi arkaplana karışan sivri çıkıntılarla dolu hale getirir. Alana giren her yaratık raunt başına 2z4 can puanlık delme hasarı alır ve büyüye karşı kurtarış yapmalıdır, aksi takdirde hareket hızı %30 düşer.~ +@268=~Sivri TaÅŸlar~ +@267=~Ä°nananın Haklı Gazabı +(Efsunlama) +Seviye: 5 +Küre: Çarpışma +Menzil: 0 +Etki Süresi: 1 raunt/seviye +Büyü Yapma Süresi: 8 +Etki Alanı: 11 metre yarıçapında +Kurtarış Zarı: Yok +Bu büyü rahibin müttefiklerine ilahi bir delilik formu bahÅŸederek dövüş yeteneklerini geliÅŸtirir. Etki alanı içindeki rahibin tüm müttefikleri büyünün etki süresi boyunca saldırı ve kurtarış zarlarına +1 kazanır; ayrıca can puanlarına 8 bonus alırlar (bu bonus hedefin can puanını maksimunun üzerine çıkarabilir). Bununla birlikte aynı yönelimden tüm yaratıklar raunt başına fazladan bir saldırı kazanır(Hızlandırış'ı etkisiz kılar); saldırı, hasar ve kurtarış zarlarına +2 alır, ayrıca efsunlanma ve sabitleyiÅŸ büyülerine geçici bağışıklık kazanırlar. Ä°nananın Haklı Gazabı'ndan etkilenen herkes büyünün etkisi geçtiÄŸinde yorgun düşer.~ +@266=~Ä°nananın Haklı Gazabı~ +@265=~Ayışığı Duvarı (OluÅŸturma) +Seviye: 4 +Küre: Koruma, GüneÅŸ +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: 1 tur +Büyü Yapma Süresi: 7 +Etki Alanı: 6 mt uzunluÄŸunda, 1,5 mt geniÅŸliÄŸinde duvar +Kurtarış Zarı: Yok +Bu büyü, mavi-beyaz güçten parıldayan bir duvar örgüsü meydana getirir. Bu duvar soyuttur, fiziksel dayanak noktası gerektirmez ve kolaylıkla içinden geçilebilir. Duvarın içinden geçen kötü yaratıklar 2z10, kötü hortlak yaratıklar ise 5z10 hasar alırlar. Duvardan geçen bir yaratık ondan yalnızca bir kez hasar alabilir. Belirli bir zamanda sadece bir Ayışığı Duvarı etkin olabilir.~ +@264=~Ayışığı Duvarı~ +@263=~Diken Püskürtme (BaÅŸkalaşım) +Seviye: 4 +Küre: Bitki +Menzil: Özel +Etki Süresi: Anında +Büyü Yapma Süresi: 3 +Etki Alanı: 9 mt uzunlukta, 7,5 metre geniÅŸlikte koni +Kurtarış Zarı: 1/2 +Bu büyü aracılığıyla icracı elinden diken, sivri dal ve sürgün püskürtmesi gerçekleÅŸtirebilmektedir. Diken püskürtme 9 mt uzunluÄŸunda, 18 metre geniÅŸliÄŸinde bir koni ÅŸeklinde meydana gelir ve etki alanı içindeki tüm yaratıklara 2z10 puanlık delme hasarı veya baÅŸarılı bir ölüme karşı kurtarış durumunda 1z10 puanlık hasar verir.~ +@262=~Diken Püskürtme~ +@261=~Baygın~ +@260=~Ezici Dalga (OluÅŸturma) +Seviye: 4 +Küre: Elemental (Su) +Menzil: 12 metre +Etki Süresi: Anında +Büyü Yapma Süresi: 1 raunt +Etki Alanı: 1,5 metre geniÅŸlikte dalga +Kurtarış Zarı: 1/2 +Bu büyü, icracının arzu ettiÄŸi yöne doÄŸru hareket eden bir su dalgayı çağırır; dalga muazzam bir kudretle yoluna çıkan her ÅŸeye saldırır. Dalga 4z10 puanlık ezme hasarı verir; ek olarak yaratığın %25 olasılıkla 2 rauntluÄŸuna sersemleme ve %5 olasılıkla bilincini yitirme olasılığı vardır. Ä°sabet alan yaratık baÅŸarılı bir nefese karşı kurtarış gerçekleÅŸtirirse hasar yarıya düşer ve yaratık sersemlemekten ya da bilincini yitirmekten kurtulur.~ +@259=~Ezici Dalga~ +@258=~Yıldız Metali Matrak~ +@257=~Yıldız Metali Matrak~ +@256=~Yıldız Metali Matrak +(Çağırma) +Seviye: 4 +Küre: Çarpışma +Menzil: 0 +Etki Süresi: 3 tur +Büyü Yapma Süresi: 7 +Etki Alanı: Büyü Ä°cracısı +Kurtarış Zarı: Yok +Bu büyü göktaşı demirinden büyülü bir sopa yaratır. Sopanın normal hasarı 1z6+2 puan ezme hasarıdır. Ayrıca saldırı zarlarında +2 avantaja sahiptir; neye vurabileceÄŸi konusunda +4 silah gibi muamele görür. Sopaya yetkinlik, kuvvet ve uzmanlaÅŸma bonusları ile cezaları^normal olarak uygulanır. Ayrıca doÄŸal olmayan yaratıklara (hortlaklar, elementaller, golemler, dış düzlemsel yaratıklar, vs) karşı ilave 2z6 puanlık ezme hasarı verir.~ +@255=~Yıldız Metali Matrak~ +@254=~Tükenmez Dayanıklılık (Ölüm Ä°lmi) +Seviye: 4 +Küre: Ölüm Ä°lmi +Menzil: Temas +Etki Süresi: Anında +Büyü Yapma Süresi: 1 raunt +Etki Alanı: 1 yaratık +Kurtarış Zarı: Yok +Bu büyü dokunulan yaratığın canlılığını geri kazandırır, efor sarfetmekten dolayı kaybedilen bir buçuk günlük enerjiyi tazeler. Bunun bir karakteri "yorgun" halden çıkartmaya yeterli gelmeyebileceÄŸini belirtmek gerekir.~ +@253=~Tükenmez Dayanıklılık~ +@252=~Veba Bulutu (BaÅŸkalaşım) +Seviye: 4 +Küre: Çarpışma, Elemental (Hava) +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: 4 raunt +Büyü Yapma Süresi: 7 +Etki Alanı: 6 mt yarıçapında +Kurtarış Zarı: Etkisiz +Bu büyü 6 mt yarıçapındaki bir alan içindeki havayı hastalık yayan, grimsi bir sise çevirir. Ä°cracı ve canlı olmayan yaratıklar bulutun etkilerine karşı bağışıktır. Hastalık dolu havaya maruz kaldıkları her turda kurbanlar 3 kuvvet ve çeviklik puanını kaybeder, 3 puan hasar alır ve kör olur. Bu etkiler 1 raunt sürer. Veba Bulutu yalnızca kötü karakterlerce yapılabilir.~ +@251=~Veba Bulutu~ +@250=~SersemletiÅŸ~ +@249=~Ä°yileÅŸtirildi~ +@248=~Kan Öfkesi +(BaÅŸkalaşım) +Seviye: 4 +Küre: Çarpışma +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: 2 tur +Büyü Yapma Süresi: 7 +Etki Alanı: 1 yaratık +Kurtarış Zarı: Yok +Bu büyü yalnızca oyuncu karakterler ya da müttefik yaratıklarda iÅŸe yarar. Ä°cra edildiÄŸinde büyünün hedefindeki kiÅŸi cinnet geçirir; ölünceye dek en yakındaki yaratığa saldırır, sonra da bir sonraki hedefe geçer. Kan Öfkesi altındayken hedef, efsun, uyku, korku, sabitleyiÅŸ, ÅŸaÅŸkınlık, duygu, sembol büyülerine ve ilgili etkilerine karşı bağışıktır. Ek olarak hedef, vuruÅŸuna +2, hasarına +3, kuvvetine +2, 10 fazladan can puanı ve hareket hızına +2 bonus kazanır. Ancak büyünün birkaç dezavantajı vardır. Büyü süresi boyunca hedefin can puanı maskelenir ve hedef can puanını iyileÅŸtiren hiçbir etkiden yararlanamaz. Büyünün süresi bittiÄŸinde hedef yorgun düşer ve Kuvvet'i 2 turluÄŸuna 3'e düşer. Kan Öfkesi kuralcı yönelime sahip yaratıkları etkilemez ve kuralcı karakterlerce yapılamaz.~ +@247=~Kan Öfkesi~ +@246=~Kıraat +(Sakınma, OluÅŸturma) +Seviye: 4 +Küre: Çarpışma +Menzil: Ä°cracı +Etki Süresi: 1 raunt/seviye +Büyü Yapma Süresi: 7 +Etki Alanı: 18 mt yarıçapında +Kurtarış Zarı: Yok +Kutsal bir metni ya da bildiriyi okuyarak rahip, düşmanları arasına kargaÅŸa ve zayıflık tohumları ekerken tanrısının kutsayışının kendisi ve müttefikleri üzerinde olmasını saÄŸlar. Rahibin müttefikleri saldırı ve kurtarış zarlarına +2 bonus alırken, düşmanları saldırı ve kurtarış zarlarına -2 ceza alır. Bu büyü dua büyüsünü etkisiz kılmaz - iki büyü art arda yapılabilir ve birinin etkisi diÄŸerinin üzerine eklenir.~ +@245=~Kıraat~ +@244=~Statik elektrik boÅŸaltımı~ +@243=~Statik Yük +(BaÅŸkalaşım) +Seviye: 4 +Küre: Hava +Menzil: 0 +Etki Süresi: 1 tur/seviye +Büyü Yapma Süresi: 9 +Etki Alanı: Ä°cracının Görüş Alanı +Kurtarış Zarı: 1/2 +Statik Yük yıldırım düşürme büyüsüne benzer; tek farkı iç mekanlarda yapılabilmesidir. Bu büyü icracının, büyünün etki alanı içindeki herhangi bir yaratığın çevresinde statik bir elektrik yükü üretmesini saÄŸlar; bu yük 2z8 puan artı icracının her tecrübe seviyesi başına ilave 1z8 puan elektrik hasarı verir. Elektrik yükü büyü süresi boyunca her turda çarpmaya devam eder.~ +@242=~Statik Yük~ +@241=~AteÅŸ Ãœretme (BaÅŸkalaşım) +Seviye: 4 +Küre: Elemental (AteÅŸ) +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: 1 raunt +Büyü Yapma Süresi: 7 +Etki Alanı: 180 cm yarıçapında +Kurtarış Zarı: Yok +Bu büyü yapıldığında hedeflenen noktadan alevler püskürür; etki alanı içindeki tüm yaratıklara 1-4, artı icracının seviyesi başına ilave 1 can puanı ateÅŸ hasarı verir.~ +@240=~AteÅŸ Ãœretme~ +@239=~Ilmater'in Lütfu +(Ölüm Ä°lmi) +Seviye: 3 +Küre: Ölüm Ä°lmi, Koruma +Menzil: 10 metre +Etki Süresi: Anında +Büyü Yapma Süresi: 6 +Etki Alanı: 1 yaratık +Kurtarış Zarı: Yok +Bu büyüyü yaparak büyü icracısı kendi yaÅŸam gücünü hedefinki ile deÄŸiÅŸtirerek tüm fiziksel yaralanmalarını deÄŸiÅŸ tokuÅŸ eder. Büyü, bir tek icracının can puanı hedeften yüksekse iÅŸleyecektir. Bu deÄŸiÅŸim, icracı hasarı iyileÅŸtirmek için normal iyileÅŸtirme yöntemleri kullanana dek kalıcıdır. DeÄŸiÅŸ tokuÅŸ, büyü menzili aÅŸmadığı müddetçe uzaktan yapılabilir. Sadece can puanları deÄŸiÅŸ tokuÅŸ edilir; büyü icracısı hedeften hastalık, zehirlenme, sarhoÅŸluk ve benzeri saÄŸlık durumlarını üzerine alamaz. +Büyü yalnızca kötü yönelimli olmayan karakterlerce yapılabilir. Hortlaklar, yapılar ya da düzlemdışı yaratıklar üzerinde etkisi yoktur.~ +@238=~Favor of Ilmater~ +@237=~Orta Düzey Yaralar Açış +(Ölüm Ä°lmi) +Seviye: 3 +Küre: Ä°yileÅŸtirme +Menzil: Temas +Etki Süresi: Anında +Büyü Yapma Süresi: 5 +Etki Alanı: 1 yaratık +Kurtarış Zarı: 1/2 +Bu büyüyü yapıp elini bir yaratığın üzerine koyduÄŸunda rahip yaratığın bedenine 14 puanlık hasar (yarım hasar için kurtarış) verir. Bu büyünün hortlaklarda, yapılarda, düzlemdışı yaratıklarda etkisi yoktur. Orta Düzey Yaralar Açış büyüsü iyi karakterlerce yapılamaz.~ +@236=~Orta Düzey Yaralar Açış~ +@235=~Fırtına KabuÄŸu (Sakınma) +Seviye: 3 +Küre: Koruma, Hava +Menzil: Ä°cracı +Etki Süresi: 1 tur +Büyü Yapma Süresi: 6 +Etki Alanı: Büyü Ä°cracısı +Kurtarış Zarı: Yok +Bu büyü icracıyı, onunla birlikte hareket eden bozucu enerjiden meydana gelmiÅŸ karanlık bir küreyle çevreler. Fırtına kabuÄŸu icracıya gelen tüm ateÅŸ, soÄŸuk ve elektrik hasarlarını %50 azaltır.~ +@234=~Fırtına KabuÄŸu~ +@233=~Küflü DokunuÅŸ +(BaÅŸkalaşım) +Seviye: 3 +Küre: Bitki +Menzil: Temas +Etki Süresi: Özel +Büyü Yapma Süresi: 6 +Etki Alanı: 3 metre yarıçapında +Kurtarış Zarı: Özel +Bu büyü icracının dokunduÄŸu bir yaratığa hızlıca yayılan kahverengi bir küf bulaÅŸtırır. Küf bulaÅŸan yaratık büyüye karşı kurtarış zarı atar. Kurtarış zarı baÅŸarısızlıkla sonuçlanırsa enfeksiyon ÅŸiddetli olur ve yaratık ÅŸu hasarları alır: +1. raunt: 4z6 hasar +2. raunt: 3z6 hasar +3. raunt: 2z6 hasar +4. raunt: 1z6 hasar +Kurtarış zarı baÅŸarılı olursa hasar azalır: +1. raunt: 2z6 hasar +2. raunt: 1z6 hasar +3. raunt: 1z6 hasar +Ä°lkinden sonraki her rauntta, kurbana 3 metre mesafe içindeki en yakın yaratık büyüye karşı kurtarış gerçekleÅŸtirmek zorundadır; aksi takdirde küf tam gücüyle ona bulaşır. Küf uygun bir konakçıya bulaÅŸmada baÅŸarısız olana dek bu süreç devam eder. Zaten küfün etkisi altında olan yaratıklar bir daha küf kapamazlar. Büyü süresi dolduÄŸunda kahverengi küf çabucak ölür.~ +@232=~Küflü DokunuÅŸ~ +@231=~Bastıran SaÄŸanak +(OluÅŸturma) +Seviye: 3 +Küre: Elemental (Su) +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: 2 raunt +Büyü Yapma Süresi: 6 +Etki Alanı: 12 metre yarıçapında +Kurtarış Zarı: Yok +Bu büyü, etki alanını sırılsıklam eden büyülü bir yaÄŸmur açığa çıkarır. Tüm soÄŸuk ve ateÅŸ kullanan/kökenli yaratıklar raunt başına 2z3 puan büyü hasarı alırlar. Ek olarak alandaki tüm yaratıklara her turda %50 ihtimalle yıldırım çarpma olasılığı vardır; çarpan yıldırım 2z6 elektrik hasarı verir, kurtarış zarı bu hasarı yarıya düşürür. Bastıran SaÄŸanak; Alev Kılıcı büyülerini, Alev Kefeni'ni ve semender auralarını söndürür.~ +@230=~Bastıran SaÄŸanak~ +@229=~Dikenli Filizler (BaÅŸkalaşım) +Seviye: 3 +Küre: Elemental (Toprak) +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: 1 tur +Büyü Yapma Süresi: 6 +Etki Alanı: 4,5 mt yarıçapında +Kurtarış Zarı: Yok +Bu büyü çevredeki araziyi dikenli bitkilere dönüştürür. Alana giren her yaratık büyünün süresi doluncaya kadar her rauntta 1z4 puan delme hasarı ve 1z4 puan kesme hasarı alır.~ +@228=~Dikenli Filizler~ +@227=~Kemik Çemberi +(Ölüm Ä°lmi) +Seviye: 3 +Küre: Muhafız/Yaratılış +Menzil: 0 +Etki Süresi: 3 raunt +Büyü Yapma Süresi: 3 +Etki Alanı: 1 metre yarıçapında +Kurtarış Zarı: Yok +Bu büyü havada süzülerek icracının etrafında hızla dönen kemiklerden oluÅŸan bir bariyer yaratır, icracı büyünün etki süresi boyunca hareket edemez. Kemiklerin yoluna çıkan herkes raunt başına 1z6 ezme hasarı ve 1z6 kesme hasarı alır. Kemik Çemberi iyi yönelimli karakterlerce yapılamaz.~ +@226=~Kemik Çemberi~ +@225=~Aykılıcı~ +@224=~Aykılıcı~ +@223=~Aykılıcı (OluÅŸturma) +Seviye: 3 +Küre: Çarpışma, GüneÅŸ +Menzil: Ä°cracı +Etki Süresi: 2 tur +Büyü Yapma Süresi: 6 +Etki Alanı: Büyü Ä°cracısı +Kurtarış Zarı: Yok +Bu büyü icracının elinde 120 cm uzunluÄŸunda, ayışığından meydana gelen, sessiz, ağırlıksız kılıç benzeri bir yapı belirmesini saÄŸlar. Aykılıcı hangi yaratıklara hasar verebileceÄŸi konusunda +4'lük bir silah olarak kabul edilir, ancak bonus puan 0ZSV'ye uygulanmaz. Ek olarak aykılıcının soyut yapısından dolayı kuvvetten kaynaklı yakın dövüş bonusları uygulanmaz. +Aykılıcı hedefe isabet ettiÄŸinde yaÅŸam gücünü emer, 1z12+4 puan hasar verir; bu kılıca karşı bilhassa hassas olan hortlaklara ise fazladan 1z12 puan daha hasar verir. BaÅŸarılı bir darbe ayrıca geçici süreyle büyüyü de engeller; hedefin bir sonraki rauntta icra ettiÄŸi tüm büyülerin baÅŸarısız olmasına sebep olur.~ +@222=~Aykılıcı~ +@221=~Uyku~ +@220=~Yüceltme +(Sakınma) +Seviye: 3 +Küre: Ä°yileÅŸtirme +Menzil: Temas +Etki Süresi: 1 tur +Büyü Yapma Süresi: 9 +Etki Alanı: 1 yaratık +Kurtarış Zarı: Yok +Bu büyü rahibin kendisi haricindeki bir varlığa destek olmasını ve onu korumasını saÄŸlar. Dokunmak suretiyle icracı korku, uyku, aptallaÅŸma, bilinç yitikliÄŸi, sarhoÅŸluk yanısıra cinnet ve zihin karışıklığı etkilerini ortadan kaldırır. Ä°lave olarak kiÅŸi, büyünün etki süresi boyunca bu etkilere sebep olan büyü ve diÄŸer saldırılara karşı korunur.~ +@219=~Yüceltme~ +@218=~Hastalığa Yol Açış +(Ölüm Ä°lmi) +Seviye: 3 +Küre: Ä°yileÅŸtirme +Menzil: Temas +Etki Süresi: 8 saat +Büyü Yapma Süresi: 9 +Etki Alanı: 1 yaratık +Kurtarış Zarı: Etkisiz +Bu büyü rahibin dokunduÄŸu bir yaratıkta, hedefin kuvvetini 5z4 puan zayıflatan bir hastalığa sebep olur. BaÅŸarılı bir büyüye karşı kurtarış zarı büyünün etkilerini hükümsüz kılar. Bu büyünün hortlaklar, yapılar ya da düzlemdışı yaratıklar üzerinde etkisi yoktur. Hastalığa Yol Açış iyi yönelimli karakterlerce yapılamaz.~ +@217=~Hastalığa Yol Açış~ +@216=~Çarpışma Cezaları~ +@215=~Çarpışma Bonusları~ +@214=~Dua (Çağırma) +Seviye: 3 +Küre: Çarpışma +Menzil: Ä°cracı +Etki Süresi: 1 raunt/seviye +Büyü Yapma Süresi: 6 +Etki Alanı: 18 mt yarıçapında +Kurtarış Zarı: Yok +Dua, rahip ve müttefiklerinin üzerine lütuf bahÅŸederken düşmanlarını lanetler. Dost karakterler tüm saldırı, hasar ve kurtarış zarlarına +1 kazanırken; düşman saldırı, hasar ve kurtarışlarına -1 ceza alır. Büyünün icrası esnasında etki alanında yakalanan tüm yaratıklar alanı terk ettiklerinde de büyüden etkilenmeye devam ederler; yani dövüşçüler kaçan o goblini kovalamak istiyorlarsa Dua'nın etkileri de yaratığı takip edecektir.~ +@213=~Dua~ +@212=~Orta Dereceli Yaralar Açış +(Ölüm Ä°lmi) +Seviye: 2 +Küre: Ä°yileÅŸtirme +Menzil: Temas +Etki Süresi: Sürekli +Büyü Yapma Süresi: 5 +Etki Alanı: 1 yaratık +Kurtarış Zarı: 1/2 +Bu büyüyü yapıp elini bir yaratığın üzerine koyduÄŸunda rahip yaratığın bedenine 11 puanlık hasar (yarı-hasar için kurtarış zarı) verir. Bu büyünün hortlaklarda, yapılarda veya düzlemdışı yaratıklarda etkisi yoktur. Orta Dereceli Yaralar Açış büyüsü iyi yönelimli karakterlerce yapılamaz.~ +@211=~Orta Dereceli Yaralar Açış~ +@210=~Hayvan Pençesi~ +@209=~Hayvan Pençesi~ +@208=~Hayvan Pençesi +(BaÅŸkalaşım) +Seviye: 2 +Küre: Çarpışma +Menzil: Ä°cracı +Etki Süresi: 1 tur +Büyü Yapma Süresi: 5 +Etki Alanı: Büyü Ä°cracısı +Kurtarış Zarı: Yok +Bu büyü icracının kollarını kudretli bir hayvanın pençelerine çevirir; icracıya 18/72 kuvvet ve bir düşmanını 2z4 (+ kuvvet bonusu) puanlık kesme hasarıyla tırmıklama kabiliyeti verir. Ä°cracı, hayvan pençeleriyle bir rauntta iki kez saldırabilir ve vuruÅŸuna +2 bonus alır.~ +@207=~Hayvan Pençesi~ +@206=~Outlined in a Silvery Radiance (AC penalty of 2)~ +@205=~Alikorn Kargı +(OluÅŸturma) +Seviye: 2 +Küre: Çarpışma +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: Anında +Büyü Yapma Süresi: 5 +Etki Alanı: 1 yaratık +Kurtarış Zarı: 1/2 +Bu büyü gümüş rengi, alikorn (tekboynuz boynuzu) biçiminde, kısmen ruhani yapıya sahip bir kargı yaratır. Büyü icracısı bir hedef seçer ve alikorn kargı anında ona doÄŸru fırlayarak 3z6 puanlık delme hasarı verir. Yarı hasar için kiÅŸi kurtarış zarı atar. Her ne kadar saplandıktan sonra alikorn kargı yok olsa da hedefin çevresinde, görülmesini ve vurulmasını kolaylaÅŸtıran gümüşi bir parlaklık bırakır; bu parlaklık 3 raunt boyunca ZS'sine -2 ceza verir.~ +@204=~Alikorn Kargı~ +@203=~Ä°yileÅŸti~ +@202=~Orta Dereceli Yaraları Tedavi +(Ölüm Ä°lmi) +Seviye: 2 +Küre: Ä°yileÅŸtirme +Menzil: Temas +Etki Süresi: Anında +Büyü Yapma Süresi: 5 +Etki Alanı: 1 yaratık +Kurtarış Zarı: Yok +1. seviye rahip büyüsü Hafif Yaraları Tedavi'nin daha güçlü bir biçimi olan Orta Dereceli Yaraları Tedavi canlı bir yaratığın 11 puan hasarını iyileÅŸtirir ve sarhoÅŸluÄŸu tedavi eder. Bu büyünün hortlaklarda, yapılarda veya düzlemdışı yaratıklarda etkisi yoktur.~ +@201=~Orta Dereceli Yaraları Tedavi~ +@200=~KörleÅŸti~ +@199=~GünkavuruÅŸu (OluÅŸturma) +Seviye: 1 +Küre: GüneÅŸ +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: Anında +Büyü Yapma Süresi: 4 +Etki Alanı: 1 yaratık +Kurtarış Zarı: 1/2 +Bu büyü yapıldığında gökten parlak, kavurucu bir ısı ışını iner ve icracının seçtiÄŸi bir hedefe isabet eder. Kurbanın yarı hasar alabilmesi için büyüye karşı kurtarış yapmasına izin verilir. Işının isabet ettiÄŸi her yaratık 1z6 puan artı icracının seviyesi başına 1 puan hasar alır. Hortlak yaratıklar ile parlak ışığa karşı hassas canavarlar 1z6 puan artı icracının seviyesi başına 2 puan hasar alır. Hasara katlanmanın yanısıra kurbanlar 3 raunt boyunca da kör olur.~ +@198=~GünkavuruÅŸu~ +@197=~Hafif Yaralar Açış +(Ölüm Ä°lmi) +Seviye: 1 +Küre: Ä°yileÅŸtirme +Menzil: Temas +Etki Süresi: Anında +Büyü Yapma Süresi: 5 +Etki Alanı: 1 yaratık +Kurtarış Zarı: 1/2 +Bu büyüyü yapıp elini bir yaratığın üzerine koyduÄŸunda rahip yaratığın bedenine 8 puanlık hasar (yarım hasar için kurtarış zarı) verir. Bu büyünün hortlaklarda, yapılarda veya düzlemdışı yaratıklarda etkisi yoktur. Hafif Yaralar Açış büyüsü iyi yönelimli karakterlerce yapılamaz.~ +@196=~Hafif Yaralar Açış~ +@195=~Lanetlendi~ +@194=~Lanet (Çağırma) +Seviye: 1 +Küre: Hepsi +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: 6 raunt +Büyü Yapma Süresi: 1 raunt +Etki Alanı: 7,5 mt yarıçapında +Kurtarış Zarı: Yok +Lanet büyüsünü dile getirerek icracı düşman yaratıkların moralini düşürür; kurtarış ve saldırı zarlarına -1 ceza almalarına sebep olur. Büyü, tamamlandığı anda icracı tarafından seçilen noktayı merkezine alan 15 metre küplük bir alandaki tüm yaratıkları etkiler (bu nedenle alanı terk eden etkilenmiÅŸ yaratıklarda büyünün etkisi devam ederken büyü yapıldıktan sonra alana girenler ise etkilenmez).~ +@193=~Lanet~ +@192=~Taşın Gözü +Bu göz icracıyı tek bir taÅŸlaÅŸtırma saldırısından korur. +Ayrıca 3. seviye büyücü büyüsü KiÅŸi SabitleyiÅŸ ÅŸeklinde de harcanabilir. Bu büyü insan boyundaki ya da daha küçük insansıları her seviye başına 1 raunt boyunca hareketsiz kılar (Büyüye Karşı Kurtarış etkisiz kılar).~ +@191=~Taşın Gözü~ +@190=~Ruhun Gözü +Bu göz bir tane anında ölüm büyüsü saldırısını (Ölüm Büyüsü, Ölümün Parmağı, Güç Sözcüğü: Öldür, Canlı KatlediÅŸ, Ä°mha) engeller. +Bunun yerine büyücü gözün gücünü, 2. seviye büyücü büyüsü olan Zayıf Düşüren Işın ÅŸeklinde de harcayabilir. Büyü hedefin Kuvvet'ini 5'e düşürür (Büyüye Karşı Kurtarış etkisiz kılar).~ +@189=~Ruhun Gözü~ +@188=~Dayanıklılığın Gözü +Bu büyü bir tane sersemletiÅŸ, sağırlık, körlük ya da susturuÅŸ etkisini engeller. +Bundan farklı olarak 4. seviye büyücü büyüsü Nara ÅŸeklinde de harcanabilir. Nara 10 metrelik bir koni içindeki yaratıklara 4z6 büyü hasarı vererek onları sağır eder (Büyüye Karşı Kurtarış hasarı yarıya indirerek sağırlığı etkisiz hale getirir).~ +@187=~Dayanıklılığın Gözü~ +@186=~Zehrin Gözü +Bu göz icracıyı zehirleyebilecek herhangi bir saldırı ya da etkiyi durdurur. +Ayrıca göz 4. seviye rahip büyüsü olan Zehir ÅŸeklinde de harcanabilir. Zehir 20 saniyelik bir süre içerisinde bir yaratığa 20 puanlık hasar verir (Zehre Karşı Kurtarış etkisiz kılar).~ +@185=~Zehrin Gözü~ +@184=~Kılıcın Gözü +Bu göz icracıya isabet eden ilk fiziksel hasar verici saldırıyı saptırır. +Göz 1. seviye büyücü büyüsü Büyü Misili ÅŸeklinde harcanabilir ve her biri hedefe çarparak 1z4+1 büyü hasarı veren en fazla 5 büyü misili (ilkinin yanı sıra her iki tecrübe seviyesi için bir tane) yaratabilir.~ +@183=~Kılıcın Gözü~ +@182=~Büyücünün Gözü +Bu göz bir saldırıdan açığa çıkacak ilk ateÅŸ, elektrik, soÄŸuk ya da asit hasarını emer. +Ayrıca göz 3. seviye büyücü büyüsü Yıldırım ÅŸeklinde de harcanabilir. Yıldırım yoluna çıkan her yaratığa seviye başına 1z6 elektrik (tavanı 10z6'dır) hasarı verir.~ +@181=~Büyücünün Gözü~ +@180=~Aklın Gözü +Bu küre icracıyı; efsun, duygu ve korku gibi zihinsel saldırılara karşı korur. +Göz 1. seviye büyücü büyüsü büyüsü KiÅŸi Efsunlama ÅŸeklinde harcanabilir ve 1 turluÄŸuna insansı bir yaratığı icracının hakimiyetine atar (Büyüye Karşı Kurtarış etkisiz kılar).~ +@179=~Aklın Gözü~ +@178=~Yapılmakta olan büyü bitmeden baÅŸka bir büyüyü yapamazsın.~ +@177=~Yedi Göz (Sakınma) +Seviye: 7 +Menzil: Ä°cracı +Etki Süresi: 2 tur +Büyü Yapma Süresi: 7 +Etki Alanı: Büyü Ä°cracısı +Kurtarış Zarı: Yok +Bu büyü, icracının kafası üzerinde bir halka halinde süzülen yedi büyülü küre meydana getirir. Her bir gözün bir savunma ve saldırı kabiliyeti vardır; ancak herhangi biri kullanıldığında göz gücünü kaybeder. Herhangi bir göz kalıp kalmasa bile büyü süresi dolmadan önce, öncekinin üzerine yapılmaya kalkışılan bir Yedi Göz büyüsü baÅŸarısız olur. Her bir gözün gücü aÅŸağıda açıklanmıştır. +Aklın Gözü - bu küre icracıyı; efsun, duygu ve korku gibi zihinsel saldırılara karşı korur. Göz 1. seviye büyücü büyüsü büyüsü KiÅŸi Efsunlama ÅŸeklinde harcanabilir. +Kılıcın Gözü - bu göz icracıya isabet eden ilk fiziksel hasar verici saldırıyı saptırır. Göz 1. seviye büyücü büyüsü Büyü Misili (5 misil) ÅŸeklinde harcanabilir. +Büyücünün Gözü - bu göz bir saldırıdan açığa çıkacak ilk ateÅŸ, elektrik, soÄŸuk ya da asit hasarını emer. Ayrıca göz 3. seviye büyücü büyüsü Yıldırım (4z8 hasar) ÅŸeklinde de harcanabilir. +Zehrin Gözü - bu göz icracıyı zehirleyebilecek herhangi bir saldırı ya da etkiyi durdurur. Ayrıca göz bir yaratığı zehirlemek için kullanılabilir; zehir 30 saniyelik bir süreçte 30 puanlık hasar verir. +Ruhun Gözü - bu göz bir tane anında ölüm büyüsü saldırısını (Ölüm Büyüsü, Ölümün Parmağı, Güç Sözcüğü: Öldür, Canlı KatlediÅŸ, Ä°mha) engeller. Bunun yerine büyücü gözün gücünü, zayıf düşüren ışın ÅŸeklinde de harcayabilir; bu ışın hedefin kuvvetini 5'e düşürür, vuruÅŸ olasılığını ve vereceÄŸi hasarı azaltır. +Dayanıklılığın Gözü - bu büyü bir tane sersemletiÅŸ, sağırlık, körlük ya da susturuÅŸ etkisini engeller. Bundan farklı olarak 4. seviye büyücü büyüsü Nara ÅŸeklinde de harcanabilir. +Taşın Gözü - bu göz icracıyı tek bir taÅŸlaÅŸtırma saldırısından korur. Ayrıca 3. seviye büyücü büyüsü KiÅŸi SabitleyiÅŸ ÅŸeklinde de harcanabilir. +Herhangi bir göz kalıp kalmasa bile büyü süresi dolmadan önce, öncekinin üzerine yapılmaya kalkışılan bir Yedi Göz büyüsü baÅŸarısız olur.~ +@176=~Yedi Göz~ +@175=~Malavon'un Öfkesi +(OluÅŸturma) +Seviye: 7 +Menzil: Ä°cracı +Etki Süresi: Anında +Büyü Yapma Süresi: 1 +Etki Alanı: 4,5 mt yarıçapında +Kurtarış Zarı: 1/2 +Malavon'un Öfkesi sihirbaz kara elf Malavon tarafından yaratılmıştır. Büyü, icracının bedeninden her yöne saf enerji okları fırlatarak dost düşman ayırt etmeksizin herkese saplanır. Bu küçük büyü çivileri yollarına çıkan her ÅŸeye 20-80 puanlık delme hasarı verir. Büyü, büyücü düşmanlarla çevrili olduÄŸundu özellikle iÅŸe yarar.~ +@174=~Malavon'un Öfkesi~ +@173=~Kelle Alan VuruÅŸ~ +@172=~Ölüm~ +@171=~Hortlak yok edildi~ +@170=~Dış düzlemsel yok edildi~ +@169=~Silüetler (Yanılsama) +Seviye: 6 +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: 1 raunt/seviye +Büyü Yapma Süresi: 6 +Etki Alanı: 6 metre küp +Kurtarış Zarı: Yok +Silüetler büyüsü Gölge Canavarlar ve Yarıgölge Canavarlar büyüleriyle benzerlik gösterir - icracının Gölge Yarıdüzlemi'nden gelen maddelere ÅŸekil vererek onları hayali canavarlara çevirmesini saÄŸlar. Bu gölgeler Gölge Canavarlar ya da Yarıgölge Canavarlar ile çaÄŸrılanlardan daha kuvvetlidir ve öldürülünceye ya da büyü süresi doluncaya dek icracıya itaat ederler.~ +@168=~Silüetler~ +@167=~Liç DokunuÅŸu~ +@166=~Liç DokunuÅŸu~ +@165=~Liç DokunuÅŸu +(Ölüm Ä°lmi) +Seviye: 6 +Menzil: Temas +Etki Süresi: 1 raunt/seviye +Büyü Yapma Süresi: 6 +Etki Alanı: Büyü Ä°cracısı +Kurtarış Zarı: Özel +Bu büyü icracıya bir liçin dokunuÅŸunun güçlerini ve bağışıklıklarını bahÅŸeder. Büyücü, büyü etkin durumdayken felce ve korkuya karşı bağışıklık kazanır. Büyücünün elleri tüyler ürpertici yeÅŸil bir parıltı ile parlayarak hedefe 1-10 can puanı hasar verir ve ÅŸayet felce karşı kurtarış yapılmazsa onu felç eder. Büyünün hortlaklar üzerinde etkisi yoktur.~ +@164=~Liç DokunuÅŸu~ +@163=~Büyü Boz~ +@162=~Antibüyü KabuÄŸu +(Sakınma) +Seviye: 6 +Menzil: Ä°cracı +Etki Süresi: 1 tur/seviye +Büyü Yapma Süresi: 1 +Etki Alanı: Büyü Ä°cracısı +Kurtarış Zarı: Yok +Bu büyü icracıyı, onunla birlikte hareket eden, görünmez bir bariyerle çevreler. Bu bariyer büyücüyü her türlü büyülü saldırıya karşı bağışık hale getirir; ancak aynı zamanda büyücünün kabuÄŸun dışına büyü yapmasını da engeller.~ +@161=~Antibüyü KabuÄŸu~ +@160=~Çetin Kertenkele Adam~ +@159=~Goblin Seçkini~ +@158=~Goblin Seçkini~ +@157=~Yarıgölge Canavarlar +(Yanılsama) +Seviye: 5 +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: 1 raunt/seviye +Büyü Yapma Süresi: 5 +Etki Alanı: 6 metre küp +Kurtarış Zarı: Yok +Bu büyü 4. seviye büyücü büyüsü olan Gölge Canavarlar ile benzerlik taşır. Ancak burada çaÄŸrılan yaratıklar çok daha kuvvetlidir ve gerçek dünyadaki emsallerinin %40 can puanına sahiptir.~ +@156=~Yarı-Gölge Canavarlar~ +@155=~Trol Silahı~ +@154=~Trol~ +@153=~Trol~ +@152=~Gölge Canavarlar +(Yanılsama) +Seviye: 4 +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: 1 raunt/seviye +Büyü Yapma Süresi: 4 +Etki Alanı: 6 metre küp +Kurtarış Zarı: Özel +Bu büyü Gölge Yarıdüzlemi'nden gelen maddelere ÅŸekil vererek onları hayali canavarlara çevirir. Bu canavarlar rastgele ve teker teker çaÄŸrılır. Yaratıkların Can Zarı 1 ile büyü icracısının seviyesi arasındadır ve çaÄŸrılan yaratıkların toplam Can Zarı büyü icracısının seviyesine eÅŸitlenene dek yaratık çağırma süreci devam eder. (ÖrneÄŸin 15. seviye bir büyücünün birinci turda çağırdığı yaratık 10. seviyeyse sonraki rauntta ortaya çıkan yaratığın Can Zarı 1 ile 5 arasında olur ve bu böyle devam eder.) Bu gölgemsi yaratıkların can puanı gerçek dünyadaki emsallerinin %20'si kadardır, ancak saldırıları tam hasar verir.~ +@151=~Gölge Canavarlar~ +@150=~Hızlanmış~ +@149=~YavaÅŸlat~ +@148=~YavaÅŸlatıldı~ +@147=~Hızlı Tüymek +(BaÅŸkalaşım) +Seviye: 1 +Menzil: Büyüyü yapan kiÅŸi +Etki Süresi: 3 raunt +Büyü Yapma Süresi: 1 +Etki Alanı: Büyüyü yapan kiÅŸi +Kurtarış Zarı: Yok +Bu büyü, büyücünün normal hızını kısa bir süreliÄŸine --genellikle kaçmak için yeterli-- iki katına çıkarır. BaÅŸka hıza etkili büyüler, hızlandırma ve yavaÅŸlatma gibi, bu büyü aktif iken büyücüye iÅŸlemez. Hızlı Tüymek aktif iken büyücü saldıramaz, büyü yapamaz, eÅŸya veya özel yetenek kullanamaz... Yalnızca koÅŸar.~ +@146=~Hızlı Tüymek ~ +@145=~Mordenkainen'in Kılıcı~ +@144=~Mordenkainen'in Kılıcı~ +@143=~Mordenkainen'in Kılıcı +(OluÅŸturma) +Seviye: 7 +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: 1 raunt/seviye +Büyü Yapma Süresi: 7 +Etki Alanı: Özel +Kurtarış Zarı: Yok +Bu büyü, icracı tarafından zihinsel olarak kullanılabilen, parıldayan bir güç kılıcı ortaya çıkarır. Kılıç sanki icracının yarı seviyesindeki bir dövüşçü tarafından kullanılıyormuÅŸ gibi saldırır ve elde tutulduÄŸu gerçeÄŸine raÄŸmen icracının görüş alanı içinde herhangi bir yerde bulunan yaratığa vurabilir. Kılıç bir saldırı bonusuna sahip olmasa da normalde sadece +2 veya daha yüksek silahlarla vurulabilen yaratıklara vurabilir ve her vuruÅŸta 5-30 can puanı hasar verir.~ +@142=~Mordenkainen'in Kılıcı~ +@141=~Su Elementali~ +@140=~Su Elementali~ +@139=~Su Elementali Çağırma +(Çağırma) +Seviye: 5 +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: 1 tur/seviye +Büyü Yapma Süresi: 1 raunt +Etki Alanı: Özel +Kurtarış Zarı: Yok +Bu büyü icracının Su Elementi Düzlemi'nden bir elemental çağırmasını ve yaratığın icracının iradesine boyun eÄŸmesini saÄŸlar. Bu elemental, yok edilinceye ya da büyü süresi doluncaya dek icracı adına savaşır.~ +@138=~Su Elementali Çağırma~ +@137=~Hava Elementali~ +@136=~Hava Elementali~ +@135=~Conjure Air Elemental +(Conjuration/Summoning) +Level: 5 +Range: Visual range of the caster +Duration: 1 turn/level +Casting Time: 9 +Area of Effect: Special +Saving Throw: None +This spell allows the caster to summon an 8-HD elemental from the Elemental Plane of Air and bind it to will. This elemental will fight on behalf of the caster until the spell duration expires or the elemental is destroyed.~ +@134=~Hava Elementali Çağır~ +@133=~AteÅŸ Elementali~ +@132=~AteÅŸ Elementali~ +@131=~AteÅŸ Elementali Çağırma +(Çağırma) +Seviye: 5 +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: 1 tur/seviye +Büyü Yapma Süresi: 1 raunt +Etki Alanı: Özel +Kurtarış Zarı: Yok +Bu büyü icracının AteÅŸ Elementi Düzlemi'nden bir elemental çağırmasını ve yaratığın icracının iradesine boyun eÄŸmesini saÄŸlar. Bu elemental, yok edilinceye ya da büyü süresi doluncaya dek icracı adına savaşır.~ +@130=~AteÅŸ Elementali Çağırma~ +@129=~Toprak Elementali~ +@128=~Toprak Elementali~ +@127=~Toprak Elementali Çağırma +(Çağırma) +Seviye: 5 +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: 1 tur/seviye +Büyü Yapma Süresi: 1 raunt +Etki Alanı: Özel +Kurtarış Zarı: Yok +Bu büyü icracının Toprak Elementi Düzlemi'nden bir elemental çağırmasını ve yaratığın icracının iradesine boyun eÄŸmesini saÄŸlar. Bu elemental, yok edilinceye ya da büyü süresi doluncaya dek icracı adına savaşır.~ +@126=~Toprak Elementali Çağırma~ +@125=~Canavar Çağırma III +(Çağırma) +Seviye: 5 +Menzil: 36,5 metre +Etki Süresi: 4 raunt + 1 raunt/seviye +Büyü Yapma Süresi: 5 +Etki Alanı: Özel +Kurtarış Zarı: Yok +Bu büyüyü yaparak büyücü 1-4 adet 3. seviye canavar çağırır. Bu canavarlar büyü menzili içinde ortaya çıkarlar ve kendilerine icracının düşmanlarına saldırma emri verilebilir. Yaratıklar öldürüldüklerinde ya da büyü süresi dolduÄŸunda yok olurlar.~ +@124=~Canavar Çağırma III~ +@123=~Kertenkele Adam~ +@122=~Kertenkele Adam~ +@121=~Canavar Çağırma II +(Çağırma) +Seviye: 4 +Menzil: 36,5 metre +Etki Süresi: 3 raunt + 1 raunt/seviye +Büyü Yapma Süresi: 4 +Etki Alanı: Özel +Kurtarış Zarı: Yok +Bu büyüyü yaparak büyücü 1-6 adet 2. seviye canavar çağırır. Bu canavarlar büyü menzili içinde ortaya çıkarlar ve kendilerine icracının düşmanlarına saldırma emri verilebilir. Yaratıklar öldürüldüklerinde ya da büyü süresi dolduÄŸunda yok olurlar.~ +@120=~Canavar Çağırma II~ +@119=~Goblin~ +@118=~Goblin~ +@117=~Canavar Çağırma I +(Çağırma) +Seviye: 3 +Menzil: 36,5 metre +Etki Süresi: 2 raunt + 1 raunt/seviye +Büyü Yapma Süresi: 4 +Etki Alanı: Özel +Kurtarış Zarı: Yok +Bu büyüyü yaparak büyücü 2-6 adet 1. seviye canavar çağırır. Bu canavarlar büyü menzili içinde ortaya çıkarlar ve kendilerine icracının düşmanlarına saldırma emri verilebilir. Yaratıklar öldürüldüklerinde ya da büyü süresi dolduÄŸunda yok olurlar.~ +@116=~Canavar Çağırma I~ +@115=~Saldırı~ +@114=~Minotor~ +@113=~Minotor~ +@112=~Canavar Çağırma V +(Çağırma) +Seviye: 7 +Menzil: 36,5 metre +Etki Süresi: 6 raunt + 1 raunt/seviye +Büyü Yapma Süresi: 6 +Etki Alanı: Özel +Kurtarış Zarı: Yok +Bu büyüyü yaparak büyücü 1-3 adet 5. seviye canavar çağırır. Bu canavarlar büyü menzili içinde ortaya çıkarlar ve kendilerine icracının düşmanlarına saldırma emri verilebilir. Yaratıklar öldürüldüklerinde ya da büyü süresi dolduÄŸunda yok olurlar.~ +@111=~Monster Summoning V~ +@110=~Salamander spear +1d8 piercing +1d6 fire damage +do not translate~ +@109=~Frost salamander spear +1d8 piercing ++1d6 cold +do not trans~ +@108=~Semender~ +@107=~Semender~ +@106=~Buz Semenderi~ +@105=~Buz Semenderi~ +@104=~Canavar Çağırma VI +(Çağırma) +Seviye: 8 +Menzil: 36,5 metre +Etki Süresi: 7 raunt + 1 raunt/seviye +Büyü Yapma Süresi: 8 +Etki Alanı: Özel +Kurtarış Zarı: Yok +Bu büyüyü yaparak büyücü 1-3 adet 6. seviye canavar çağırır. Bu canavarlar büyü menzili içinde ortaya çıkarlar ve kendilerine icracının düşmanlarına saldırma emri verilebilir. Yaratıklar öldürüldüklerinde ya da büyü süresi dolduÄŸunda yok olurlar.~ +@103=~Monster Summoning VI~ +@102=~Saldırı~ +@101=~Ombra Yarması~ +@100=~Ombra Yarması~ +@99=~Kemikmuhafızı Ä°skelet~ +@98=~Kemikmuhafızı Ä°skelet~ +@97=~Canavar Çağırma VII +(Çağırma) +Seviye: 9 +Menzil: Özel +Etki Süresi: 7 raunt + 1 raunt/seviye +Büyü Yapma Süresi: 9 +Etki Alanı: 73 metre yarıçapında +Kurtarış Zarı: Yok +Bu büyüyü yaparak büyücü 1-2 adet 7. ya da 8. seviye canavar çağırır. Bu canavarlar büyü menzili içinde ortaya çıkarlar ve kendilerine icracının düşmanlarına saldırma emri verilebilir. Yaratıklar öldürüldüklerinde ya da büyü süresi dolduÄŸunda yok olurlar.~ +@96=~Monster Summoning VII~ +@95=~Canavar Çağırma IV +(Çağırma) +Seviye: 6 +Menzil: 36,5 metre +Etki Süresi: 5 raunt + 1 raunt/seviye +Büyü Yapma Süresi: 6 +Etki Alanı: Özel +Kurtarış Zarı: Yok +Bu büyüyü yaparak büyücü 1-3 adet 4. seviye canavar çağırır. Bu canavarlar büyü menzili içinde ortaya çıkarlar ve kendilerine icracının düşmanlarına saldırma emri verilebilir. Yaratıklar öldürüldüklerinde ya da büyü süresi dolduÄŸunda yok olurlar.~ +@94=~Monster Summoning IV~ +@93=~Kafatası~ +@92=~Monster Transparency +Do not translate~ +@91=~Monster Transparancy Item~ +@90=~Gölge~ +@89=~Gölge~ +@88=~Gölge Çağırma +(Çağırma, Ölüm Ä°lmi) +Seviye: 5 +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: 1 raunt + 1 raunt/seviye +Büyü Yapma Süresi: 5 +Etki Alanı: 3 metre küp +Kurtarış Zarı: Yok +Bu büyü, icracının sahip olduÄŸu her üç seviye başına bir ruh çağırır. Bu gölge icracının emirlerine itaat eder; gölge yok edilene ya da büyünün süresi dolana dek düşmanlara saldırır ya da görevleri yerine getirir.~ +@87=~Gölge Çağırma~ +@86=~Demir Yumruk~ +@85=~Iron Fist~ +@84=~Korkunç bir hastalık kapmış~ +@83=~Hastalanmış~ +@82=~ZehirlenmiÅŸ~ +@81=~Zehir~ +@80=~Demirden Vücut (BaÅŸkalaşım) +Seviye: 8 +Menzil: Ä°cracı +Etki Süresi: 2 tur +Büyü Yapma Süresi: 8 +Etki Alanı: Büyü Ä°cracısı +Kurtarış Zarı: Yok +Bu büyü icracının bedenini canlı demire dönüştürür ve ona bir takım güçlü direnç ve kabiliyetler kazandırır. Büyü etkinken icracı elektriÄŸe karşı %100, ateÅŸe karşı %50, ezme hasarına karşı %25 dirençli olur. Solunumunu ya da fizyolojisini etkileyebilecek büyülerden etkilenmez. Ek olarak icracının kuvvetini 25'e yükselir ve 2z4 puan + uygulanan kuvvet bonusları kadar hasar veren demir yumrukları ile raunt başına iki kez saldırabilir. Ancak ne yazık ki icracının hareketleri yavaÅŸlar ve hantallaşır; hareket hızı normalin %25'ine iner. Ayrıca Demirden Vücut etkinken büyü icra edemez.~ +@79=~Demirden Vücut~ +@78=~Bilinçsiz~ +@77=~Etkili Nara (OluÅŸturma) +Seviye: 8 +Menzil: 0 +Etki Süresi: Anında +Büyü Yapma Süresi: 1 +Etki Alanı: 15 derece açılı 9 m.lik koni +Kurtarma Zarı: 1/2 +Etkili Nara'yı dile getirdiÄŸinde büyücünün aÄŸzından 9 metre uzunluÄŸunda ve 3 metre çapında bir koni halinde yayılan sersemletici bir güç açığa çıkar. Etkili Nara kullanıcı için aşırı derecede zorlayıcı ve tehlikelidir. Nara, büyüyü yapanın 2z4 can puanını tüketir; ayrıca büyüyü yapan kiÅŸi büyüye karşı kurtarma zarı atmalıdır, aksi takdirde bir turluÄŸuna bilincini yitirir. Etkili Nara'ya yakalanan 5 can zarı ya da altına sahip yaratıklar anında ölür. Etki alanı içindeki diÄŸer tüm yaratıklardan büyüye karşı kurtarma zarını tutturamayanlar 2 rauntluÄŸuna sersemler, 4 rauntluÄŸuna sağırlaşır ve 4z12 puanlık hasara maruz kalır. Kurtarma zarını tutturanlar 1 rauntluÄŸuna sersemler, 2 rauntluÄŸuna sağırlaşır ve 2z12 puanlık hasar alır.~ +@76=~Güçlü Nara~ +@75=~Efsunlanmış~ +@74=~Åžiddetli Efsunlanmış~ +@73=~Hâkimiyet KurulmuÅŸ~ +@72=~Moral Çöküşü: Panik~ +@71=~SarhoÅŸ~ +@70=~Afallatıldı~ +@69=~Zihin Tutulması~ +@68=~SabitlenmiÅŸ~ +@67=~Felç~ +@66=~SabitlenmiÅŸ~ +@65=~Zihin BoÅŸaltımı (Sakınma) +Seviye: 8 +Menzil: Ä°cracı +Etki Süresi: 1 Gün +Büyü Yapma Süresi: 1 +Etki Alanı: Büyü Ä°cracısı +Kurtarış Zarı: Yok +Akli iradesini ve mahremiyetini sürdürebilmek amacıyla Zihin BoÅŸaltımı bir yaratığın aklını neredeyse her türlü zihinsel etkiden korur: Efsun, Buyruk, Hakimiyet, Korku, AptallaÅŸtırma büyülerine ve kristal küre ya da diÄŸer kehanet yöntemleriyle yapılan her türlü zihin okumalara karşı.~ +@64=~Zihin BoÅŸaltımı~ +@63=~BoÄŸma (BaÅŸkalaşım) +Seviye: 7 +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: 4 raunt +Büyü Yapma Süresi: 7 +Etki Alanı: 3 mt yarıçapında +Kurtarış Zarı: 1/2 +Bu büyü etki alanı içindeki tüm yaratıkların ciÄŸerlerindeki nefesi çeker. Nefes almayan yaratıklar büyüden etkilenmez. Havasız kalan yaratıklar zırh seviyesine -4, vuruÅŸuna -4, çevikliÄŸine -6 cezaya maruz kalırlar; raunt başına saldırıları bir azalır; hareket hızları yarıya düşer ve raunt başına 4z8 puanlık hasar alırlar. BaÅŸarılı bir kurtarış zarı tüm bu etkileri hükümsüz kılar ve tur başına alınan hasar 2z8'e düşer. Yaratık etki alanı dışına çıktığında etkiler yok olmaya baÅŸlar, ancak bir karakterin soluklanıp kendine gelmesi bir raunt alabilir.~ +@62=~BoÄŸma~ +@61=~Asit Fırtınası +(OluÅŸturma) +Seviye: 7 +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: 1 raunt/seviye +Büyü Yapma Süresi: 7 +Etki Alanı: 7 metre yarıçapında +Kurtarış Zarı: 1/2 +Bu büyü etki alanına bir asit saÄŸanağı yaÄŸdırır; ilk üç raunt boyunca her rauntta 1z4 asit hasarı, takip eden üç rauntta 1z6 hasar ve sonrasında da her rauntta 1z8 hasar verir. Etki alanının dışına çıkmak alınan hasarı durdurmaz - asit cilde yapışır ve Asit Fırtınası yapıldığında etki alanı içinde olan her yaratık büyü süresi doluncaya dek hasar almaya devam eder. Bulutun isabet ettiÄŸi yaratıklar her rauntta büyüye karşı kurtarış yaparlar - baÅŸarılı olurlarsa sadece yarı hasar alırlar (sadece o raunt için).~ +@60=~Asit Fırtınası~ +@59=~Trol Dayanıklılığı (Ölüm Ä°lmi) +Seviye: 6 +Menzil: Ä°cracı +Etki Süresi: 2 tur +Büyü Yapma Süresi: 6 +Etki Alanı: Büyü Ä°cracısı +Kurtarış Zarı: Yok +Bu büyü icracıya trollerin çabuk iyileÅŸebilme gücünü bahÅŸeder; maksimum can puanına kadar icracının raunt başına 5 can puanını tazeleyebilmesini saÄŸlar.~ +@58=~Trol Dayanıklılığı~ +@57=~Ä°skelet~ +@56=~Ä°skelet~ +@55=~Ruh Yiyen (Ölüm Ä°lmi) +Seviye: 6 +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: Anında +Büyü Yapma Süresi: 5 +Etki Alanı: 3 mt yarıçapında +Kurtarış Zarı: Yok +Bu büyü 3 metrelik bir yarıçap içindeki tüm canlı yaratıklara 3z8 puan hasar verir. Bu hasarın sonucu olarak ölen bir yaratık imha olur ve özü, icracının kontrolü altındaki 3 can zarına sahip bir iskelete dönüşür. Ayrıca bu ÅŸekilde ölen her yaratık için icracı 1 turluÄŸuna kuvvet, çeviklik ve dayanıklılığına +1 bonus kazanır. Ruh Yiyen'in hortlaklar, yapılar ve elemental yaratıklar üzerinde etkisi yoktur.~ +@54=~Ruh Yiyen~ +@53=~Kemik Dartı~ +@52=~Kemik Dartı~ +@51=~Kemik Dartları (Ölüm Ä°lmi) +Seviye: 6 +Menzil: Ä°cracı +Etki Süresi: 5 raunt +Büyü Yapma Süresi: 5 +Etki Alanı: Büyü Ä°cracısı +Kurtarış Zarı: Yok +Bu büyü icracı tarafından kullanılabilen ve büyü etkin olduÄŸu müddetçe elden bırakılamayan dokuz tane dart yaratır. Dartlar +3'tür, 1z4 hasar verirler ve dartların birinin isabet ettiÄŸi yaratık ölüme karşı kurtarış gerçekleÅŸtirmelidir, aksi takdirde ilaveten 2z6 hasar alır ve kuvveti 5 rauntluÄŸuna 3 puan düşer. Ä°cracının darttaki silah yetkinliÄŸinin (ya da yetkinsizliÄŸinin) dartların hedefi vurma olasılığı üzerinde hiçbir etkisi yoktur.~ +@50=~Kemik Dartları~ +@49=~Otiluke'ün Dondurucu Küresi +(BaÅŸkalaşım, OluÅŸturma) +Seviye: 6 +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: Anında +Büyü Yapma Süresi: 6 +Etki Alanı: 1 yaratık +Kurtarış Zarı: Etkisiz +Bu büyü bir yaratığa doÄŸru, 3-6 puan soÄŸuk hasarının icracının seviyesiyle çarpımı kadar hasar veren bir soÄŸuk küresi fırlatır. Ancak hedef kurtarış zarı atıp baÅŸarılı olursa küreden sıyrılır ve hasarın tamamından kurtulur.~ +@48=~Otiluke'ün Dondurucu Küresi~ +@47=~Alev Kefeni +(OluÅŸturma) +Seviye: 5 +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: 1 raunt/2 seviye (özel) +Büyü Yapma Süresi: 5 +Etki Alanı: 4 metre yarıçapında +Kurtarış Zarı: Etkisiz +Bu büyü bir yaratığın, ÅŸayet büyüye karşı kurtarışta baÅŸarılı olamazsa alev almasına sebep olur. Yaratık her rauntta yanarak 2z6 puanlık hasar alır ve yanan hedeften püsküren alev damlaları, hedefe 4 metre uzaklıkta ya da daha yakın duran yaratıkların alevlerden 1z4 puan hasar almasına neden olur. Ayrıca kurbanın alevlerinin isabet ettiÄŸi herkes, kendileri de kefen büyüsüne tutulmamak için büyüye karşı kurtarış gerçekleÅŸtirmelidir. Ä°cracı ile hedef artık aynı alanda deÄŸilse alev kefeni yok olur. Bu büyü özellikle trol ve buz semenderleri sürülerini dağıtmak için birebirdir.~ +@46=~Alev Kefeni~ +@45=~Kezzap Küresi (Çağırma) +Seviye: 4 +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: Özel +Büyü Yapma Süresi: 4 +Etki Alanı: Özel +Kurtarış Zarı: Özel +Bu büyü, icracının menzil içindeki herhangi bir hedefe çarpması için yönlendirebileceÄŸi, zümrüt yeÅŸili parlayan bir küre meydana getirir. Hedefine ulaÅŸtığında küre patlar ve kurbanı kuvvetli bir asitle sırılsıklam eder. Kurban icracının seviyesi başına 1z4 puan asit hasarı alır, alabileceÄŸi maksimum hasar 12z4 puandır. Ä°lk hasardan sonra kurban daha fazla hasardan sakınabilmek için kurtarış zarı atmak zorundadır. BaÅŸarısız olursa kurban ilerleyen rauntlarda asit hasarı almaya devam eder; her rauntta katlanacağı hasar iki zar azalır. ÖrneÄŸin 8. seviye bir büyücü bu büyüyle birinci rauntta 8z4, ikinci rauntta 6z4, üçüncü rauntta 4z4, dördüncü rauntta 2z4 puan hasar verir ve büyü beÅŸinci rauntta sona erer. Her rauntta kurbanın daha fazla hasardan sakınmak için büyüye karşı kurtarış zarı atma hakkı vardır. Kezzap küresi aynı zamanda ana hedefinin 1,5 metre yarıçaplık çevresine de asit sıçratır. Sıçrama yarıçapı içinde yer alan her yaratık ÅŸekil deÄŸiÅŸtirmeye/felçe karşı kurtarış yapmalıdır, aksi takdirde icracının sahip olduÄŸu her beÅŸ seviye başına 1z6 puan hasar veren bir sıçrama vuruÅŸunun kurbanı olur. Sıçrama vuruÅŸları devamlı hasara sebep olmaz.~ +@44=~Kezzap Küresi~ +@43=~Sağırlık~ +@42=~Nara (OluÅŸturma) +Seviye: 4 +Menzil: Ä°cracı +Etki Süresi: Anında +Büyü Yapma Süresi: 1 +Etki Alanı: 9 metre uzunluk, 3 metre çap +Kurtarış Zarı: 1/2 +Nara büyücüye muazzam gırtlak güçleri bahÅŸeder, aÄŸzından kulak zarlarını patlatan bir haykırış çıkartmasını saÄŸlar. Bu haykırış 9 metre uzunluÄŸa ve 3 metre çapa ulaÅŸan bir etki alanına sahiptir. Bu alan içindeki her yaratık 2z6 raunt boyunca sağır olur ve 4z6 puan hasar alır. BaÅŸarılı bir büyüye karşı kurtarış yaratığın sağırlıktan etkilenmemesini saÄŸlar ve alacağı hasarı yarıya indirir.~ +@41=~Nara~ +@40=~Mordenkainen'in Güç Misilleri +(OluÅŸturma) +Seviye: 4 +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: Anında +Büyü Yapma Süresi: 4 +Etki Alanı: Özel +Kurtarış Zarı: Özel +Bu büyü Büyü Misili büyüsüne çok benzer bir ÅŸekilde, hızla icracının elinden çıkarak ÅŸaÅŸmaz bir biçimde hedefe isabet eden, parlak bir büyülü enerji küresi yaratır. Büyücü 7. seviyede bir misil ve 7. seviyeden sonra her üç seviyede ilave bir misil yaratır - baÅŸka bir deyiÅŸle 10. seviyede iki misil, 13.'de üç, 16.'da dört olmak üzere devam eder; maksimum 25. seviyede yedi misil yaratır. Her bir misil hedefe 2z4 puan hasar verir, sonra da 1,5 metre yarıçapında sarsıcı bir patlamayla infilak eder; bu patlama icracının seviyesi başına 1 puan hasar verir - örneÄŸin 12. seviye bir büyücü her biri 2z4+12 puan hasar ile çarpan iki güç misili meydana getirebilir. Hasar alan yaratıklar sonraki patlamanın hasarından kurtulabilmek için büyüye karşı kurtarış yapabilirler; ancak misilin çarpışında kurtarış zarına izin yoktur. 1. seviye büyücü büyüsü Kalkan güç misillerini zararsızca emebilir, buna ardından gelen sarsıcı patlama hasarı da dahildir.~ +@39=~Mordenkainen'in Güç Misilleri~ +@38=~Hopelessness~ +@37=~Sersemledi~ +@36=~Duygu: Umutsuzluk +(Efsunlama) +Seviye: 4 +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: 1 tur +Büyü Yapma Süresi: 4 +Etki Alanı: 3 mt yarıçapında +Kurtarış Zarı: Etkisiz +Bu büyü etki alanında umutsuzluk duygusu yaratır. Büyünün etkisine giren her yaratık büyünün etki süresi boyunca hiçbir ÅŸey yapmadan olduÄŸu yerde dikilir.~ +@35=~Emotion: Hopelessness~ +@34=~Panik~ +@33=~Duygu: Korku +(Efsunlama) +Seviye: 4 +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: 5 raunt +Büyü Yapma Süresi: 4 +Etki Alanı: 3 mt yarıçapında +Kurtarış Zarı: Etkisiz +Bu büyü etki alanında korku duygusu yaratır. Büyünün etkisine giren her yaratık 5 raunt boyunca kaçar.~ +@32=~Duygu: Korku~ +@31=~Duygu: Umut +(Efsunlama) +Seviye: 4 +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: 5 tur +Büyü Yapma Süresi: 4 +Etki Alanı: 3 mt yarıçapında +Kurtarış Zarı: Etkisiz +Bu büyü etki alanında umut duygusu yaratır. Büyünün etkisine giren her yaratığın morali artar ve kurtarış, saldırı ve hasar zarlarına +2 kazanırlar.~ +@30=~Duygu: Umut~ +@29=~Duygu: Cesaret +(Efsunlama) +Seviye: 4 +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: 5 tur +Büyü Yapma Süresi: 4 +Etki Alanı: 3 mt yarıçapında +Kurtarış Zarı: Etkisiz +Bu büyü etki alanında cesaret duygusu yaratır. Büyünün etkisine giren her yaratık geçici süreyle vuruÅŸuna +1, hasar zarlarına +3 ve can puanına +5 (büyü yaratığı maksimum can puanının üzerine çıkartabilir) kazanır. Bu büyü icra anında etki alanı içindeki tüm korku etkilerini ortadan kaldırır.~ +@28=~Duygu: Cesaret~ +@27=~Başıbozukluk~ +@26=~Beltyn'in Yanan Kanı +(Ölüm Ä°lmi) +Seviye: 4 +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: 1 raunt/2 seviye +Büyü Yapma Süresi: 4 +Etki Alanı: 1 yaratık +Kurtarış Zarı: Etkisiz +Bu büyü hedefin kanını aleve çevirir; her rauntta 3-12 can puanı hasar vererek kurbanı acıyla cinnete sürükler. Hedef her rauntta büyüye karşı kurtarış zarı atar; baÅŸarılı olursa hasar almaz ve cinnet durumu geçer. Bu büyü kana sahip olmayan (elementaller gibi) hortlak ya da düzlemdışı yaratıklara karşı iÅŸlemez. Åžayet yaratık ateÅŸe karşı dirençliyse bu direnç, büyüden alınan hasarı azaltır ya da sıfırlar.~ +@25=~Beltyn'in Yanan Kanı~ +@24=~Parçalayan Kargı (OluÅŸturma) +Seviye: 3 +Menzil: 18 metre +Etki Süresi: Anında +Büyü Yapma Süresi: 3 +Etki Alanı: Özel +Kurtarış Zarı: 1/2 +Bu büyü, icracıdan baÅŸlayarak 18 metre uzaktaki bir noktaya doÄŸru uzanan bir güç mızrağı yaratır. Mızrağın yoluna çıkan her yaratık 5z4 puan ezme hasarı ile icracının seviyesinin +2 ile çarpımı (maksimum +30) kadar hasar alır. Kurbanlar yarı hasar için büyüye karşı kurtarış yapabilirler.~ +@23=~Parçalayan Kargı~ +@22=~SersemlemiÅŸ~ +@21=~Buzkargısı (OluÅŸturma) +Seviye: 3 +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: Anında +Büyü Yapma Süresi: 3 +Etki Alanı: 1 yaratık +Kurtarış Zarı: Özel +Bu büyü icracının seçtiÄŸi bir hedefe büyülü bir buz kargısı fırlatır. Kargı hedefi kendiliÄŸinden vurur, 5-30 puan hasar verir ve hedefi büyüye karşı kurtarış yapmaya zorlar; aksi takdirde hedef 1-4 raunt sersemler.~ +@20=~Buzkargısı~ +@19=~Çeviklik DeÄŸiÅŸikliÄŸi~ +@18=~Kedi Zarafeti (BaÅŸkalaşım) +Seviye: 2 +Menzil: Temas +Etki Süresi: 1 saat/seviye +Büyü Yapma Süresi: 2 +Etki Alanı: 1 yaratık +Kurtarış Zarı: Yok +Bu büyü hedefin çevikliÄŸini büyülü ÅŸekilde artırır. Artış miktarı hedefin sınıfına baÄŸlıdır: Hırsızlar 1z8 puan, Dövüşçü ve Büyücüler 1z6 puan, Runbanlar 1z4 puan kazanır. Kedi Zarafeti hedefin çevikliÄŸini 20'nin üzerine çıkaramaz.~ +@17=~Kedi Zarafeti~ +@16=~Dekaçomak~ +@15=~Dekaçomak~ +@14=~Dekaçomak +(OluÅŸturma) +Seviye: 2 +Menzil: Ä°cracı +Etki Süresi: 1 raunt/seviye +Büyü Yapma Süresi: 2 +Etki Alanı: Büyü Ä°cracısı +Kurtarış Zarı: Yok +Bu büyü icracının elinde bir güç asası oluÅŸturur. Asa büyülü bir silah gibi davranır; her vuruÅŸta 1-6 can puanı hasar verir ve normal silahlara bağışıklığı olan yaratıklara vurabilir. Ancak bu bir asa olduÄŸu için icracının asa silahlarına dair bir yetkinliÄŸi yoksa icracı Dekaçomak'ı kullandığında ceza puanı alır. Asanın aynı zamanda ilk vuruÅŸta hedefin 1-2 can puanını emme gücü de bulunmaktadır. Bu can puanları icracıya eklenir, fakat bu puanlar sadece icracının aldığı hasarı iyileÅŸtirebilir; can puanını normal maksimumunun üzerine çıkarmaz.~ +@13=~Dekaçomak~ +@12=~~ +@11=~Snilloc'un Kartopu YaÄŸmuru +(OluÅŸturma) +Seviye: 2 +Menzil: Ä°cracının Görüş Alanı +Etki Süresi: Anında +Büyü Yapma Süresi: 2 +Etki Alanı: 10 metre yarıçapında +Kurtarış Zarı: 1/2 hasar +Bu büyü menzil içindeki bir noktadan kartopu saÄŸanağının çıkmasına sebep olur. Bu kartopları etki alanı içindeki her ÅŸeye isabet eder ve seviye başına 1z3 soÄŸuk hasarı verir. Bu hasar maksimum 8. seviyede 8z3 puana çıkabilir. AteÅŸ kullanan ya da ateÅŸten yapıya sahip yaratıklara, seviye başına 1z6 soÄŸuk hasarı verir.~ +@10=~~ +@9=~Snilloc'un Kartopu YaÄŸmuru~ +@8=~Eye of the Mind blocks effect and dissipates.~ +@7=~Eye of the Sword blocks effect and dissipates.~ +@6=~Eye of the Mage blocks effect and dissipates.~ +@5=~Eye of Venom blocks effect and dissipates.~ +@4=~Eye of the Spirit blocks effect and dissipates.~ +@3=~Eye of Fortitude blocks effect and dissipates.~ +@2=~Eye of Stone blocks effect and dissipates.~ +@1=~Bu büyü seçilen karakteri iyileÅŸtirir. Karakterin 11 can puanı yenilenir.~ diff --git a/iwdification/dw_iwdspells_resource/wizard_acid_storm/#re_m04.wav b/iwdification/dw_iwdspells_resource/wizard_acid_storm/#re_m04.wav new file mode 100644 index 0000000..53ec809 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_acid_storm/#re_m04.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_acid_storm/astorma.bam b/iwdification/dw_iwdspells_resource/wizard_acid_storm/astorma.bam new file mode 100644 index 0000000..a962cbf Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_acid_storm/astorma.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_acid_storm/astormx.bam b/iwdification/dw_iwdspells_resource/wizard_acid_storm/astormx.bam new file mode 100644 index 0000000..80946b1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_acid_storm/astormx.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_acid_storm/idpro211.pro b/iwdification/dw_iwdspells_resource/wizard_acid_storm/idpro211.pro new file mode 100644 index 0000000..6c57602 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_acid_storm/idpro211.pro differ diff --git a/iwdification/dw_iwdspells_resource/wizard_acid_storm/spwi724.spl b/iwdification/dw_iwdspells_resource/wizard_acid_storm/spwi724.spl new file mode 100644 index 0000000..901e026 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_acid_storm/spwi724.spl differ diff --git a/iwdification/bam/cdia724a.bam b/iwdification/dw_iwdspells_resource/wizard_acid_storm/spwi724a.bam similarity index 100% rename from iwdification/bam/cdia724a.bam rename to iwdification/dw_iwdspells_resource/wizard_acid_storm/spwi724a.bam diff --git a/iwdification/bam/cdia724b.bam b/iwdification/dw_iwdspells_resource/wizard_acid_storm/spwi724b.bam similarity index 100% rename from iwdification/bam/cdia724b.bam rename to iwdification/dw_iwdspells_resource/wizard_acid_storm/spwi724b.bam diff --git a/iwdification/bam/cdia724c.bam b/iwdification/dw_iwdspells_resource/wizard_acid_storm/spwi724c.bam similarity index 100% rename from iwdification/bam/cdia724c.bam rename to iwdification/dw_iwdspells_resource/wizard_acid_storm/spwi724c.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_antimagic_shell/#antishl.vvc b/iwdification/dw_iwdspells_resource/wizard_antimagic_shell/#antishl.vvc new file mode 100644 index 0000000..e60c420 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_antimagic_shell/#antishl.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_antimagic_shell/#eff_e01.wav b/iwdification/dw_iwdspells_resource/wizard_antimagic_shell/#eff_e01.wav new file mode 100644 index 0000000..30f8465 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_antimagic_shell/#eff_e01.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_antimagic_shell/amshelc.bam b/iwdification/dw_iwdspells_resource/wizard_antimagic_shell/amshelc.bam new file mode 100644 index 0000000..46573b6 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_antimagic_shell/amshelc.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_antimagic_shell/destself.eff b/iwdification/dw_iwdspells_resource/wizard_antimagic_shell/destself.eff new file mode 100644 index 0000000..e6bac57 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_antimagic_shell/destself.eff differ diff --git a/iwdification/dw_iwdspells_resource/wizard_antimagic_shell/spwi610.spl b/iwdification/dw_iwdspells_resource/wizard_antimagic_shell/spwi610.spl new file mode 100644 index 0000000..36bf5fa Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_antimagic_shell/spwi610.spl differ diff --git a/iwdification/bam/cdia610a.bam b/iwdification/dw_iwdspells_resource/wizard_antimagic_shell/spwi610a.bam similarity index 100% rename from iwdification/bam/cdia610a.bam rename to iwdification/dw_iwdspells_resource/wizard_antimagic_shell/spwi610a.bam diff --git a/iwdification/bam/cdia610b.bam b/iwdification/dw_iwdspells_resource/wizard_antimagic_shell/spwi610b.bam similarity index 100% rename from iwdification/bam/cdia610b.bam rename to iwdification/dw_iwdspells_resource/wizard_antimagic_shell/spwi610b.bam diff --git a/iwdification/bam/cdia610c.bam b/iwdification/dw_iwdspells_resource/wizard_antimagic_shell/spwi610c.bam similarity index 100% rename from iwdification/bam/cdia610c.bam rename to iwdification/dw_iwdspells_resource/wizard_antimagic_shell/spwi610c.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_beltyns_burning_blood/#beltyn.spl b/iwdification/dw_iwdspells_resource/wizard_beltyns_burning_blood/#beltyn.spl new file mode 100644 index 0000000..dab04d3 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_beltyns_burning_blood/#beltyn.spl differ diff --git a/iwdification/wav/cdiem07.ogg b/iwdification/dw_iwdspells_resource/wizard_beltyns_burning_blood/#eff_m07.wav similarity index 100% rename from iwdification/wav/cdiem07.ogg rename to iwdification/dw_iwdspells_resource/wizard_beltyns_burning_blood/#eff_m07.wav diff --git a/iwdification/dw_iwdspells_resource/wizard_beltyns_burning_blood/necroh.bam b/iwdification/dw_iwdspells_resource/wizard_beltyns_burning_blood/necroh.bam new file mode 100644 index 0000000..1712f6d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_beltyns_burning_blood/necroh.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_beltyns_burning_blood/necroh.vvc b/iwdification/dw_iwdspells_resource/wizard_beltyns_burning_blood/necroh.vvc new file mode 100644 index 0000000..26e9f2a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_beltyns_burning_blood/necroh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_beltyns_burning_blood/spwi422.spl b/iwdification/dw_iwdspells_resource/wizard_beltyns_burning_blood/spwi422.spl new file mode 100644 index 0000000..b768d46 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_beltyns_burning_blood/spwi422.spl differ diff --git a/iwdification/bam/cdia422a.bam b/iwdification/dw_iwdspells_resource/wizard_beltyns_burning_blood/spwi422a.bam similarity index 100% rename from iwdification/bam/cdia422a.bam rename to iwdification/dw_iwdspells_resource/wizard_beltyns_burning_blood/spwi422a.bam diff --git a/iwdification/bam/cdia422b.bam b/iwdification/dw_iwdspells_resource/wizard_beltyns_burning_blood/spwi422b.bam similarity index 100% rename from iwdification/bam/cdia422b.bam rename to iwdification/dw_iwdspells_resource/wizard_beltyns_burning_blood/spwi422b.bam diff --git a/iwdification/bam/cdia422c.bam b/iwdification/dw_iwdspells_resource/wizard_beltyns_burning_blood/spwi422c.bam similarity index 100% rename from iwdification/bam/cdia422c.bam rename to iwdification/dw_iwdspells_resource/wizard_beltyns_burning_blood/spwi422c.bam diff --git a/iwdification/wav/cdiem08.ogg b/iwdification/dw_iwdspells_resource/wizard_cats_grace/#eff_m08.wav similarity index 100% rename from iwdification/wav/cdiem08.ogg rename to iwdification/dw_iwdspells_resource/wizard_cats_grace/#eff_m08.wav diff --git a/iwdification/dw_iwdspells_resource/wizard_cats_grace/alterh.bam b/iwdification/dw_iwdspells_resource/wizard_cats_grace/alterh.bam new file mode 100644 index 0000000..56902ce Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_cats_grace/alterh.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_cats_grace/alterh.vvc b/iwdification/dw_iwdspells_resource/wizard_cats_grace/alterh.vvc new file mode 100644 index 0000000..3af5aa9 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_cats_grace/alterh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_cats_grace/clssplab.2da b/iwdification/dw_iwdspells_resource/wizard_cats_grace/clssplab.2da new file mode 100644 index 0000000..8844500 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/wizard_cats_grace/clssplab.2da @@ -0,0 +1,25 @@ +2DA V1.0 +6 + DEX STR +UNUSED 6 8 +MAGE 6 4 +FIGHTER 6 8 +CLERIC 4 6 +THIEF 8 6 +BARD 8 6 +PALADIN 6 8 +FIGHTER_MAGE 6 8 +FIGHTER_CLERIC 6 8 +FIGHTER_THIEF 8 8 +FIGHTER_MAGE_THIEF 8 8 +DRUID 4 6 +RANGER 6 8 +MAGE_THIEF 8 6 +CLERIC_MAGE 6 6 +CLERIC_THIEF 8 6 +FIGHTER_DRUID 6 8 +FIGHTER_MAGE_CLERIC 6 8 +CLERIC_RANGER 6 8 +SORCERER 6 4 +MONK 4 6 +SHAMAN 4 6 diff --git a/iwdification/dw_iwdspells_resource/wizard_cats_grace/spwi225.spl b/iwdification/dw_iwdspells_resource/wizard_cats_grace/spwi225.spl new file mode 100644 index 0000000..91d9476 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_cats_grace/spwi225.spl differ diff --git a/iwdification/bam/cdia225a.bam b/iwdification/dw_iwdspells_resource/wizard_cats_grace/spwi225a.bam similarity index 100% rename from iwdification/bam/cdia225a.bam rename to iwdification/dw_iwdspells_resource/wizard_cats_grace/spwi225a.bam diff --git a/iwdification/bam/cdia225b.bam b/iwdification/dw_iwdspells_resource/wizard_cats_grace/spwi225b.bam similarity index 100% rename from iwdification/bam/cdia225b.bam rename to iwdification/dw_iwdspells_resource/wizard_cats_grace/spwi225b.bam diff --git a/iwdification/bam/cdia225c.bam b/iwdification/dw_iwdspells_resource/wizard_cats_grace/spwi225c.bam similarity index 100% rename from iwdification/bam/cdia225c.bam rename to iwdification/dw_iwdspells_resource/wizard_cats_grace/spwi225c.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/#eff_m13.wav b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/#eff_m13.wav new file mode 100644 index 0000000..3e1b1c3 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/#eff_m13.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/#isc_01c.wav b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/#isc_01c.wav new file mode 100644 index 0000000..c6d87c1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/#isc_01c.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/aelem.itm b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/aelem.itm new file mode 100644 index 0000000..cc2f7a2 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/aelem.itm differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/caelemw.2da b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/caelemw.2da new file mode 100644 index 0000000..3b9e413 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/caelemw.2da @@ -0,0 +1,4 @@ +2DA V1.0 +0 + RESREF HitAnimation AreaHitAnimation +1 ES8air MSumm1H CAElemX diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/caelemx.bam b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/caelemx.bam new file mode 100644 index 0000000..98de395 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/caelemx.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/caelemx.vvc b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/caelemx.vvc new file mode 100644 index 0000000..e5fc5e6 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/caelemx.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/es8air.cre b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/es8air.cre new file mode 100644 index 0000000..58456cc Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/es8air.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/gnsummm.baf b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/gnsummm.baf new file mode 100644 index 0000000..6723232 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/gnsummm.baf @@ -0,0 +1,14 @@ +IF + See(NearestEnemyOf(Myself)) +THEN + RESPONSE #100 + AttackReevaluate(LastSeenBy(Myself),75) +END + +IF + AttackedBy(NearestEnemyOf(Myself),DEFAULT) +THEN + RESPONSE #100 + MoveToObject(LastAttackerOf(Myself)) +END + diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/msumm1h.bam b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/msumm1h.bam new file mode 100644 index 0000000..db39f3d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/msumm1h.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/msumm1h.vvc b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/msumm1h.vvc new file mode 100644 index 0000000..8aabcd1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/msumm1h.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/spwi534.spl b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/spwi534.spl new file mode 100644 index 0000000..186018d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/spwi534.spl differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/spwi534a.bam b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/spwi534a.bam new file mode 100644 index 0000000..49057d0 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/spwi534a.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/spwi534b.bam b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/spwi534b.bam new file mode 100644 index 0000000..fefd841 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/spwi534b.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/spwi534c.bam b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/spwi534c.bam new file mode 100644 index 0000000..2ce4c45 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/spwi534c.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/trans4.itm b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/trans4.itm new file mode 100644 index 0000000..4db17ae Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_air_elemental/trans4.itm differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/#eff_m13.wav b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/#eff_m13.wav new file mode 100644 index 0000000..3e1b1c3 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/#eff_m13.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/#isc_01c.wav b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/#isc_01c.wav new file mode 100644 index 0000000..c6d87c1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/#isc_01c.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/ceelemw.2da b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/ceelemw.2da new file mode 100644 index 0000000..80cbcd9 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/ceelemw.2da @@ -0,0 +1,4 @@ +2DA V1.0 +0 + RESREF HitAnimation AreaHitAnimation +1 ES8erth MSumm1H CEElemX diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/ceelemx.bam b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/ceelemx.bam new file mode 100644 index 0000000..d9b64ea Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/ceelemx.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/ceelemx.vvc b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/ceelemx.vvc new file mode 100644 index 0000000..cfb87ae Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/ceelemx.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/eelem.itm b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/eelem.itm new file mode 100644 index 0000000..cd7fc7a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/eelem.itm differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/es8erth.cre b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/es8erth.cre new file mode 100644 index 0000000..f2b232e Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/es8erth.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/gnsummm.baf b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/gnsummm.baf new file mode 100644 index 0000000..6723232 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/gnsummm.baf @@ -0,0 +1,14 @@ +IF + See(NearestEnemyOf(Myself)) +THEN + RESPONSE #100 + AttackReevaluate(LastSeenBy(Myself),75) +END + +IF + AttackedBy(NearestEnemyOf(Myself),DEFAULT) +THEN + RESPONSE #100 + MoveToObject(LastAttackerOf(Myself)) +END + diff --git a/iwdification/bam/cdieelem.bam b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/iearth.bam similarity index 100% rename from iwdification/bam/cdieelem.bam rename to iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/iearth.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/msumm1h.bam b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/msumm1h.bam new file mode 100644 index 0000000..db39f3d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/msumm1h.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/msumm1h.vvc b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/msumm1h.vvc new file mode 100644 index 0000000..8aabcd1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/msumm1h.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/spwi532.spl b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/spwi532.spl new file mode 100644 index 0000000..dfca248 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/spwi532.spl differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/spwi532a.bam b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/spwi532a.bam new file mode 100644 index 0000000..3cfcd7b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/spwi532a.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/spwi532b.bam b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/spwi532b.bam new file mode 100644 index 0000000..1dc8f56 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/spwi532b.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/spwi532c.bam b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/spwi532c.bam new file mode 100644 index 0000000..e161160 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_earth_elemental/spwi532c.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/#eff_m13.wav b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/#eff_m13.wav new file mode 100644 index 0000000..3e1b1c3 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/#eff_m13.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/#isc_01c.wav b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/#isc_01c.wav new file mode 100644 index 0000000..c6d87c1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/#isc_01c.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/cfelemw.2da b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/cfelemw.2da new file mode 100644 index 0000000..afd8172 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/cfelemw.2da @@ -0,0 +1,4 @@ +2DA V1.0 +0 + RESREF HitAnimation AreaHitAnimation +1 ES8fire MSumm1H CFElemX diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/cfelemx.bam b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/cfelemx.bam new file mode 100644 index 0000000..9566a86 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/cfelemx.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/cfelemx.vvc b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/cfelemx.vvc new file mode 100644 index 0000000..488d295 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/cfelemx.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/es8fire.cre b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/es8fire.cre new file mode 100644 index 0000000..504e00e Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/es8fire.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/fele1-8.itm b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/fele1-8.itm new file mode 100644 index 0000000..d514525 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/fele1-8.itm differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/gnsummm.baf b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/gnsummm.baf new file mode 100644 index 0000000..6723232 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/gnsummm.baf @@ -0,0 +1,14 @@ +IF + See(NearestEnemyOf(Myself)) +THEN + RESPONSE #100 + AttackReevaluate(LastSeenBy(Myself),75) +END + +IF + AttackedBy(NearestEnemyOf(Myself),DEFAULT) +THEN + RESPONSE #100 + MoveToObject(LastAttackerOf(Myself)) +END + diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/msumm1h.bam b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/msumm1h.bam new file mode 100644 index 0000000..db39f3d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/msumm1h.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/msumm1h.vvc b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/msumm1h.vvc new file mode 100644 index 0000000..8aabcd1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/msumm1h.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/spwi531.spl b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/spwi531.spl new file mode 100644 index 0000000..d4ed7a9 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/spwi531.spl differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/spwi531a.bam b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/spwi531a.bam new file mode 100644 index 0000000..5e5e646 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/spwi531a.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/spwi531b.bam b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/spwi531b.bam new file mode 100644 index 0000000..d83598d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/spwi531b.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/spwi531c.bam b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/spwi531c.bam new file mode 100644 index 0000000..8ff5ee0 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_fire_elemental/spwi531c.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/#eff_m13.wav b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/#eff_m13.wav new file mode 100644 index 0000000..3e1b1c3 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/#eff_m13.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/#isc_01c.wav b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/#isc_01c.wav new file mode 100644 index 0000000..c6d87c1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/#isc_01c.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/cwelemw.2da b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/cwelemw.2da new file mode 100644 index 0000000..8e81d4b --- /dev/null +++ b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/cwelemw.2da @@ -0,0 +1,4 @@ +2DA V1.0 +0 + RESREF HitAnimation AreaHitAnimation +1 ES8watr MSumm1H CWElemX diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/cwelemx.bam b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/cwelemx.bam new file mode 100644 index 0000000..beadc27 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/cwelemx.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/cwelemx.vvc b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/cwelemx.vvc new file mode 100644 index 0000000..d5ca18c Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/cwelemx.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/es8watr.cre b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/es8watr.cre new file mode 100644 index 0000000..d733865 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/es8watr.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/gnelewtf.baf b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/gnelewtf.baf new file mode 100644 index 0000000..386bc85 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/gnelewtf.baf @@ -0,0 +1,50 @@ +IF + Global("CREATURE_STATE_VARBit6","LOCALS",1) + See(NearestEnemyOf(Myself)) +THEN + RESPONSE #100 + AttackReevaluate(LastSeenBy(Myself),75) +END + +IF + !Global("CREATURE_STATE_VARBit6","LOCALS",1) + HasItem("SHLDBCH",LastAttackerOf(Myself)) + AttackedBy([ANYTHING],DEFAULT) +THEN + RESPONSE #100 + SetGlobal("CREATURE_STATE_VARBit6","LOCALS",1) + Continue() +END + +IF + !HasItem("SHLDBCH",NearestEnemyOf(Myself)) + See(NearestEnemyOf(Myself)) +THEN + RESPONSE #100 + AttackReevaluate(LastSeenBy(Myself),75) +END + +IF + !HasItem("SHLDBCH",SecondNearestEnemyOf(Myself)) + See(SecondNearestEnemyOf(Myself)) +THEN + RESPONSE #100 + AttackReevaluate(LastSeenBy(Myself),75) +END + +IF + !HasItem("SHLDBCH",NearestEnemyOf(Myself)) + AttackedBy(NearestEnemyOf(Myself),DEFAULT) +THEN + RESPONSE #100 + MoveToObject(LastAttackerOf(Myself)) +END + +IF + !HasItem("SHLDBCH",SecondNearestEnemyOf(Myself)) + AttackedBy(SecondNearestEnemyOf(Myself),DEFAULT) +THEN + RESPONSE #100 + MoveToObject(LastAttackerOf(Myself)) +END + diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/gnsummm.baf b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/gnsummm.baf new file mode 100644 index 0000000..6723232 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/gnsummm.baf @@ -0,0 +1,14 @@ +IF + See(NearestEnemyOf(Myself)) +THEN + RESPONSE #100 + AttackReevaluate(LastSeenBy(Myself),75) +END + +IF + AttackedBy(NearestEnemyOf(Myself),DEFAULT) +THEN + RESPONSE #100 + MoveToObject(LastAttackerOf(Myself)) +END + diff --git a/iwdification/bam/cdiwelem.bam b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/iwatere.bam similarity index 100% rename from iwdification/bam/cdiwelem.bam rename to iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/iwatere.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/msumm1h.bam b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/msumm1h.bam new file mode 100644 index 0000000..db39f3d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/msumm1h.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/msumm1h.vvc b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/msumm1h.vvc new file mode 100644 index 0000000..8aabcd1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/msumm1h.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/spwi533.spl b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/spwi533.spl new file mode 100644 index 0000000..a1ce07d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/spwi533.spl differ diff --git a/iwdification/bam/cdia533a.bam b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/spwi533a.bam similarity index 100% rename from iwdification/bam/cdia533a.bam rename to iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/spwi533a.bam diff --git a/iwdification/bam/cdia533b.bam b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/spwi533b.bam similarity index 100% rename from iwdification/bam/cdia533b.bam rename to iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/spwi533b.bam diff --git a/iwdification/bam/cdia533c.bam b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/spwi533c.bam similarity index 100% rename from iwdification/bam/cdia533c.bam rename to iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/spwi533c.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/trans4.itm b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/trans4.itm new file mode 100644 index 0000000..4db17ae Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/trans4.itm differ diff --git a/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/welem.itm b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/welem.itm new file mode 100644 index 0000000..72414ce Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_conjure_lesser_water_elemental/welem.itm differ diff --git a/iwdification/dw_iwdspells_resource/wizard_darts_of_bone/#eff_m07.wav b/iwdification/dw_iwdspells_resource/wizard_darts_of_bone/#eff_m07.wav new file mode 100644 index 0000000..e4933ef Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_darts_of_bone/#eff_m07.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_darts_of_bone/dobone.itm b/iwdification/dw_iwdspells_resource/wizard_darts_of_bone/dobone.itm new file mode 100644 index 0000000..2f97496 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_darts_of_bone/dobone.itm differ diff --git a/iwdification/dw_iwdspells_resource/wizard_darts_of_bone/gdart01.bam b/iwdification/dw_iwdspells_resource/wizard_darts_of_bone/gdart01.bam new file mode 100644 index 0000000..d1f394b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_darts_of_bone/gdart01.bam differ diff --git a/iwdification/bam/cdidbone.bam b/iwdification/dw_iwdspells_resource/wizard_darts_of_bone/idobone.bam similarity index 100% rename from iwdification/bam/cdidbone.bam rename to iwdification/dw_iwdspells_resource/wizard_darts_of_bone/idobone.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_darts_of_bone/necroh.bam b/iwdification/dw_iwdspells_resource/wizard_darts_of_bone/necroh.bam new file mode 100644 index 0000000..1712f6d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_darts_of_bone/necroh.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_darts_of_bone/necroh.vvc b/iwdification/dw_iwdspells_resource/wizard_darts_of_bone/necroh.vvc new file mode 100644 index 0000000..26e9f2a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_darts_of_bone/necroh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_darts_of_bone/spwi630.spl b/iwdification/dw_iwdspells_resource/wizard_darts_of_bone/spwi630.spl new file mode 100644 index 0000000..0e7d2a8 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_darts_of_bone/spwi630.spl differ diff --git a/iwdification/bam/cdia630a.bam b/iwdification/dw_iwdspells_resource/wizard_darts_of_bone/spwi630a.bam similarity index 100% rename from iwdification/bam/cdia630a.bam rename to iwdification/dw_iwdspells_resource/wizard_darts_of_bone/spwi630a.bam diff --git a/iwdification/bam/cdia630b.bam b/iwdification/dw_iwdspells_resource/wizard_darts_of_bone/spwi630b.bam similarity index 100% rename from iwdification/bam/cdia630b.bam rename to iwdification/dw_iwdspells_resource/wizard_darts_of_bone/spwi630b.bam diff --git a/iwdification/bam/cdia630c.bam b/iwdification/dw_iwdspells_resource/wizard_darts_of_bone/spwi630c.bam similarity index 100% rename from iwdification/bam/cdia630c.bam rename to iwdification/dw_iwdspells_resource/wizard_darts_of_bone/spwi630c.bam diff --git a/iwdification/wav/cdiee02.ogg b/iwdification/dw_iwdspells_resource/wizard_decastave/#eff_e02.wav similarity index 100% rename from iwdification/wav/cdiee02.ogg rename to iwdification/dw_iwdspells_resource/wizard_decastave/#eff_e02.wav diff --git a/iwdification/dw_iwdspells_resource/wizard_decastave/#eff_m06.wav b/iwdification/dw_iwdspells_resource/wizard_decastave/#eff_m06.wav new file mode 100644 index 0000000..234a09b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_decastave/#eff_m06.wav differ diff --git a/iwdification/bam/cdideca.bam b/iwdification/dw_iwdspells_resource/wizard_decastave/decasta.bam similarity index 100% rename from iwdification/bam/cdideca.bam rename to iwdification/dw_iwdspells_resource/wizard_decastave/decasta.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_decastave/decasta.itm b/iwdification/dw_iwdspells_resource/wizard_decastave/decasta.itm new file mode 100644 index 0000000..ebc62ab Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_decastave/decasta.itm differ diff --git a/iwdification/dw_iwdspells_resource/wizard_decastave/gblun01.bam b/iwdification/dw_iwdspells_resource/wizard_decastave/gblun01.bam new file mode 100644 index 0000000..502e1dc Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_decastave/gblun01.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_decastave/invoch.bam b/iwdification/dw_iwdspells_resource/wizard_decastave/invoch.bam new file mode 100644 index 0000000..c3bf486 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_decastave/invoch.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_decastave/invoch.vvc b/iwdification/dw_iwdspells_resource/wizard_decastave/invoch.vvc new file mode 100644 index 0000000..0030503 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_decastave/invoch.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_decastave/spwi216.spl b/iwdification/dw_iwdspells_resource/wizard_decastave/spwi216.spl new file mode 100644 index 0000000..fc2dce3 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_decastave/spwi216.spl differ diff --git a/iwdification/bam/cdia216a.bam b/iwdification/dw_iwdspells_resource/wizard_decastave/spwi216a.bam similarity index 100% rename from iwdification/bam/cdia216a.bam rename to iwdification/dw_iwdspells_resource/wizard_decastave/spwi216a.bam diff --git a/iwdification/bam/cdia216b.bam b/iwdification/dw_iwdspells_resource/wizard_decastave/spwi216b.bam similarity index 100% rename from iwdification/bam/cdia216b.bam rename to iwdification/dw_iwdspells_resource/wizard_decastave/spwi216b.bam diff --git a/iwdification/bam/cdia216c.bam b/iwdification/dw_iwdspells_resource/wizard_decastave/spwi216c.bam similarity index 100% rename from iwdification/bam/cdia216c.bam rename to iwdification/dw_iwdspells_resource/wizard_decastave/spwi216c.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/#eff_m13.wav b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/#eff_m13.wav new file mode 100644 index 0000000..3e1b1c3 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/#eff_m13.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/#isc_01c.wav b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/#isc_01c.wav new file mode 100644 index 0000000..c6d87c1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/#isc_01c.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/dsmonst.2da b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/dsmonst.2da new file mode 100644 index 0000000..c5eda9e --- /dev/null +++ b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/dsmonst.2da @@ -0,0 +1,10 @@ +2DA V1.0 +0 + RESREF HitAnimation AreaHitAnimation +1 SS2gob1 MSumm1H MSumm1X +2 SS2gob2 MSumm1H MSumm1X +3 SS2gob3 MSumm1H MSumm1X +4 SS2gob3 MSumm1H MSumm1X +5 SS2liz5 MSumm1H MSumm1X +6 SS2liz6 MSumm1H MSumm1X +7 SS2liz7 MSumm1H MSumm1X diff --git a/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/gnsummm.baf b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/gnsummm.baf new file mode 100644 index 0000000..6723232 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/gnsummm.baf @@ -0,0 +1,14 @@ +IF + See(NearestEnemyOf(Myself)) +THEN + RESPONSE #100 + AttackReevaluate(LastSeenBy(Myself),75) +END + +IF + AttackedBy(NearestEnemyOf(Myself),DEFAULT) +THEN + RESPONSE #100 + MoveToObject(LastAttackerOf(Myself)) +END + diff --git a/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/msumm1h.bam b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/msumm1h.bam new file mode 100644 index 0000000..db39f3d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/msumm1h.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/msumm1h.vvc b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/msumm1h.vvc new file mode 100644 index 0000000..8aabcd1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/msumm1h.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/msumm1x.bam b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/msumm1x.bam new file mode 100644 index 0000000..c59a41b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/msumm1x.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/msumm1x.vvc b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/msumm1x.vvc new file mode 100644 index 0000000..36682c6 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/msumm1x.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/spwi525.spl b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/spwi525.spl new file mode 100644 index 0000000..d382886 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/spwi525.spl differ diff --git a/iwdification/bam/cdia525a.bam b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/spwi525a.bam similarity index 100% rename from iwdification/bam/cdia525a.bam rename to iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/spwi525a.bam diff --git a/iwdification/bam/cdia525b.bam b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/spwi525b.bam similarity index 100% rename from iwdification/bam/cdia525b.bam rename to iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/spwi525b.bam diff --git a/iwdification/bam/cdia525c.bam b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/spwi525c.bam similarity index 100% rename from iwdification/bam/cdia525c.bam rename to iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/spwi525c.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/ss2gob1.cre b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/ss2gob1.cre new file mode 100644 index 0000000..4a63a54 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/ss2gob1.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/ss2gob2.cre b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/ss2gob2.cre new file mode 100644 index 0000000..7940bf4 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/ss2gob2.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/ss2gob3.cre b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/ss2gob3.cre new file mode 100644 index 0000000..17f53fb Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/ss2gob3.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/ss2liz5.cre b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/ss2liz5.cre new file mode 100644 index 0000000..6fcf159 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/ss2liz5.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/ss2liz6.cre b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/ss2liz6.cre new file mode 100644 index 0000000..dc21c98 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/ss2liz6.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/ss2liz7.cre b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/ss2liz7.cre new file mode 100644 index 0000000..47d4e25 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/ss2liz7.cre differ diff --git a/iwdification/itm/cdisumrn.itm b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/sumring.itm similarity index 100% rename from iwdification/itm/cdisumrn.itm rename to iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/sumring.itm diff --git a/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/trans40.itm b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/trans40.itm new file mode 100644 index 0000000..0b7080a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_demi_shadow_monsters/trans40.itm differ diff --git a/iwdification/wav/cdiarm21.ogg b/iwdification/dw_iwdspells_resource/wizard_emotion_courage/#are_m21.wav similarity index 100% rename from iwdification/wav/cdiarm21.ogg rename to iwdification/dw_iwdspells_resource/wizard_emotion_courage/#are_m21.wav diff --git a/iwdification/dw_iwdspells_resource/wizard_emotion_courage/#eff_e03.wav b/iwdification/dw_iwdspells_resource/wizard_emotion_courage/#eff_e03.wav new file mode 100644 index 0000000..98de178 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_emotion_courage/#eff_e03.wav differ diff --git a/iwdification/wav/cdiem05.ogg b/iwdification/dw_iwdspells_resource/wizard_emotion_courage/#eff_m05.wav similarity index 100% rename from iwdification/wav/cdiem05.ogg rename to iwdification/dw_iwdspells_resource/wizard_emotion_courage/#eff_m05.wav diff --git a/iwdification/dw_iwdspells_resource/wizard_emotion_courage/#genench.vvc b/iwdification/dw_iwdspells_resource/wizard_emotion_courage/#genench.vvc new file mode 100644 index 0000000..c6abf52 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_emotion_courage/#genench.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_emotion_courage/enchah.bam b/iwdification/dw_iwdspells_resource/wizard_emotion_courage/enchah.bam new file mode 100644 index 0000000..e4a62a9 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_emotion_courage/enchah.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_emotion_courage/enchah.vvc b/iwdification/dw_iwdspells_resource/wizard_emotion_courage/enchah.vvc new file mode 100644 index 0000000..611e089 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_emotion_courage/enchah.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_emotion_courage/enchanx.bam b/iwdification/dw_iwdspells_resource/wizard_emotion_courage/enchanx.bam new file mode 100644 index 0000000..2bbb747 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_emotion_courage/enchanx.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_emotion_courage/idpro407.pro b/iwdification/dw_iwdspells_resource/wizard_emotion_courage/idpro407.pro new file mode 100644 index 0000000..c6daa34 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_emotion_courage/idpro407.pro differ diff --git a/iwdification/dw_iwdspells_resource/wizard_emotion_courage/spwi427.spl b/iwdification/dw_iwdspells_resource/wizard_emotion_courage/spwi427.spl new file mode 100644 index 0000000..eab50ad Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_emotion_courage/spwi427.spl differ diff --git a/iwdification/bam/cdia427a.bam b/iwdification/dw_iwdspells_resource/wizard_emotion_courage/spwi427a.bam similarity index 100% rename from iwdification/bam/cdia427a.bam rename to iwdification/dw_iwdspells_resource/wizard_emotion_courage/spwi427a.bam diff --git a/iwdification/bam/cdia427b.bam b/iwdification/dw_iwdspells_resource/wizard_emotion_courage/spwi427b.bam similarity index 100% rename from iwdification/bam/cdia427b.bam rename to iwdification/dw_iwdspells_resource/wizard_emotion_courage/spwi427b.bam diff --git a/iwdification/bam/cdia427c.bam b/iwdification/dw_iwdspells_resource/wizard_emotion_courage/spwi427c.bam similarity index 100% rename from iwdification/bam/cdia427c.bam rename to iwdification/dw_iwdspells_resource/wizard_emotion_courage/spwi427c.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_emotion_fear/#are_m21.wav b/iwdification/dw_iwdspells_resource/wizard_emotion_fear/#are_m21.wav new file mode 100644 index 0000000..8cbf28f Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_emotion_fear/#are_m21.wav differ diff --git a/iwdification/wav/cdiee05.ogg b/iwdification/dw_iwdspells_resource/wizard_emotion_fear/#eff_e05.wav similarity index 100% rename from iwdification/wav/cdiee05.ogg rename to iwdification/dw_iwdspells_resource/wizard_emotion_fear/#eff_e05.wav diff --git a/iwdification/dw_iwdspells_resource/wizard_emotion_fear/#eff_m05.wav b/iwdification/dw_iwdspells_resource/wizard_emotion_fear/#eff_m05.wav new file mode 100644 index 0000000..0de94ba Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_emotion_fear/#eff_m05.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_emotion_fear/#genench.vvc b/iwdification/dw_iwdspells_resource/wizard_emotion_fear/#genench.vvc new file mode 100644 index 0000000..c6abf52 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_emotion_fear/#genench.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_emotion_fear/enchah.bam b/iwdification/dw_iwdspells_resource/wizard_emotion_fear/enchah.bam new file mode 100644 index 0000000..e4a62a9 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_emotion_fear/enchah.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_emotion_fear/enchah.vvc b/iwdification/dw_iwdspells_resource/wizard_emotion_fear/enchah.vvc new file mode 100644 index 0000000..611e089 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_emotion_fear/enchah.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_emotion_fear/enchanx.bam b/iwdification/dw_iwdspells_resource/wizard_emotion_fear/enchanx.bam new file mode 100644 index 0000000..2bbb747 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_emotion_fear/enchanx.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_emotion_fear/idpro255.pro b/iwdification/dw_iwdspells_resource/wizard_emotion_fear/idpro255.pro new file mode 100644 index 0000000..dbe1aa7 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_emotion_fear/idpro255.pro differ diff --git a/iwdification/dw_iwdspells_resource/wizard_emotion_fear/spwi428.spl b/iwdification/dw_iwdspells_resource/wizard_emotion_fear/spwi428.spl new file mode 100644 index 0000000..10f924c Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_emotion_fear/spwi428.spl differ diff --git a/iwdification/bam/cdia428a.bam b/iwdification/dw_iwdspells_resource/wizard_emotion_fear/spwi428a.bam similarity index 100% rename from iwdification/bam/cdia428a.bam rename to iwdification/dw_iwdspells_resource/wizard_emotion_fear/spwi428a.bam diff --git a/iwdification/bam/cdia428b.bam b/iwdification/dw_iwdspells_resource/wizard_emotion_fear/spwi428b.bam similarity index 100% rename from iwdification/bam/cdia428b.bam rename to iwdification/dw_iwdspells_resource/wizard_emotion_fear/spwi428b.bam diff --git a/iwdification/bam/cdia428c.bam b/iwdification/dw_iwdspells_resource/wizard_emotion_fear/spwi428c.bam similarity index 100% rename from iwdification/bam/cdia428c.bam rename to iwdification/dw_iwdspells_resource/wizard_emotion_fear/spwi428c.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_emotion_hope/#are_m21.wav b/iwdification/dw_iwdspells_resource/wizard_emotion_hope/#are_m21.wav new file mode 100644 index 0000000..8cbf28f Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_emotion_hope/#are_m21.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_emotion_hope/#eff_e03.wav b/iwdification/dw_iwdspells_resource/wizard_emotion_hope/#eff_e03.wav new file mode 100644 index 0000000..98de178 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_emotion_hope/#eff_e03.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_emotion_hope/#eff_m05.wav b/iwdification/dw_iwdspells_resource/wizard_emotion_hope/#eff_m05.wav new file mode 100644 index 0000000..0de94ba Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_emotion_hope/#eff_m05.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_emotion_hope/#genench.vvc b/iwdification/dw_iwdspells_resource/wizard_emotion_hope/#genench.vvc new file mode 100644 index 0000000..c6abf52 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_emotion_hope/#genench.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_emotion_hope/enchah.bam b/iwdification/dw_iwdspells_resource/wizard_emotion_hope/enchah.bam new file mode 100644 index 0000000..e4a62a9 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_emotion_hope/enchah.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_emotion_hope/enchah.vvc b/iwdification/dw_iwdspells_resource/wizard_emotion_hope/enchah.vvc new file mode 100644 index 0000000..611e089 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_emotion_hope/enchah.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_emotion_hope/enchanx.bam b/iwdification/dw_iwdspells_resource/wizard_emotion_hope/enchanx.bam new file mode 100644 index 0000000..2bbb747 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_emotion_hope/enchanx.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_emotion_hope/idpro407.pro b/iwdification/dw_iwdspells_resource/wizard_emotion_hope/idpro407.pro new file mode 100644 index 0000000..c6daa34 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_emotion_hope/idpro407.pro differ diff --git a/iwdification/dw_iwdspells_resource/wizard_emotion_hope/spwi429.spl b/iwdification/dw_iwdspells_resource/wizard_emotion_hope/spwi429.spl new file mode 100644 index 0000000..90c05f6 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_emotion_hope/spwi429.spl differ diff --git a/iwdification/bam/cdia429a.bam b/iwdification/dw_iwdspells_resource/wizard_emotion_hope/spwi429a.bam similarity index 100% rename from iwdification/bam/cdia429a.bam rename to iwdification/dw_iwdspells_resource/wizard_emotion_hope/spwi429a.bam diff --git a/iwdification/bam/cdia429b.bam b/iwdification/dw_iwdspells_resource/wizard_emotion_hope/spwi429b.bam similarity index 100% rename from iwdification/bam/cdia429b.bam rename to iwdification/dw_iwdspells_resource/wizard_emotion_hope/spwi429b.bam diff --git a/iwdification/bam/cdia429c.bam b/iwdification/dw_iwdspells_resource/wizard_emotion_hope/spwi429c.bam similarity index 100% rename from iwdification/bam/cdia429c.bam rename to iwdification/dw_iwdspells_resource/wizard_emotion_hope/spwi429c.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_emotion_hopelessness/#are_m21.wav b/iwdification/dw_iwdspells_resource/wizard_emotion_hopelessness/#are_m21.wav new file mode 100644 index 0000000..8cbf28f Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_emotion_hopelessness/#are_m21.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_emotion_hopelessness/#eff_e05.wav b/iwdification/dw_iwdspells_resource/wizard_emotion_hopelessness/#eff_e05.wav new file mode 100644 index 0000000..93ac482 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_emotion_hopelessness/#eff_e05.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_emotion_hopelessness/#eff_m05.wav b/iwdification/dw_iwdspells_resource/wizard_emotion_hopelessness/#eff_m05.wav new file mode 100644 index 0000000..0de94ba Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_emotion_hopelessness/#eff_m05.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_emotion_hopelessness/#genench.vvc b/iwdification/dw_iwdspells_resource/wizard_emotion_hopelessness/#genench.vvc new file mode 100644 index 0000000..c6abf52 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_emotion_hopelessness/#genench.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_emotion_hopelessness/enchanx.bam b/iwdification/dw_iwdspells_resource/wizard_emotion_hopelessness/enchanx.bam new file mode 100644 index 0000000..2bbb747 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_emotion_hopelessness/enchanx.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_emotion_hopelessness/idpro255.pro b/iwdification/dw_iwdspells_resource/wizard_emotion_hopelessness/idpro255.pro new file mode 100644 index 0000000..dbe1aa7 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_emotion_hopelessness/idpro255.pro differ diff --git a/iwdification/dw_iwdspells_resource/wizard_emotion_hopelessness/paralh.vvc b/iwdification/dw_iwdspells_resource/wizard_emotion_hopelessness/paralh.vvc new file mode 100644 index 0000000..204ac0f Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_emotion_hopelessness/paralh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_emotion_hopelessness/spwi411.spl b/iwdification/dw_iwdspells_resource/wizard_emotion_hopelessness/spwi411.spl new file mode 100644 index 0000000..6fbe61f Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_emotion_hopelessness/spwi411.spl differ diff --git a/iwdification/bam/cdia411a.bam b/iwdification/dw_iwdspells_resource/wizard_emotion_hopelessness/spwi411a.bam similarity index 100% rename from iwdification/bam/cdia411a.bam rename to iwdification/dw_iwdspells_resource/wizard_emotion_hopelessness/spwi411a.bam diff --git a/iwdification/bam/cdia411b.bam b/iwdification/dw_iwdspells_resource/wizard_emotion_hopelessness/spwi411b.bam similarity index 100% rename from iwdification/bam/cdia411b.bam rename to iwdification/dw_iwdspells_resource/wizard_emotion_hopelessness/spwi411b.bam diff --git a/iwdification/bam/cdia411c.bam b/iwdification/dw_iwdspells_resource/wizard_emotion_hopelessness/spwi411c.bam similarity index 100% rename from iwdification/bam/cdia411c.bam rename to iwdification/dw_iwdspells_resource/wizard_emotion_hopelessness/spwi411c.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_expeditious_retreat/#eff_m08.wav b/iwdification/dw_iwdspells_resource/wizard_expeditious_retreat/#eff_m08.wav new file mode 100644 index 0000000..bc26024 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_expeditious_retreat/#eff_m08.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_expeditious_retreat/alterh.bam b/iwdification/dw_iwdspells_resource/wizard_expeditious_retreat/alterh.bam new file mode 100644 index 0000000..56902ce Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_expeditious_retreat/alterh.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_expeditious_retreat/alterh.vvc b/iwdification/dw_iwdspells_resource/wizard_expeditious_retreat/alterh.vvc new file mode 100644 index 0000000..3af5aa9 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_expeditious_retreat/alterh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_expeditious_retreat/spwi126.spl b/iwdification/dw_iwdspells_resource/wizard_expeditious_retreat/spwi126.spl new file mode 100644 index 0000000..dd98228 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_expeditious_retreat/spwi126.spl differ diff --git a/iwdification/bam/cdia126a.bam b/iwdification/dw_iwdspells_resource/wizard_expeditious_retreat/spwi126a.bam similarity index 100% rename from iwdification/bam/cdia126a.bam rename to iwdification/dw_iwdspells_resource/wizard_expeditious_retreat/spwi126a.bam diff --git a/iwdification/bam/cdia126b.bam b/iwdification/dw_iwdspells_resource/wizard_expeditious_retreat/spwi126b.bam similarity index 100% rename from iwdification/bam/cdia126b.bam rename to iwdification/dw_iwdspells_resource/wizard_expeditious_retreat/spwi126b.bam diff --git a/iwdification/bam/cdia126c.bam b/iwdification/dw_iwdspells_resource/wizard_expeditious_retreat/spwi126c.bam similarity index 100% rename from iwdification/bam/cdia126c.bam rename to iwdification/dw_iwdspells_resource/wizard_expeditious_retreat/spwi126c.bam diff --git a/iwdification/wav/cdiem101.ogg b/iwdification/dw_iwdspells_resource/wizard_great_shout/#ff_m101.wav similarity index 100% rename from iwdification/wav/cdiem101.ogg rename to iwdification/dw_iwdspells_resource/wizard_great_shout/#ff_m101.wav diff --git a/iwdification/wav/cditra08.ogg b/iwdification/dw_iwdspells_resource/wizard_great_shout/#tra_08.wav similarity index 100% rename from iwdification/wav/cditra08.ogg rename to iwdification/dw_iwdspells_resource/wizard_great_shout/#tra_08.wav diff --git a/iwdification/bam/cdigshou.bam b/iwdification/dw_iwdspells_resource/wizard_great_shout/gshoutt.bam similarity index 100% rename from iwdification/bam/cdigshou.bam rename to iwdification/dw_iwdspells_resource/wizard_great_shout/gshoutt.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_great_shout/idpro319.pro b/iwdification/dw_iwdspells_resource/wizard_great_shout/idpro319.pro new file mode 100644 index 0000000..9e61cf5 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_great_shout/idpro319.pro differ diff --git a/iwdification/dw_iwdspells_resource/wizard_great_shout/spwi806.spl b/iwdification/dw_iwdspells_resource/wizard_great_shout/spwi806.spl new file mode 100644 index 0000000..f1073e5 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_great_shout/spwi806.spl differ diff --git a/iwdification/bam/cdia806a.bam b/iwdification/dw_iwdspells_resource/wizard_great_shout/spwi806a.bam similarity index 100% rename from iwdification/bam/cdia806a.bam rename to iwdification/dw_iwdspells_resource/wizard_great_shout/spwi806a.bam diff --git a/iwdification/bam/cdia806b.bam b/iwdification/dw_iwdspells_resource/wizard_great_shout/spwi806b.bam similarity index 100% rename from iwdification/bam/cdia806b.bam rename to iwdification/dw_iwdspells_resource/wizard_great_shout/spwi806b.bam diff --git a/iwdification/bam/cdia806c.bam b/iwdification/dw_iwdspells_resource/wizard_great_shout/spwi806c.bam similarity index 100% rename from iwdification/bam/cdia806c.bam rename to iwdification/dw_iwdspells_resource/wizard_great_shout/spwi806c.bam diff --git a/iwdification/wav/cditra19.ogg b/iwdification/dw_iwdspells_resource/wizard_icelance/#tra_19.wav similarity index 100% rename from iwdification/wav/cditra19.ogg rename to iwdification/dw_iwdspells_resource/wizard_icelance/#tra_19.wav diff --git a/iwdification/dw_iwdspells_resource/wizard_icelance/icelant.bam b/iwdification/dw_iwdspells_resource/wizard_icelance/icelant.bam new file mode 100644 index 0000000..bc66d6f Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_icelance/icelant.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_icelance/idpro251.pro b/iwdification/dw_iwdspells_resource/wizard_icelance/idpro251.pro new file mode 100644 index 0000000..653e298 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_icelance/idpro251.pro differ diff --git a/iwdification/dw_iwdspells_resource/wizard_icelance/spwi327.spl b/iwdification/dw_iwdspells_resource/wizard_icelance/spwi327.spl new file mode 100644 index 0000000..8bb465e Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_icelance/spwi327.spl differ diff --git a/iwdification/bam/cdia327a.bam b/iwdification/dw_iwdspells_resource/wizard_icelance/spwi327a.bam similarity index 100% rename from iwdification/bam/cdia327a.bam rename to iwdification/dw_iwdspells_resource/wizard_icelance/spwi327a.bam diff --git a/iwdification/bam/cdia327b.bam b/iwdification/dw_iwdspells_resource/wizard_icelance/spwi327b.bam similarity index 100% rename from iwdification/bam/cdia327b.bam rename to iwdification/dw_iwdspells_resource/wizard_icelance/spwi327b.bam diff --git a/iwdification/bam/cdia327c.bam b/iwdification/dw_iwdspells_resource/wizard_icelance/spwi327c.bam similarity index 100% rename from iwdification/bam/cdia327c.bam rename to iwdification/dw_iwdspells_resource/wizard_icelance/spwi327c.bam diff --git a/iwdification/wav/cdiem102.ogg b/iwdification/dw_iwdspells_resource/wizard_iron_body/#ff_m102.wav similarity index 100% rename from iwdification/wav/cdiem102.ogg rename to iwdification/dw_iwdspells_resource/wizard_iron_body/#ff_m102.wav diff --git a/iwdification/dw_iwdspells_resource/wizard_iron_body/alterh.bam b/iwdification/dw_iwdspells_resource/wizard_iron_body/alterh.bam new file mode 100644 index 0000000..56902ce Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_iron_body/alterh.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_iron_body/alterh.vvc b/iwdification/dw_iwdspells_resource/wizard_iron_body/alterh.vvc new file mode 100644 index 0000000..3af5aa9 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_iron_body/alterh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_iron_body/ibody.itm b/iwdification/dw_iwdspells_resource/wizard_iron_body/ibody.itm new file mode 100644 index 0000000..406f128 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_iron_body/ibody.itm differ diff --git a/iwdification/bam/cdiibody.bam b/iwdification/dw_iwdspells_resource/wizard_iron_body/iibody.bam similarity index 100% rename from iwdification/bam/cdiibody.bam rename to iwdification/dw_iwdspells_resource/wizard_iron_body/iibody.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_iron_body/spwi814.spl b/iwdification/dw_iwdspells_resource/wizard_iron_body/spwi814.spl new file mode 100644 index 0000000..abc5007 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_iron_body/spwi814.spl differ diff --git a/iwdification/bam/cdia814a.bam b/iwdification/dw_iwdspells_resource/wizard_iron_body/spwi814a.bam similarity index 100% rename from iwdification/bam/cdia814a.bam rename to iwdification/dw_iwdspells_resource/wizard_iron_body/spwi814a.bam diff --git a/iwdification/bam/cdia814b.bam b/iwdification/dw_iwdspells_resource/wizard_iron_body/spwi814b.bam similarity index 100% rename from iwdification/bam/cdia814b.bam rename to iwdification/dw_iwdspells_resource/wizard_iron_body/spwi814b.bam diff --git a/iwdification/bam/cdia814c.bam b/iwdification/dw_iwdspells_resource/wizard_iron_body/spwi814c.bam similarity index 100% rename from iwdification/bam/cdia814c.bam rename to iwdification/dw_iwdspells_resource/wizard_iron_body/spwi814c.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_lance_of_disruption/#eff_m06.wav b/iwdification/dw_iwdspells_resource/wizard_lance_of_disruption/#eff_m06.wav new file mode 100644 index 0000000..234a09b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_lance_of_disruption/#eff_m06.wav differ diff --git a/iwdification/wav/cditra59.ogg b/iwdification/dw_iwdspells_resource/wizard_lance_of_disruption/#tra_59.wav similarity index 100% rename from iwdification/wav/cditra59.ogg rename to iwdification/dw_iwdspells_resource/wizard_lance_of_disruption/#tra_59.wav diff --git a/iwdification/dw_iwdspells_resource/wizard_lance_of_disruption/idpro313.pro b/iwdification/dw_iwdspells_resource/wizard_lance_of_disruption/idpro313.pro new file mode 100644 index 0000000..5f5e02b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_lance_of_disruption/idpro313.pro differ diff --git a/iwdification/dw_iwdspells_resource/wizard_lance_of_disruption/invoch.bam b/iwdification/dw_iwdspells_resource/wizard_lance_of_disruption/invoch.bam new file mode 100644 index 0000000..c3bf486 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_lance_of_disruption/invoch.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_lance_of_disruption/invoch.vvc b/iwdification/dw_iwdspells_resource/wizard_lance_of_disruption/invoch.vvc new file mode 100644 index 0000000..0030503 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_lance_of_disruption/invoch.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_lance_of_disruption/lodisr.pro b/iwdification/dw_iwdspells_resource/wizard_lance_of_disruption/lodisr.pro new file mode 100644 index 0000000..d841e87 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_lance_of_disruption/lodisr.pro differ diff --git a/iwdification/dw_iwdspells_resource/wizard_lance_of_disruption/lodisrt.bam b/iwdification/dw_iwdspells_resource/wizard_lance_of_disruption/lodisrt.bam new file mode 100644 index 0000000..ae52746 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_lance_of_disruption/lodisrt.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_lance_of_disruption/spwi328.spl b/iwdification/dw_iwdspells_resource/wizard_lance_of_disruption/spwi328.spl new file mode 100644 index 0000000..a61d3e6 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_lance_of_disruption/spwi328.spl differ diff --git a/iwdification/bam/cdia328a.bam b/iwdification/dw_iwdspells_resource/wizard_lance_of_disruption/spwi328a.bam similarity index 100% rename from iwdification/bam/cdia328a.bam rename to iwdification/dw_iwdspells_resource/wizard_lance_of_disruption/spwi328a.bam diff --git a/iwdification/bam/cdia328b.bam b/iwdification/dw_iwdspells_resource/wizard_lance_of_disruption/spwi328b.bam similarity index 100% rename from iwdification/bam/cdia328b.bam rename to iwdification/dw_iwdspells_resource/wizard_lance_of_disruption/spwi328b.bam diff --git a/iwdification/bam/cdia328c.bam b/iwdification/dw_iwdspells_resource/wizard_lance_of_disruption/spwi328c.bam similarity index 100% rename from iwdification/bam/cdia328c.bam rename to iwdification/dw_iwdspells_resource/wizard_lance_of_disruption/spwi328c.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_lich_touch/#eff_e04.wav b/iwdification/dw_iwdspells_resource/wizard_lich_touch/#eff_e04.wav new file mode 100644 index 0000000..72bd0e2 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_lich_touch/#eff_e04.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_lich_touch/#eff_m07.wav b/iwdification/dw_iwdspells_resource/wizard_lich_touch/#eff_m07.wav new file mode 100644 index 0000000..e4933ef Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_lich_touch/#eff_m07.wav differ diff --git a/iwdification/bam/cdiltou.bam b/iwdification/dw_iwdspells_resource/wizard_lich_touch/iltouch.bam similarity index 100% rename from iwdification/bam/cdiltou.bam rename to iwdification/dw_iwdspells_resource/wizard_lich_touch/iltouch.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_lich_touch/ltouch.itm b/iwdification/dw_iwdspells_resource/wizard_lich_touch/ltouch.itm new file mode 100644 index 0000000..75c7fd2 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_lich_touch/ltouch.itm differ diff --git a/iwdification/dw_iwdspells_resource/wizard_lich_touch/ltouch.spl b/iwdification/dw_iwdspells_resource/wizard_lich_touch/ltouch.spl new file mode 100644 index 0000000..1dbe0d8 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_lich_touch/ltouch.spl differ diff --git a/iwdification/dw_iwdspells_resource/wizard_lich_touch/necroh.bam b/iwdification/dw_iwdspells_resource/wizard_lich_touch/necroh.bam new file mode 100644 index 0000000..1712f6d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_lich_touch/necroh.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_lich_touch/necroh.vvc b/iwdification/dw_iwdspells_resource/wizard_lich_touch/necroh.vvc new file mode 100644 index 0000000..26e9f2a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_lich_touch/necroh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_lich_touch/spwi626.spl b/iwdification/dw_iwdspells_resource/wizard_lich_touch/spwi626.spl new file mode 100644 index 0000000..d46ff69 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_lich_touch/spwi626.spl differ diff --git a/iwdification/bam/cdia626a.bam b/iwdification/dw_iwdspells_resource/wizard_lich_touch/spwi626a.bam similarity index 100% rename from iwdification/bam/cdia626a.bam rename to iwdification/dw_iwdspells_resource/wizard_lich_touch/spwi626a.bam diff --git a/iwdification/bam/cdia626b.bam b/iwdification/dw_iwdspells_resource/wizard_lich_touch/spwi626b.bam similarity index 100% rename from iwdification/bam/cdia626b.bam rename to iwdification/dw_iwdspells_resource/wizard_lich_touch/spwi626b.bam diff --git a/iwdification/bam/cdia626c.bam b/iwdification/dw_iwdspells_resource/wizard_lich_touch/spwi626c.bam similarity index 100% rename from iwdification/bam/cdia626c.bam rename to iwdification/dw_iwdspells_resource/wizard_lich_touch/spwi626c.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_malavons_rage/#malrage.vvc b/iwdification/dw_iwdspells_resource/wizard_malavons_rage/#malrage.vvc new file mode 100644 index 0000000..5d8775f Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_malavons_rage/#malrage.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_malavons_rage/idpro209.pro b/iwdification/dw_iwdspells_resource/wizard_malavons_rage/idpro209.pro new file mode 100644 index 0000000..e7cef70 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_malavons_rage/idpro209.pro differ diff --git a/iwdification/dw_iwdspells_resource/wizard_malavons_rage/mrageh.bam b/iwdification/dw_iwdspells_resource/wizard_malavons_rage/mrageh.bam new file mode 100644 index 0000000..637be29 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_malavons_rage/mrageh.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_malavons_rage/mrageh.vvc b/iwdification/dw_iwdspells_resource/wizard_malavons_rage/mrageh.vvc new file mode 100644 index 0000000..4ef610d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_malavons_rage/mrageh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_malavons_rage/mragex.bam b/iwdification/dw_iwdspells_resource/wizard_malavons_rage/mragex.bam new file mode 100644 index 0000000..b6ceb57 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_malavons_rage/mragex.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_malavons_rage/spwi709.spl b/iwdification/dw_iwdspells_resource/wizard_malavons_rage/spwi709.spl new file mode 100644 index 0000000..aa73fb0 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_malavons_rage/spwi709.spl differ diff --git a/iwdification/bam/cdia709a.bam b/iwdification/dw_iwdspells_resource/wizard_malavons_rage/spwi709a.bam similarity index 100% rename from iwdification/bam/cdia709a.bam rename to iwdification/dw_iwdspells_resource/wizard_malavons_rage/spwi709a.bam diff --git a/iwdification/bam/cdia709b.bam b/iwdification/dw_iwdspells_resource/wizard_malavons_rage/spwi709b.bam similarity index 100% rename from iwdification/bam/cdia709b.bam rename to iwdification/dw_iwdspells_resource/wizard_malavons_rage/spwi709b.bam diff --git a/iwdification/bam/cdia709c.bam b/iwdification/dw_iwdspells_resource/wizard_malavons_rage/spwi709c.bam similarity index 100% rename from iwdification/bam/cdia709c.bam rename to iwdification/dw_iwdspells_resource/wizard_malavons_rage/spwi709c.bam diff --git a/iwdification/wav/cdiem02.ogg b/iwdification/dw_iwdspells_resource/wizard_mind_blank/#eff_m02.wav similarity index 100% rename from iwdification/wav/cdiem02.ogg rename to iwdification/dw_iwdspells_resource/wizard_mind_blank/#eff_m02.wav diff --git a/iwdification/dw_iwdspells_resource/wizard_mind_blank/abjurh.vvc b/iwdification/dw_iwdspells_resource/wizard_mind_blank/abjurh.vvc new file mode 100644 index 0000000..a570456 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_mind_blank/abjurh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_mind_blank/spwi802.spl b/iwdification/dw_iwdspells_resource/wizard_mind_blank/spwi802.spl new file mode 100644 index 0000000..ed063b2 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_mind_blank/spwi802.spl differ diff --git a/iwdification/bam/cdia802a.bam b/iwdification/dw_iwdspells_resource/wizard_mind_blank/spwi802a.bam similarity index 100% rename from iwdification/bam/cdia802a.bam rename to iwdification/dw_iwdspells_resource/wizard_mind_blank/spwi802a.bam diff --git a/iwdification/bam/cdia802b.bam b/iwdification/dw_iwdspells_resource/wizard_mind_blank/spwi802b.bam similarity index 100% rename from iwdification/bam/cdia802b.bam rename to iwdification/dw_iwdspells_resource/wizard_mind_blank/spwi802b.bam diff --git a/iwdification/bam/cdia802c.bam b/iwdification/dw_iwdspells_resource/wizard_mind_blank/spwi802c.bam similarity index 100% rename from iwdification/bam/cdia802c.bam rename to iwdification/dw_iwdspells_resource/wizard_mind_blank/spwi802c.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/#eff_m13.wav b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/#eff_m13.wav new file mode 100644 index 0000000..3e1b1c3 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/#eff_m13.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/#isc_01c.wav b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/#isc_01c.wav new file mode 100644 index 0000000..c6d87c1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/#isc_01c.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/gnsummb.baf b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/gnsummb.baf new file mode 100644 index 0000000..eb9791b --- /dev/null +++ b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/gnsummb.baf @@ -0,0 +1,25 @@ +IF + See(NearestEnemyOf(Myself)) + Range(LastSeenBy(Myself),4) +THEN + RESPONSE #100 + EquipMostDamagingMelee() + AttackReevaluate(LastSeenBy(Myself),45) +END + +IF + See(NearestEnemyOf(Myself)) + !Range(LastSeenBy(Myself),4) +THEN + RESPONSE #100 + EquipRanged() + AttackReevaluate(LastSeenBy(Myself),45) +END + +IF + AttackedBy(NearestEnemyOf(Myself),DEFAULT) +THEN + RESPONSE #100 + MoveToObject(LastAttackerOf(Myself)) +END + diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/gnsummm.baf b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/gnsummm.baf new file mode 100644 index 0000000..6723232 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/gnsummm.baf @@ -0,0 +1,14 @@ +IF + See(NearestEnemyOf(Myself)) +THEN + RESPONSE #100 + AttackReevaluate(LastSeenBy(Myself),75) +END + +IF + AttackedBy(NearestEnemyOf(Myself),DEFAULT) +THEN + RESPONSE #100 + MoveToObject(LastAttackerOf(Myself)) +END + diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/ms1goba.cre b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/ms1goba.cre new file mode 100644 index 0000000..85c80d2 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/ms1goba.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/ms1gobm.cre b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/ms1gobm.cre new file mode 100644 index 0000000..9665a24 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/ms1gobm.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/msumm1h.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/msumm1h.bam new file mode 100644 index 0000000..db39f3d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/msumm1h.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/msumm1h.vvc b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/msumm1h.vvc new file mode 100644 index 0000000..8aabcd1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/msumm1h.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/msumm1x.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/msumm1x.bam new file mode 100644 index 0000000..c59a41b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/msumm1x.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/msumm1x.vvc b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/msumm1x.vvc new file mode 100644 index 0000000..36682c6 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/msumm1x.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/msummo1.2da b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/msummo1.2da new file mode 100644 index 0000000..8a40314 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/msummo1.2da @@ -0,0 +1,6 @@ +2DA V1.0 +0 + RESREF Hit AreaHitAnimation +1 MS1fb MSumm1H MSumm1X +2 MS1goba MSumm1H MSumm1X +3 MS1gobm MSumm1H MSumm1X diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/spwi309.spl b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/spwi309.spl new file mode 100644 index 0000000..0fff079 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/spwi309.spl differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/spwi309a.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/spwi309a.bam new file mode 100644 index 0000000..cc50fd5 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/spwi309a.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/spwi309b.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/spwi309b.bam new file mode 100644 index 0000000..5535cb1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/spwi309b.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/spwi309c.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/spwi309c.bam new file mode 100644 index 0000000..f34f939 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_1/spwi309c.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/#eff_m13.wav b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/#eff_m13.wav new file mode 100644 index 0000000..3e1b1c3 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/#eff_m13.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/#isc_01c.wav b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/#isc_01c.wav new file mode 100644 index 0000000..c6d87c1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/#isc_01c.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/#s1-12.itm b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/#s1-12.itm new file mode 100644 index 0000000..d4db322 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/#s1-12.itm differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/gnsummm.baf b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/gnsummm.baf new file mode 100644 index 0000000..6723232 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/gnsummm.baf @@ -0,0 +1,14 @@ +IF + See(NearestEnemyOf(Myself)) +THEN + RESPONSE #100 + AttackReevaluate(LastSeenBy(Myself),75) +END + +IF + AttackedBy(NearestEnemyOf(Myself),DEFAULT) +THEN + RESPONSE #100 + MoveToObject(LastAttackerOf(Myself)) +END + diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/ms2lizm.cre b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/ms2lizm.cre new file mode 100644 index 0000000..5926fc7 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/ms2lizm.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/msumm1h.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/msumm1h.bam new file mode 100644 index 0000000..db39f3d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/msumm1h.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/msumm1h.vvc b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/msumm1h.vvc new file mode 100644 index 0000000..8aabcd1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/msumm1h.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/msumm1x.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/msumm1x.bam new file mode 100644 index 0000000..c59a41b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/msumm1x.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/msumm1x.vvc b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/msumm1x.vvc new file mode 100644 index 0000000..36682c6 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/msumm1x.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/msummo2.2da b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/msummo2.2da new file mode 100644 index 0000000..e7f605a --- /dev/null +++ b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/msummo2.2da @@ -0,0 +1,7 @@ +2DA V1.0 +0 + RESREF HitAnimation AreaHitAnimation +1 MS2bbtl MSumm1H MSumm1X +2 MS2gobb MSumm1H MSumm1X +3 MS2gobe MSumm1H MSumm1X +4 MS2lizm MSumm1H MSumm1X diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/ppaw.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/ppaw.bam new file mode 100644 index 0000000..c866168 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/ppaw.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/spwi407.spl b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/spwi407.spl new file mode 100644 index 0000000..ff941ce Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/spwi407.spl differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/spwi407a.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/spwi407a.bam new file mode 100644 index 0000000..211755c Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/spwi407a.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/spwi407b.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/spwi407b.bam new file mode 100644 index 0000000..97b0e84 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/spwi407b.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/spwi407c.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/spwi407c.bam new file mode 100644 index 0000000..35bc428 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_2/spwi407c.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_3/#eff_m13.wav b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_3/#eff_m13.wav new file mode 100644 index 0000000..3e1b1c3 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_3/#eff_m13.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_3/#isc_01c.wav b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_3/#isc_01c.wav new file mode 100644 index 0000000..c6d87c1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_3/#isc_01c.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_3/msumm1h.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_3/msumm1h.bam new file mode 100644 index 0000000..db39f3d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_3/msumm1h.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_3/msumm1h.vvc b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_3/msumm1h.vvc new file mode 100644 index 0000000..8aabcd1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_3/msumm1h.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_3/msumm1x.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_3/msumm1x.bam new file mode 100644 index 0000000..c59a41b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_3/msumm1x.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_3/msumm1x.vvc b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_3/msumm1x.vvc new file mode 100644 index 0000000..36682c6 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_3/msumm1x.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_3/msummo3.2da b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_3/msummo3.2da new file mode 100644 index 0000000..e1c662d --- /dev/null +++ b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_3/msummo3.2da @@ -0,0 +1,8 @@ +2DA V1.0 +0 + RESREF HitAnimation AreaHitAnimation +1 MS3borb MSumm1H MSumm1X +2 MS3ghl MSumm1H MSumm1X +3 MS3hspi MSumm1H MSumm1X +4 MS3orog MSumm1H MSumm1X +5 MS3tliz MSumm1H MSumm1X diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_3/spwi504.spl b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_3/spwi504.spl new file mode 100644 index 0000000..7862326 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_3/spwi504.spl differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_3/spwi504a.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_3/spwi504a.bam new file mode 100644 index 0000000..9138da3 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_3/spwi504a.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_3/spwi504b.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_3/spwi504b.bam new file mode 100644 index 0000000..352e4a5 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_3/spwi504b.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_3/spwi504c.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_3/spwi504c.bam new file mode 100644 index 0000000..6dbb89e Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_3/spwi504c.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_4/#eff_m13.wav b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_4/#eff_m13.wav new file mode 100644 index 0000000..3e1b1c3 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_4/#eff_m13.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_4/#isc_01c.wav b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_4/#isc_01c.wav new file mode 100644 index 0000000..c6d87c1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_4/#isc_01c.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_4/msumm1h.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_4/msumm1h.bam new file mode 100644 index 0000000..db39f3d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_4/msumm1h.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_4/msumm1h.vvc b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_4/msumm1h.vvc new file mode 100644 index 0000000..8aabcd1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_4/msumm1h.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_4/msumm1x.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_4/msumm1x.bam new file mode 100644 index 0000000..c59a41b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_4/msumm1x.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_4/msumm1x.vvc b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_4/msumm1x.vvc new file mode 100644 index 0000000..36682c6 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_4/msumm1x.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_4/msummo4.2da b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_4/msummo4.2da new file mode 100644 index 0000000..3dbeb8c --- /dev/null +++ b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_4/msummo4.2da @@ -0,0 +1,6 @@ +2DA V1.0 +0 + RESREF HitAnimation AreaHitAnimation +1 MS4ghst MSumm1H MSumm1X +2 MS4ogr MSumm1H MSumm1X +3 MS4yeti MSumm1H MSumm1X diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_4/spwi627.spl b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_4/spwi627.spl new file mode 100644 index 0000000..d1de62b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_4/spwi627.spl differ diff --git a/iwdification/bam/cdia627a.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_4/spwi627a.bam similarity index 100% rename from iwdification/bam/cdia627a.bam rename to iwdification/dw_iwdspells_resource/wizard_monster_summoning_4/spwi627a.bam diff --git a/iwdification/bam/cdia627b.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_4/spwi627b.bam similarity index 100% rename from iwdification/bam/cdia627b.bam rename to iwdification/dw_iwdspells_resource/wizard_monster_summoning_4/spwi627b.bam diff --git a/iwdification/bam/cdia627c.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_4/spwi627c.bam similarity index 100% rename from iwdification/bam/cdia627c.bam rename to iwdification/dw_iwdspells_resource/wizard_monster_summoning_4/spwi627c.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/#eff_m13.wav b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/#eff_m13.wav new file mode 100644 index 0000000..3e1b1c3 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/#eff_m13.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/#isc_01c.wav b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/#isc_01c.wav new file mode 100644 index 0000000..c6d87c1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/#isc_01c.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/gnsummm.baf b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/gnsummm.baf new file mode 100644 index 0000000..6723232 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/gnsummm.baf @@ -0,0 +1,14 @@ +IF + See(NearestEnemyOf(Myself)) +THEN + RESPONSE #100 + AttackReevaluate(LastSeenBy(Myself),75) +END + +IF + AttackedBy(NearestEnemyOf(Myself),DEFAULT) +THEN + RESPONSE #100 + MoveToObject(LastAttackerOf(Myself)) +END + diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/ms5mino.cre b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/ms5mino.cre new file mode 100644 index 0000000..f8008bd Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/ms5mino.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/msumm1h.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/msumm1h.bam new file mode 100644 index 0000000..db39f3d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/msumm1h.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/msumm1h.vvc b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/msumm1h.vvc new file mode 100644 index 0000000..8aabcd1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/msumm1h.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/msumm1x.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/msumm1x.bam new file mode 100644 index 0000000..c59a41b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/msumm1x.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/msumm1x.vvc b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/msumm1x.vvc new file mode 100644 index 0000000..36682c6 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/msumm1x.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/msummo5.2da b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/msummo5.2da new file mode 100644 index 0000000..2c6ced9 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/msummo5.2da @@ -0,0 +1,6 @@ +2DA V1.0 +0 + RESREF HitAnimation AreaHitAnimation +1 MS5gspi MSumm1H MSumm1X +2 MS5jzom MSumm1H MSumm1X +3 MS5mino MSumm1H MSumm1X diff --git a/iwdification/itm/cdis18ml.itm b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/s1-8m1.itm similarity index 100% rename from iwdification/itm/cdis18ml.itm rename to iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/s1-8m1.itm diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/spwi706.spl b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/spwi706.spl new file mode 100644 index 0000000..efb5fa5 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/spwi706.spl differ diff --git a/iwdification/bam/cdia706a.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/spwi706a.bam similarity index 100% rename from iwdification/bam/cdia706a.bam rename to iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/spwi706a.bam diff --git a/iwdification/bam/cdia706b.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/spwi706b.bam similarity index 100% rename from iwdification/bam/cdia706b.bam rename to iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/spwi706b.bam diff --git a/iwdification/bam/cdia706c.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/spwi706c.bam similarity index 100% rename from iwdification/bam/cdia706c.bam rename to iwdification/dw_iwdspells_resource/wizard_monster_summoning_5/spwi706c.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/#eff_m13.wav b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/#eff_m13.wav new file mode 100644 index 0000000..3e1b1c3 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/#eff_m13.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/#fireau.vvc b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/#fireau.vvc new file mode 100644 index 0000000..387c5f9 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/#fireau.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/#frostau.vvc b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/#frostau.vvc new file mode 100644 index 0000000..ff20bd6 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/#frostau.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/#isc_01c.wav b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/#isc_01c.wav new file mode 100644 index 0000000..c6d87c1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/#isc_01c.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/#temp.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/#temp.bam new file mode 100644 index 0000000..f65b5ba Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/#temp.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/csalring.itm b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/csalring.itm new file mode 100644 index 0000000..028902a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/csalring.itm differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/fiaurac.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/fiaurac.bam new file mode 100644 index 0000000..a9d70fb Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/fiaurac.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/fraurac.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/fraurac.bam new file mode 100644 index 0000000..3fc499e Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/fraurac.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/fsalring.itm b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/fsalring.itm new file mode 100644 index 0000000..808944a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/fsalring.itm differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/gnsummm.baf b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/gnsummm.baf new file mode 100644 index 0000000..6723232 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/gnsummm.baf @@ -0,0 +1,14 @@ +IF + See(NearestEnemyOf(Myself)) +THEN + RESPONSE #100 + AttackReevaluate(LastSeenBy(Myself),75) +END + +IF + AttackedBy(NearestEnemyOf(Myself),DEFAULT) +THEN + RESPONSE #100 + MoveToObject(LastAttackerOf(Myself)) +END + diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/ms6salc.cre b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/ms6salc.cre new file mode 100644 index 0000000..4446e30 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/ms6salc.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/ms6salf.cre b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/ms6salf.cre new file mode 100644 index 0000000..fe45fcf Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/ms6salf.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/msumm1h.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/msumm1h.bam new file mode 100644 index 0000000..db39f3d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/msumm1h.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/msumm1h.vvc b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/msumm1h.vvc new file mode 100644 index 0000000..8aabcd1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/msumm1h.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/msumm1x.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/msumm1x.bam new file mode 100644 index 0000000..c59a41b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/msumm1x.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/msumm1x.vvc b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/msumm1x.vvc new file mode 100644 index 0000000..36682c6 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/msumm1x.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/msummo6.2da b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/msummo6.2da new file mode 100644 index 0000000..20ed31c --- /dev/null +++ b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/msummo6.2da @@ -0,0 +1,7 @@ +2DA V1.0 +0 + RESREF HitAnimation AreaHitAnimation +1 MS6crwl MSumm1H MSumm1X +2 MS6pspi MSumm1H MSumm1X +3 MS6salc MSumm1H MSumm1X +4 MS6salf MSumm1H MSumm1X diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/salfire.itm b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/salfire.itm new file mode 100644 index 0000000..997ad19 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/salfire.itm differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/salfros.itm b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/salfros.itm new file mode 100644 index 0000000..28b8e49 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/salfros.itm differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/spwi801.spl b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/spwi801.spl new file mode 100644 index 0000000..860b9bc Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/spwi801.spl differ diff --git a/iwdification/bam/cdia801a.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/spwi801a.bam similarity index 100% rename from iwdification/bam/cdia801a.bam rename to iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/spwi801a.bam diff --git a/iwdification/bam/cdia801b.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/spwi801b.bam similarity index 100% rename from iwdification/bam/cdia801b.bam rename to iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/spwi801b.bam diff --git a/iwdification/bam/cdia801c.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/spwi801c.bam similarity index 100% rename from iwdification/bam/cdia801c.bam rename to iwdification/dw_iwdspells_resource/wizard_monster_summoning_6/spwi801c.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/#eff_m13.wav b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/#eff_m13.wav new file mode 100644 index 0000000..3e1b1c3 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/#eff_m13.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/#isc_01c.wav b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/#isc_01c.wav new file mode 100644 index 0000000..c6d87c1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/#isc_01c.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/gnsummm.baf b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/gnsummm.baf new file mode 100644 index 0000000..6723232 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/gnsummm.baf @@ -0,0 +1,14 @@ +IF + See(NearestEnemyOf(Myself)) +THEN + RESPONSE #100 + AttackReevaluate(LastSeenBy(Myself),75) +END + +IF + AttackedBy(NearestEnemyOf(Myself),DEFAULT) +THEN + RESPONSE #100 + MoveToObject(LastAttackerOf(Myself)) +END + diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/ms7bgrd.cre b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/ms7bgrd.cre new file mode 100644 index 0000000..a691535 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/ms7bgrd.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/ms7umbh.cre b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/ms7umbh.cre new file mode 100644 index 0000000..8bf11f5 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/ms7umbh.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/msumm1h.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/msumm1h.bam new file mode 100644 index 0000000..db39f3d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/msumm1h.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/msumm1h.vvc b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/msumm1h.vvc new file mode 100644 index 0000000..8aabcd1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/msumm1h.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/msumm1x.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/msumm1x.bam new file mode 100644 index 0000000..c59a41b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/msumm1x.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/msumm1x.vvc b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/msumm1x.vvc new file mode 100644 index 0000000..36682c6 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/msumm1x.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/msummo7.2da b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/msummo7.2da new file mode 100644 index 0000000..e57df48 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/msummo7.2da @@ -0,0 +1,5 @@ +2DA V1.0 +0 + RESREF HitAnimation AreaHitAnimation +1 MS7bgrd MSumm1H MSumm1X +2 MS7umbh MSumm1H MSumm1X diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/spwi901.spl b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/spwi901.spl new file mode 100644 index 0000000..cfe15db Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/spwi901.spl differ diff --git a/iwdification/bam/cdia901a.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/spwi901a.bam similarity index 100% rename from iwdification/bam/cdia901a.bam rename to iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/spwi901a.bam diff --git a/iwdification/bam/cdia901b.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/spwi901b.bam similarity index 100% rename from iwdification/bam/cdia901b.bam rename to iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/spwi901b.bam diff --git a/iwdification/bam/cdia901c.bam b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/spwi901c.bam similarity index 100% rename from iwdification/bam/cdia901c.bam rename to iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/spwi901c.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/umberhlk.itm b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/umberhlk.itm new file mode 100644 index 0000000..45775bf Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_monster_summoning_7/umberhlk.itm differ diff --git a/iwdification/wav/cdiem103.ogg b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_force_missiles/#ff_m103.wav similarity index 100% rename from iwdification/wav/cdiem103.ogg rename to iwdification/dw_iwdspells_resource/wizard_mordenkainens_force_missiles/#ff_m103.wav diff --git a/iwdification/dw_iwdspells_resource/wizard_mordenkainens_force_missiles/mfmiss.pro b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_force_missiles/mfmiss.pro new file mode 100644 index 0000000..641f15e Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_force_missiles/mfmiss.pro differ diff --git a/iwdification/dw_iwdspells_resource/wizard_mordenkainens_force_missiles/mfmiss2.pro b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_force_missiles/mfmiss2.pro new file mode 100644 index 0000000..c5f5414 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_force_missiles/mfmiss2.pro differ diff --git a/iwdification/dw_iwdspells_resource/wizard_mordenkainens_force_missiles/mfmissa.pro b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_force_missiles/mfmissa.pro new file mode 100644 index 0000000..8073131 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_force_missiles/mfmissa.pro differ diff --git a/iwdification/dw_iwdspells_resource/wizard_mordenkainens_force_missiles/mfmisst.bam b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_force_missiles/mfmisst.bam new file mode 100644 index 0000000..a5a8ef2 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_force_missiles/mfmisst.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_mordenkainens_force_missiles/mfmissx.bam b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_force_missiles/mfmissx.bam new file mode 100644 index 0000000..8f1d5fa Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_force_missiles/mfmissx.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_mordenkainens_force_missiles/mfmissx.vvc b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_force_missiles/mfmissx.vvc new file mode 100644 index 0000000..5f3a53e Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_force_missiles/mfmissx.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_mordenkainens_force_missiles/spwi430.spl b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_force_missiles/spwi430.spl new file mode 100644 index 0000000..6aa4f79 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_force_missiles/spwi430.spl differ diff --git a/iwdification/bam/cdia430a.bam b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_force_missiles/spwi430a.bam similarity index 100% rename from iwdification/bam/cdia430a.bam rename to iwdification/dw_iwdspells_resource/wizard_mordenkainens_force_missiles/spwi430a.bam diff --git a/iwdification/bam/cdia430b.bam b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_force_missiles/spwi430b.bam similarity index 100% rename from iwdification/bam/cdia430b.bam rename to iwdification/dw_iwdspells_resource/wizard_mordenkainens_force_missiles/spwi430b.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_mordenkainens_force_missiles/spwi430b.spl b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_force_missiles/spwi430b.spl new file mode 100644 index 0000000..ca8944d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_force_missiles/spwi430b.spl differ diff --git a/iwdification/bam/cdia430c.bam b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_force_missiles/spwi430c.bam similarity index 100% rename from iwdification/bam/cdia430c.bam rename to iwdification/dw_iwdspells_resource/wizard_mordenkainens_force_missiles/spwi430c.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/#eff_e01.wav b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/#eff_e01.wav new file mode 100644 index 0000000..30f8465 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/#eff_e01.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/#eff_m06.wav b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/#eff_m06.wav new file mode 100644 index 0000000..234a09b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/#eff_m06.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/#eff_m45.wav b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/#eff_m45.wav new file mode 100644 index 0000000..f8731df Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/#eff_m45.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/gsw1h01.bam b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/gsw1h01.bam new file mode 100644 index 0000000..59b7abc Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/gsw1h01.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/imsword.bam b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/imsword.bam new file mode 100644 index 0000000..ac1d6dd Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/imsword.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/invoch.bam b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/invoch.bam new file mode 100644 index 0000000..c3bf486 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/invoch.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/invoch.vvc b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/invoch.vvc new file mode 100644 index 0000000..0030503 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/invoch.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/msword.itm b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/msword.itm new file mode 100644 index 0000000..b665c30 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/msword.itm differ diff --git a/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/mswordh.bam b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/mswordh.bam new file mode 100644 index 0000000..38546ce Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/mswordh.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/mswordh.vvc b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/mswordh.vvc new file mode 100644 index 0000000..47a4152 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/mswordh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/spwi716.spl b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/spwi716.spl new file mode 100644 index 0000000..44e1555 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/spwi716.spl differ diff --git a/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/spwi716a.bam b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/spwi716a.bam new file mode 100644 index 0000000..005b955 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/spwi716a.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/spwi716b.bam b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/spwi716b.bam new file mode 100644 index 0000000..005381d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/spwi716b.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/spwi716c.bam b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/spwi716c.bam new file mode 100644 index 0000000..b65bfe7 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_mordenkainens_sword_iwd/spwi716c.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_otilukes_freezing_sphere/idpro269.pro b/iwdification/dw_iwdspells_resource/wizard_otilukes_freezing_sphere/idpro269.pro new file mode 100644 index 0000000..b83af79 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_otilukes_freezing_sphere/idpro269.pro differ diff --git a/iwdification/dw_iwdspells_resource/wizard_otilukes_freezing_sphere/ofspheh.bam b/iwdification/dw_iwdspells_resource/wizard_otilukes_freezing_sphere/ofspheh.bam new file mode 100644 index 0000000..469743e Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_otilukes_freezing_sphere/ofspheh.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_otilukes_freezing_sphere/ofspheh.vvc b/iwdification/dw_iwdspells_resource/wizard_otilukes_freezing_sphere/ofspheh.vvc new file mode 100644 index 0000000..0ff6ea6 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_otilukes_freezing_sphere/ofspheh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_otilukes_freezing_sphere/ofsphet.bam b/iwdification/dw_iwdspells_resource/wizard_otilukes_freezing_sphere/ofsphet.bam new file mode 100644 index 0000000..75e9698 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_otilukes_freezing_sphere/ofsphet.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_otilukes_freezing_sphere/spwi628.spl b/iwdification/dw_iwdspells_resource/wizard_otilukes_freezing_sphere/spwi628.spl new file mode 100644 index 0000000..3fb8e7b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_otilukes_freezing_sphere/spwi628.spl differ diff --git a/iwdification/bam/cdia628a.bam b/iwdification/dw_iwdspells_resource/wizard_otilukes_freezing_sphere/spwi628a.bam similarity index 100% rename from iwdification/bam/cdia628a.bam rename to iwdification/dw_iwdspells_resource/wizard_otilukes_freezing_sphere/spwi628a.bam diff --git a/iwdification/bam/cdia628b.bam b/iwdification/dw_iwdspells_resource/wizard_otilukes_freezing_sphere/spwi628b.bam similarity index 100% rename from iwdification/bam/cdia628b.bam rename to iwdification/dw_iwdspells_resource/wizard_otilukes_freezing_sphere/spwi628b.bam diff --git a/iwdification/bam/cdia628c.bam b/iwdification/dw_iwdspells_resource/wizard_otilukes_freezing_sphere/spwi628c.bam similarity index 100% rename from iwdification/bam/cdia628c.bam rename to iwdification/dw_iwdspells_resource/wizard_otilukes_freezing_sphere/spwi628c.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes1a.vvc b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes1a.vvc new file mode 100644 index 0000000..9035044 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes1a.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes1b.vvc b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes1b.vvc new file mode 100644 index 0000000..8261daf Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes1b.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes1c.vvc b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes1c.vvc new file mode 100644 index 0000000..63bda54 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes1c.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes1d.vvc b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes1d.vvc new file mode 100644 index 0000000..e8ad7f3 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes1d.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes1e.vvc b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes1e.vvc new file mode 100644 index 0000000..7caf97d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes1e.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes1f.vvc b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes1f.vvc new file mode 100644 index 0000000..1f19d69 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes1f.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes1g.vvc b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes1g.vvc new file mode 100644 index 0000000..342e5a4 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes1g.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes2a.vvc b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes2a.vvc new file mode 100644 index 0000000..b4f7e9f Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes2a.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes2b.vvc b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes2b.vvc new file mode 100644 index 0000000..feda520 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes2b.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes2c.vvc b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes2c.vvc new file mode 100644 index 0000000..1282d29 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes2c.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes2d.vvc b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes2d.vvc new file mode 100644 index 0000000..cf772e3 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes2d.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes2e.vvc b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes2e.vvc new file mode 100644 index 0000000..d9c6694 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes2e.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes2f.vvc b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes2f.vvc new file mode 100644 index 0000000..22391b1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes2f.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes2g.vvc b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes2g.vvc new file mode 100644 index 0000000..aede7fe Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/#7eyes2g.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_seven_eyes/7eyes.2da b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/7eyes.2da new file mode 100644 index 0000000..2a57e45 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/7eyes.2da @@ -0,0 +1,10 @@ +2DA V1.0 +* + STATE STRREF 1 2 3 4 5 6 7 8 9 +EYEMIND 48 21654 3 5 24 76 128 SPWI411 SPPR102 SPPR311 SPPR716 +EYESWORD 49 21653 12*0 12*0x800000 12*0x100000 12*0x1000000 * * * * * +EYEMAGE 50 21652 12*0x80000 12*0x40000 12*0x20000 12*0x10000 12*0x400000 * * * * +EYEVENOM 51 21651 12*0x200000 25 * * * * * * * +EYESPIRIT 52 21650 SPWI605 SPWI713 SPWI912 SPPR511 SPPR734 * * * * +EYEFORTITUDE 53 21649 38 45 74 80 109 175 210 * * +EYESTONE 54 21648 134 * * * * * * * * diff --git a/iwdification/bam/cdi7eyc1.bam b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/seyesc1.bam similarity index 100% rename from iwdification/bam/cdi7eyc1.bam rename to iwdification/dw_iwdspells_resource/wizard_seven_eyes/seyesc1.bam diff --git a/iwdification/bam/cdi7eyc2.bam b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/seyesc2.bam similarity index 100% rename from iwdification/bam/cdi7eyc2.bam rename to iwdification/dw_iwdspells_resource/wizard_seven_eyes/seyesc2.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_seven_eyes/spwi725.spl b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/spwi725.spl new file mode 100644 index 0000000..c56cc54 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/spwi725.spl differ diff --git a/iwdification/bam/cdia725a.bam b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/spwi725a.bam similarity index 100% rename from iwdification/bam/cdia725a.bam rename to iwdification/dw_iwdspells_resource/wizard_seven_eyes/spwi725a.bam diff --git a/iwdification/bam/cdia725b.bam b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/spwi725b.bam similarity index 100% rename from iwdification/bam/cdia725b.bam rename to iwdification/dw_iwdspells_resource/wizard_seven_eyes/spwi725b.bam diff --git a/iwdification/bam/cdia725c.bam b/iwdification/dw_iwdspells_resource/wizard_seven_eyes/spwi725c.bam similarity index 100% rename from iwdification/bam/cdia725c.bam rename to iwdification/dw_iwdspells_resource/wizard_seven_eyes/spwi725c.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_shades/#eff_m13.wav b/iwdification/dw_iwdspells_resource/wizard_shades/#eff_m13.wav new file mode 100644 index 0000000..3e1b1c3 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shades/#eff_m13.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shades/#isc_01c.wav b/iwdification/dw_iwdspells_resource/wizard_shades/#isc_01c.wav new file mode 100644 index 0000000..c6d87c1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shades/#isc_01c.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shades/cdiwdtr1.spl b/iwdification/dw_iwdspells_resource/wizard_shades/cdiwdtr1.spl new file mode 100644 index 0000000..1226e67 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shades/cdiwdtr1.spl differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shades/eftrolg.baf b/iwdification/dw_iwdspells_resource/wizard_shades/eftrolg.baf new file mode 100644 index 0000000..e69de29 diff --git a/iwdification/dw_iwdspells_resource/wizard_shades/gnsummm.baf b/iwdification/dw_iwdspells_resource/wizard_shades/gnsummm.baf new file mode 100644 index 0000000..6723232 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/wizard_shades/gnsummm.baf @@ -0,0 +1,14 @@ +IF + See(NearestEnemyOf(Myself)) +THEN + RESPONSE #100 + AttackReevaluate(LastSeenBy(Myself),75) +END + +IF + AttackedBy(NearestEnemyOf(Myself),DEFAULT) +THEN + RESPONSE #100 + MoveToObject(LastAttackerOf(Myself)) +END + diff --git a/iwdification/dw_iwdspells_resource/wizard_shades/m1d7slsh.itm b/iwdification/dw_iwdspells_resource/wizard_shades/m1d7slsh.itm new file mode 100644 index 0000000..1c956e2 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shades/m1d7slsh.itm differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shades/msumm1h.bam b/iwdification/dw_iwdspells_resource/wizard_shades/msumm1h.bam new file mode 100644 index 0000000..db39f3d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shades/msumm1h.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shades/msumm1h.vvc b/iwdification/dw_iwdspells_resource/wizard_shades/msumm1h.vvc new file mode 100644 index 0000000..8aabcd1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shades/msumm1h.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shades/msumm1x.bam b/iwdification/dw_iwdspells_resource/wizard_shades/msumm1x.bam new file mode 100644 index 0000000..c59a41b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shades/msumm1x.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shades/msumm1x.vvc b/iwdification/dw_iwdspells_resource/wizard_shades/msumm1x.vvc new file mode 100644 index 0000000..36682c6 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shades/msumm1x.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shades/reg1hp2.itm b/iwdification/dw_iwdspells_resource/wizard_shades/reg1hp2.itm new file mode 100644 index 0000000..fec4e82 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shades/reg1hp2.itm differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shades/shades.2da b/iwdification/dw_iwdspells_resource/wizard_shades/shades.2da new file mode 100644 index 0000000..0501ab2 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/wizard_shades/shades.2da @@ -0,0 +1,14 @@ +2DA V1.0 +0 + RESREF HitAnimation AreaHitAnimation +1 SS2gob2 MSumm1H MSumm1X +2 SS2gob2 MSumm1H MSumm1X +3 SS2gob3 MSumm1H MSumm1X +4 SS2gob3 MSumm1H MSumm1X +5 SS2liz5 MSumm1H MSumm1X +6 SS2liz6 MSumm1H MSumm1X +7 SS2liz7 MSumm1H MSumm1X +8 SS3trl7 MSumm1H MSumm1X +9 SS3trl8 MSumm1H MSumm1X +10 SS3umb8 MSumm1H MSumm1X +11 SS3umb9 MSumm1H MSumm1X diff --git a/iwdification/dw_iwdspells_resource/wizard_shades/spwi629.spl b/iwdification/dw_iwdspells_resource/wizard_shades/spwi629.spl new file mode 100644 index 0000000..07d4b09 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shades/spwi629.spl differ diff --git a/iwdification/bam/cdia629a.bam b/iwdification/dw_iwdspells_resource/wizard_shades/spwi629a.bam similarity index 100% rename from iwdification/bam/cdia629a.bam rename to iwdification/dw_iwdspells_resource/wizard_shades/spwi629a.bam diff --git a/iwdification/bam/cdia629b.bam b/iwdification/dw_iwdspells_resource/wizard_shades/spwi629b.bam similarity index 100% rename from iwdification/bam/cdia629b.bam rename to iwdification/dw_iwdspells_resource/wizard_shades/spwi629b.bam diff --git a/iwdification/bam/cdia629c.bam b/iwdification/dw_iwdspells_resource/wizard_shades/spwi629c.bam similarity index 100% rename from iwdification/bam/cdia629c.bam rename to iwdification/dw_iwdspells_resource/wizard_shades/spwi629c.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_shades/ss2gob2.cre b/iwdification/dw_iwdspells_resource/wizard_shades/ss2gob2.cre new file mode 100644 index 0000000..7940bf4 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shades/ss2gob2.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shades/ss2gob3.cre b/iwdification/dw_iwdspells_resource/wizard_shades/ss2gob3.cre new file mode 100644 index 0000000..17f53fb Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shades/ss2gob3.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shades/ss2liz5.cre b/iwdification/dw_iwdspells_resource/wizard_shades/ss2liz5.cre new file mode 100644 index 0000000..6fcf159 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shades/ss2liz5.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shades/ss2liz6.cre b/iwdification/dw_iwdspells_resource/wizard_shades/ss2liz6.cre new file mode 100644 index 0000000..dc21c98 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shades/ss2liz6.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shades/ss2liz7.cre b/iwdification/dw_iwdspells_resource/wizard_shades/ss2liz7.cre new file mode 100644 index 0000000..47d4e25 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shades/ss2liz7.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shades/ss3trl7.cre b/iwdification/dw_iwdspells_resource/wizard_shades/ss3trl7.cre new file mode 100644 index 0000000..2c27a80 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shades/ss3trl7.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shades/ss3trl8.cre b/iwdification/dw_iwdspells_resource/wizard_shades/ss3trl8.cre new file mode 100644 index 0000000..fb9c267 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shades/ss3trl8.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shades/ss3umb8.cre b/iwdification/dw_iwdspells_resource/wizard_shades/ss3umb8.cre new file mode 100644 index 0000000..f0a1dad Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shades/ss3umb8.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shades/ss3umb9.cre b/iwdification/dw_iwdspells_resource/wizard_shades/ss3umb9.cre new file mode 100644 index 0000000..f682e1e Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shades/ss3umb9.cre differ diff --git a/iwdification/itm/cdisumam.itm b/iwdification/dw_iwdspells_resource/wizard_shades/sumamu.itm similarity index 100% rename from iwdification/itm/cdisumam.itm rename to iwdification/dw_iwdspells_resource/wizard_shades/sumamu.itm diff --git a/iwdification/dw_iwdspells_resource/wizard_shades/sumring.itm b/iwdification/dw_iwdspells_resource/wizard_shades/sumring.itm new file mode 100644 index 0000000..1ab234d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shades/sumring.itm differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shades/trans40.itm b/iwdification/dw_iwdspells_resource/wizard_shades/trans40.itm new file mode 100644 index 0000000..0b7080a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shades/trans40.itm differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shades/trans60.itm b/iwdification/dw_iwdspells_resource/wizard_shades/trans60.itm new file mode 100644 index 0000000..3dd3c45 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shades/trans60.itm differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shades/umberhlk.itm b/iwdification/dw_iwdspells_resource/wizard_shades/umberhlk.itm new file mode 100644 index 0000000..45775bf Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shades/umberhlk.itm differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/#eff_m13.wav b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/#eff_m13.wav new file mode 100644 index 0000000..3e1b1c3 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/#eff_m13.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/#isc_01c.wav b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/#isc_01c.wav new file mode 100644 index 0000000..c6d87c1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/#isc_01c.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/#s1-12.itm b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/#s1-12.itm new file mode 100644 index 0000000..d4db322 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/#s1-12.itm differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/gnsummm.baf b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/gnsummm.baf new file mode 100644 index 0000000..6723232 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/gnsummm.baf @@ -0,0 +1,14 @@ +IF + See(NearestEnemyOf(Myself)) +THEN + RESPONSE #100 + AttackReevaluate(LastSeenBy(Myself),75) +END + +IF + AttackedBy(NearestEnemyOf(Myself),DEFAULT) +THEN + RESPONSE #100 + MoveToObject(LastAttackerOf(Myself)) +END + diff --git a/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/m1d7slsh.itm b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/m1d7slsh.itm new file mode 100644 index 0000000..1c956e2 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/m1d7slsh.itm differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/msumm1h.bam b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/msumm1h.bam new file mode 100644 index 0000000..db39f3d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/msumm1h.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/msumm1h.vvc b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/msumm1h.vvc new file mode 100644 index 0000000..8aabcd1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/msumm1h.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/msumm1x.bam b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/msumm1x.bam new file mode 100644 index 0000000..c59a41b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/msumm1x.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/msumm1x.vvc b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/msumm1x.vvc new file mode 100644 index 0000000..36682c6 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/msumm1x.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/ppaw.bam b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/ppaw.bam new file mode 100644 index 0000000..c866168 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/ppaw.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/smonste.2da b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/smonste.2da new file mode 100644 index 0000000..852667c --- /dev/null +++ b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/smonste.2da @@ -0,0 +1,11 @@ +2DA V1.0 +0 + RESREF HitAnimation AreaHitAnimation +1 SS1gob1 MSumm1H MSumm1X +2 SS1gob2 MSumm1H MSumm1X +3 SS1gob3 MSumm1H MSumm1X +4 SS1liz3 MSumm1H MSumm1X +5 SS1liz4 MSumm1H MSumm1X +6 SS1trl6 MSumm1H MSumm1X +7 SS1trl7 MSumm1H MSumm1X +8 SS1trl8 MSumm1H MSumm1X diff --git a/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/spwi426.spl b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/spwi426.spl new file mode 100644 index 0000000..14a218d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/spwi426.spl differ diff --git a/iwdification/bam/cdia426a.bam b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/spwi426a.bam similarity index 100% rename from iwdification/bam/cdia426a.bam rename to iwdification/dw_iwdspells_resource/wizard_shadow_monsters/spwi426a.bam diff --git a/iwdification/bam/cdia426b.bam b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/spwi426b.bam similarity index 100% rename from iwdification/bam/cdia426b.bam rename to iwdification/dw_iwdspells_resource/wizard_shadow_monsters/spwi426b.bam diff --git a/iwdification/bam/cdia426c.bam b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/spwi426c.bam similarity index 100% rename from iwdification/bam/cdia426c.bam rename to iwdification/dw_iwdspells_resource/wizard_shadow_monsters/spwi426c.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/ss1gob1.cre b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/ss1gob1.cre new file mode 100644 index 0000000..482a270 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/ss1gob1.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/ss1gob2.cre b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/ss1gob2.cre new file mode 100644 index 0000000..eb7dcb6 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/ss1gob2.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/ss1gob3.cre b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/ss1gob3.cre new file mode 100644 index 0000000..d9fa26b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/ss1gob3.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/ss1liz3.cre b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/ss1liz3.cre new file mode 100644 index 0000000..b892b2a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/ss1liz3.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/ss1liz4.cre b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/ss1liz4.cre new file mode 100644 index 0000000..3cffcc0 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/ss1liz4.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/ss1trl6.cre b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/ss1trl6.cre new file mode 100644 index 0000000..95e03be Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/ss1trl6.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/ss1trl7.cre b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/ss1trl7.cre new file mode 100644 index 0000000..25931e1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/ss1trl7.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/ss1trl8.cre b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/ss1trl8.cre new file mode 100644 index 0000000..e3ab0e2 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/ss1trl8.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/sumring.itm b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/sumring.itm new file mode 100644 index 0000000..1ab234d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/sumring.itm differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/trans20.itm b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/trans20.itm new file mode 100644 index 0000000..f4d7bc1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shadow_monsters/trans20.itm differ diff --git a/iwdification/wav/cdiem100.ogg b/iwdification/dw_iwdspells_resource/wizard_shout/#ff_m100.wav similarity index 100% rename from iwdification/wav/cdiem100.ogg rename to iwdification/dw_iwdspells_resource/wizard_shout/#ff_m100.wav diff --git a/iwdification/dw_iwdspells_resource/wizard_shout/#tra_08.wav b/iwdification/dw_iwdspells_resource/wizard_shout/#tra_08.wav new file mode 100644 index 0000000..5da095b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shout/#tra_08.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shout/idpro315.pro b/iwdification/dw_iwdspells_resource/wizard_shout/idpro315.pro new file mode 100644 index 0000000..35c030f Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shout/idpro315.pro differ diff --git a/iwdification/bam/cdishout.bam b/iwdification/dw_iwdspells_resource/wizard_shout/shoutt.bam similarity index 100% rename from iwdification/bam/cdishout.bam rename to iwdification/dw_iwdspells_resource/wizard_shout/shoutt.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_shout/spwi431.spl b/iwdification/dw_iwdspells_resource/wizard_shout/spwi431.spl new file mode 100644 index 0000000..0816af5 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shout/spwi431.spl differ diff --git a/iwdification/bam/cdia431a.bam b/iwdification/dw_iwdspells_resource/wizard_shout/spwi431a.bam similarity index 100% rename from iwdification/bam/cdia431a.bam rename to iwdification/dw_iwdspells_resource/wizard_shout/spwi431a.bam diff --git a/iwdification/bam/cdia431b.bam b/iwdification/dw_iwdspells_resource/wizard_shout/spwi431b.bam similarity index 100% rename from iwdification/bam/cdia431b.bam rename to iwdification/dw_iwdspells_resource/wizard_shout/spwi431b.bam diff --git a/iwdification/bam/cdia431c.bam b/iwdification/dw_iwdspells_resource/wizard_shout/spwi431c.bam similarity index 100% rename from iwdification/bam/cdia431c.bam rename to iwdification/dw_iwdspells_resource/wizard_shout/spwi431c.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_shroud_of_flame/#isc_01c.wav b/iwdification/dw_iwdspells_resource/wizard_shroud_of_flame/#isc_01c.wav new file mode 100644 index 0000000..c6d87c1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shroud_of_flame/#isc_01c.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shroud_of_flame/#soflamc.spl b/iwdification/dw_iwdspells_resource/wizard_shroud_of_flame/#soflamc.spl new file mode 100644 index 0000000..1eecdcb Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shroud_of_flame/#soflamc.spl differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shroud_of_flame/idshroud.pro b/iwdification/dw_iwdspells_resource/wizard_shroud_of_flame/idshroud.pro new file mode 100644 index 0000000..2acc1d8 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shroud_of_flame/idshroud.pro differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shroud_of_flame/soflamc.bam b/iwdification/dw_iwdspells_resource/wizard_shroud_of_flame/soflamc.bam new file mode 100644 index 0000000..7c8ea6e Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shroud_of_flame/soflamc.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shroud_of_flame/soflamc.vvc b/iwdification/dw_iwdspells_resource/wizard_shroud_of_flame/soflamc.vvc new file mode 100644 index 0000000..bdfb94a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shroud_of_flame/soflamc.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_shroud_of_flame/spwi524.spl b/iwdification/dw_iwdspells_resource/wizard_shroud_of_flame/spwi524.spl new file mode 100644 index 0000000..c02b6f8 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shroud_of_flame/spwi524.spl differ diff --git a/iwdification/bam/cdia524a.bam b/iwdification/dw_iwdspells_resource/wizard_shroud_of_flame/spwi524a.bam similarity index 100% rename from iwdification/bam/cdia524a.bam rename to iwdification/dw_iwdspells_resource/wizard_shroud_of_flame/spwi524a.bam diff --git a/iwdification/bam/cdia524b.bam b/iwdification/dw_iwdspells_resource/wizard_shroud_of_flame/spwi524b.bam similarity index 100% rename from iwdification/bam/cdia524b.bam rename to iwdification/dw_iwdspells_resource/wizard_shroud_of_flame/spwi524b.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_shroud_of_flame/spwi524b.spl b/iwdification/dw_iwdspells_resource/wizard_shroud_of_flame/spwi524b.spl new file mode 100644 index 0000000..49a217b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shroud_of_flame/spwi524b.spl differ diff --git a/iwdification/bam/cdia524c.bam b/iwdification/dw_iwdspells_resource/wizard_shroud_of_flame/spwi524c.bam similarity index 100% rename from iwdification/bam/cdia524c.bam rename to iwdification/dw_iwdspells_resource/wizard_shroud_of_flame/spwi524c.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_shroud_of_flame/spwi524c.spl b/iwdification/dw_iwdspells_resource/wizard_shroud_of_flame/spwi524c.spl new file mode 100644 index 0000000..870f7fc Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_shroud_of_flame/spwi524c.spl differ diff --git a/iwdification/dw_iwdspells_resource/wizard_snillocs_snowball_swarm/#ssswarm.vvc b/iwdification/dw_iwdspells_resource/wizard_snillocs_snowball_swarm/#ssswarm.vvc new file mode 100644 index 0000000..3a41c7b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_snillocs_snowball_swarm/#ssswarm.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_snillocs_snowball_swarm/idpro217.pro b/iwdification/dw_iwdspells_resource/wizard_snillocs_snowball_swarm/idpro217.pro new file mode 100644 index 0000000..561911e Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_snillocs_snowball_swarm/idpro217.pro differ diff --git a/iwdification/wav/cdirngm2.ogg b/iwdification/dw_iwdspells_resource/wizard_snillocs_snowball_swarm/rng_m02.wav similarity index 100% rename from iwdification/wav/cdirngm2.ogg rename to iwdification/dw_iwdspells_resource/wizard_snillocs_snowball_swarm/rng_m02.wav diff --git a/iwdification/dw_iwdspells_resource/wizard_snillocs_snowball_swarm/spwi204.spl b/iwdification/dw_iwdspells_resource/wizard_snillocs_snowball_swarm/spwi204.spl new file mode 100644 index 0000000..1b0b960 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_snillocs_snowball_swarm/spwi204.spl differ diff --git a/iwdification/bam/cdia204a.bam b/iwdification/dw_iwdspells_resource/wizard_snillocs_snowball_swarm/spwi204a.bam similarity index 100% rename from iwdification/bam/cdia204a.bam rename to iwdification/dw_iwdspells_resource/wizard_snillocs_snowball_swarm/spwi204a.bam diff --git a/iwdification/bam/cdia204b.bam b/iwdification/dw_iwdspells_resource/wizard_snillocs_snowball_swarm/spwi204b.bam similarity index 100% rename from iwdification/bam/cdia204b.bam rename to iwdification/dw_iwdspells_resource/wizard_snillocs_snowball_swarm/spwi204b.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_snillocs_snowball_swarm/spwi204b.spl b/iwdification/dw_iwdspells_resource/wizard_snillocs_snowball_swarm/spwi204b.spl new file mode 100644 index 0000000..816a524 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_snillocs_snowball_swarm/spwi204b.spl differ diff --git a/iwdification/bam/cdia204c.bam b/iwdification/dw_iwdspells_resource/wizard_snillocs_snowball_swarm/spwi204c.bam similarity index 100% rename from iwdification/bam/cdia204c.bam rename to iwdification/dw_iwdspells_resource/wizard_snillocs_snowball_swarm/spwi204c.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_snillocs_snowball_swarm/spwi204c.spl b/iwdification/dw_iwdspells_resource/wizard_snillocs_snowball_swarm/spwi204c.spl new file mode 100644 index 0000000..db8c327 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_snillocs_snowball_swarm/spwi204c.spl differ diff --git a/iwdification/dw_iwdspells_resource/wizard_snillocs_snowball_swarm/ssswarr.bam b/iwdification/dw_iwdspells_resource/wizard_snillocs_snowball_swarm/ssswarr.bam new file mode 100644 index 0000000..932b62d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_snillocs_snowball_swarm/ssswarr.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_snillocs_snowball_swarm/ssswart.bam b/iwdification/dw_iwdspells_resource/wizard_snillocs_snowball_swarm/ssswart.bam new file mode 100644 index 0000000..02e7c5f Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_snillocs_snowball_swarm/ssswart.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_snillocs_snowball_swarm/ssswarx.bam b/iwdification/dw_iwdspells_resource/wizard_snillocs_snowball_swarm/ssswarx.bam new file mode 100644 index 0000000..9068b26 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_snillocs_snowball_swarm/ssswarx.bam differ diff --git a/iwdification/wav/cdiem104.ogg b/iwdification/dw_iwdspells_resource/wizard_soul_eater/#ff_m104.wav similarity index 100% rename from iwdification/wav/cdiem104.ogg rename to iwdification/dw_iwdspells_resource/wizard_soul_eater/#ff_m104.wav diff --git a/iwdification/dw_iwdspells_resource/wizard_soul_eater/ad3sklm.cre b/iwdification/dw_iwdspells_resource/wizard_soul_eater/ad3sklm.cre new file mode 100644 index 0000000..2d1a312 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_soul_eater/ad3sklm.cre differ diff --git a/iwdification/wav/cdiarm18.ogg b/iwdification/dw_iwdspells_resource/wizard_soul_eater/are_m18.wav similarity index 100% rename from iwdification/wav/cdiarm18.ogg rename to iwdification/dw_iwdspells_resource/wizard_soul_eater/are_m18.wav diff --git a/iwdification/dw_iwdspells_resource/wizard_soul_eater/gnsummm.baf b/iwdification/dw_iwdspells_resource/wizard_soul_eater/gnsummm.baf new file mode 100644 index 0000000..6723232 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/wizard_soul_eater/gnsummm.baf @@ -0,0 +1,14 @@ +IF + See(NearestEnemyOf(Myself)) +THEN + RESPONSE #100 + AttackReevaluate(LastSeenBy(Myself),75) +END + +IF + AttackedBy(NearestEnemyOf(Myself),DEFAULT) +THEN + RESPONSE #100 + MoveToObject(LastAttackerOf(Myself)) +END + diff --git a/iwdification/dw_iwdspells_resource/wizard_soul_eater/idpro299.pro b/iwdification/dw_iwdspells_resource/wizard_soul_eater/idpro299.pro new file mode 100644 index 0000000..6e2ab74 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_soul_eater/idpro299.pro differ diff --git a/iwdification/dw_iwdspells_resource/wizard_soul_eater/rndtre40.itm b/iwdification/dw_iwdspells_resource/wizard_soul_eater/rndtre40.itm new file mode 100644 index 0000000..752255d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_soul_eater/rndtre40.itm differ diff --git a/iwdification/dw_iwdspells_resource/wizard_soul_eater/seatera.bam b/iwdification/dw_iwdspells_resource/wizard_soul_eater/seatera.bam new file mode 100644 index 0000000..a91fb30 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_soul_eater/seatera.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_soul_eater/seatera.vvc b/iwdification/dw_iwdspells_resource/wizard_soul_eater/seatera.vvc new file mode 100644 index 0000000..caae5b3 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_soul_eater/seatera.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_soul_eater/seaterh.bam b/iwdification/dw_iwdspells_resource/wizard_soul_eater/seaterh.bam new file mode 100644 index 0000000..5dc42ec Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_soul_eater/seaterh.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_soul_eater/seaterh.vvc b/iwdification/dw_iwdspells_resource/wizard_soul_eater/seaterh.vvc new file mode 100644 index 0000000..b2454dd Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_soul_eater/seaterh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_soul_eater/spwi631.spl b/iwdification/dw_iwdspells_resource/wizard_soul_eater/spwi631.spl new file mode 100644 index 0000000..1490990 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_soul_eater/spwi631.spl differ diff --git a/iwdification/bam/cdia631a.bam b/iwdification/dw_iwdspells_resource/wizard_soul_eater/spwi631a.bam similarity index 100% rename from iwdification/bam/cdia631a.bam rename to iwdification/dw_iwdspells_resource/wizard_soul_eater/spwi631a.bam diff --git a/iwdification/bam/cdia631b.bam b/iwdification/dw_iwdspells_resource/wizard_soul_eater/spwi631b.bam similarity index 100% rename from iwdification/bam/cdia631b.bam rename to iwdification/dw_iwdspells_resource/wizard_soul_eater/spwi631b.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_soul_eater/spwi631b.spl b/iwdification/dw_iwdspells_resource/wizard_soul_eater/spwi631b.spl new file mode 100644 index 0000000..acfdda6 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_soul_eater/spwi631b.spl differ diff --git a/iwdification/bam/cdia631c.bam b/iwdification/dw_iwdspells_resource/wizard_soul_eater/spwi631c.bam similarity index 100% rename from iwdification/bam/cdia631c.bam rename to iwdification/dw_iwdspells_resource/wizard_soul_eater/spwi631c.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_suffocate/idpro317.pro b/iwdification/dw_iwdspells_resource/wizard_suffocate/idpro317.pro new file mode 100644 index 0000000..1d692ca Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_suffocate/idpro317.pro differ diff --git a/iwdification/dw_iwdspells_resource/wizard_suffocate/spwi726.spl b/iwdification/dw_iwdspells_resource/wizard_suffocate/spwi726.spl new file mode 100644 index 0000000..9b55f67 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_suffocate/spwi726.spl differ diff --git a/iwdification/bam/cdia726a.bam b/iwdification/dw_iwdspells_resource/wizard_suffocate/spwi726a.bam similarity index 100% rename from iwdification/bam/cdia726a.bam rename to iwdification/dw_iwdspells_resource/wizard_suffocate/spwi726a.bam diff --git a/iwdification/bam/cdia726b.bam b/iwdification/dw_iwdspells_resource/wizard_suffocate/spwi726b.bam similarity index 100% rename from iwdification/bam/cdia726b.bam rename to iwdification/dw_iwdspells_resource/wizard_suffocate/spwi726b.bam diff --git a/iwdification/bam/cdia726c.bam b/iwdification/dw_iwdspells_resource/wizard_suffocate/spwi726c.bam similarity index 100% rename from iwdification/bam/cdia726c.bam rename to iwdification/dw_iwdspells_resource/wizard_suffocate/spwi726c.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_suffocate/suffoca.bam b/iwdification/dw_iwdspells_resource/wizard_suffocate/suffoca.bam new file mode 100644 index 0000000..1dc9640 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_suffocate/suffoca.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_suffocate/suffoca.vvc b/iwdification/dw_iwdspells_resource/wizard_suffocate/suffoca.vvc new file mode 100644 index 0000000..b17cf6b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_suffocate/suffoca.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_summon_shadow/#eff_m13.wav b/iwdification/dw_iwdspells_resource/wizard_summon_shadow/#eff_m13.wav new file mode 100644 index 0000000..3e1b1c3 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_summon_shadow/#eff_m13.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_summon_shadow/#isc_01c.wav b/iwdification/dw_iwdspells_resource/wizard_summon_shadow/#isc_01c.wav new file mode 100644 index 0000000..c6d87c1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_summon_shadow/#isc_01c.wav differ diff --git a/iwdification/dw_iwdspells_resource/wizard_summon_shadow/gnsummm.baf b/iwdification/dw_iwdspells_resource/wizard_summon_shadow/gnsummm.baf new file mode 100644 index 0000000..6723232 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/wizard_summon_shadow/gnsummm.baf @@ -0,0 +1,14 @@ +IF + See(NearestEnemyOf(Myself)) +THEN + RESPONSE #100 + AttackReevaluate(LastSeenBy(Myself),75) +END + +IF + AttackedBy(NearestEnemyOf(Myself),DEFAULT) +THEN + RESPONSE #100 + MoveToObject(LastAttackerOf(Myself)) +END + diff --git a/iwdification/dw_iwdspells_resource/wizard_summon_shadow/msumm1h.bam b/iwdification/dw_iwdspells_resource/wizard_summon_shadow/msumm1h.bam new file mode 100644 index 0000000..db39f3d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_summon_shadow/msumm1h.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_summon_shadow/msumm1h.vvc b/iwdification/dw_iwdspells_resource/wizard_summon_shadow/msumm1h.vvc new file mode 100644 index 0000000..8aabcd1 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_summon_shadow/msumm1h.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_summon_shadow/msumm1x.bam b/iwdification/dw_iwdspells_resource/wizard_summon_shadow/msumm1x.bam new file mode 100644 index 0000000..c59a41b Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_summon_shadow/msumm1x.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_summon_shadow/msumm1x.vvc b/iwdification/dw_iwdspells_resource/wizard_summon_shadow/msumm1x.vvc new file mode 100644 index 0000000..36682c6 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_summon_shadow/msumm1x.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_summon_shadow/necroh.bam b/iwdification/dw_iwdspells_resource/wizard_summon_shadow/necroh.bam new file mode 100644 index 0000000..1712f6d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_summon_shadow/necroh.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_summon_shadow/necroh.vvc b/iwdification/dw_iwdspells_resource/wizard_summon_shadow/necroh.vvc new file mode 100644 index 0000000..26e9f2a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_summon_shadow/necroh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_summon_shadow/shadow1.itm b/iwdification/dw_iwdspells_resource/wizard_summon_shadow/shadow1.itm new file mode 100644 index 0000000..12232c4 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_summon_shadow/shadow1.itm differ diff --git a/iwdification/dw_iwdspells_resource/wizard_summon_shadow/shadow1.spl b/iwdification/dw_iwdspells_resource/wizard_summon_shadow/shadow1.spl new file mode 100644 index 0000000..4f9d67f Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_summon_shadow/shadow1.spl differ diff --git a/iwdification/dw_iwdspells_resource/wizard_summon_shadow/spwi526.spl b/iwdification/dw_iwdspells_resource/wizard_summon_shadow/spwi526.spl new file mode 100644 index 0000000..1ea620a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_summon_shadow/spwi526.spl differ diff --git a/iwdification/bam/cdia526a.bam b/iwdification/dw_iwdspells_resource/wizard_summon_shadow/spwi526a.bam similarity index 100% rename from iwdification/bam/cdia526a.bam rename to iwdification/dw_iwdspells_resource/wizard_summon_shadow/spwi526a.bam diff --git a/iwdification/bam/cdia526b.bam b/iwdification/dw_iwdspells_resource/wizard_summon_shadow/spwi526b.bam similarity index 100% rename from iwdification/bam/cdia526b.bam rename to iwdification/dw_iwdspells_resource/wizard_summon_shadow/spwi526b.bam diff --git a/iwdification/bam/cdia526c.bam b/iwdification/dw_iwdspells_resource/wizard_summon_shadow/spwi526c.bam similarity index 100% rename from iwdification/bam/cdia526c.bam rename to iwdification/dw_iwdspells_resource/wizard_summon_shadow/spwi526c.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_summon_shadow/sshadow.2da b/iwdification/dw_iwdspells_resource/wizard_summon_shadow/sshadow.2da new file mode 100644 index 0000000..add4e69 --- /dev/null +++ b/iwdification/dw_iwdspells_resource/wizard_summon_shadow/sshadow.2da @@ -0,0 +1,4 @@ +2DA V1.0 +0 + RESREF HitAnimation AreaHitAnimation +1 SUMShad MSumm1H MSumm1X diff --git a/iwdification/dw_iwdspells_resource/wizard_summon_shadow/sumshad.cre b/iwdification/dw_iwdspells_resource/wizard_summon_shadow/sumshad.cre new file mode 100644 index 0000000..430245e Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_summon_shadow/sumshad.cre differ diff --git a/iwdification/dw_iwdspells_resource/wizard_summon_shadow/trans60.itm b/iwdification/dw_iwdspells_resource/wizard_summon_shadow/trans60.itm new file mode 100644 index 0000000..3dd3c45 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_summon_shadow/trans60.itm differ diff --git a/iwdification/dw_iwdspells_resource/wizard_trollish_fortitude/#eff_m07.wav b/iwdification/dw_iwdspells_resource/wizard_trollish_fortitude/#eff_m07.wav new file mode 100644 index 0000000..e4933ef Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_trollish_fortitude/#eff_m07.wav differ diff --git a/iwdification/eff/cditroll.eff b/iwdification/dw_iwdspells_resource/wizard_trollish_fortitude/#trollis.eff similarity index 100% rename from iwdification/eff/cditroll.eff rename to iwdification/dw_iwdspells_resource/wizard_trollish_fortitude/#trollis.eff diff --git a/iwdification/dw_iwdspells_resource/wizard_trollish_fortitude/necroh.bam b/iwdification/dw_iwdspells_resource/wizard_trollish_fortitude/necroh.bam new file mode 100644 index 0000000..1712f6d Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_trollish_fortitude/necroh.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_trollish_fortitude/necroh.vvc b/iwdification/dw_iwdspells_resource/wizard_trollish_fortitude/necroh.vvc new file mode 100644 index 0000000..26e9f2a Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_trollish_fortitude/necroh.vvc differ diff --git a/iwdification/dw_iwdspells_resource/wizard_trollish_fortitude/spwi632.spl b/iwdification/dw_iwdspells_resource/wizard_trollish_fortitude/spwi632.spl new file mode 100644 index 0000000..69abc1e Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_trollish_fortitude/spwi632.spl differ diff --git a/iwdification/bam/cdia632a.bam b/iwdification/dw_iwdspells_resource/wizard_trollish_fortitude/spwi632a.bam similarity index 100% rename from iwdification/bam/cdia632a.bam rename to iwdification/dw_iwdspells_resource/wizard_trollish_fortitude/spwi632a.bam diff --git a/iwdification/bam/cdia632b.bam b/iwdification/dw_iwdspells_resource/wizard_trollish_fortitude/spwi632b.bam similarity index 100% rename from iwdification/bam/cdia632b.bam rename to iwdification/dw_iwdspells_resource/wizard_trollish_fortitude/spwi632b.bam diff --git a/iwdification/bam/cdia632c.bam b/iwdification/dw_iwdspells_resource/wizard_trollish_fortitude/spwi632c.bam similarity index 100% rename from iwdification/bam/cdia632c.bam rename to iwdification/dw_iwdspells_resource/wizard_trollish_fortitude/spwi632c.bam diff --git a/iwdification/wav/cdiem34.ogg b/iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/#eff_m34.wav similarity index 100% rename from iwdification/wav/cdiem34.ogg rename to iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/#eff_m34.wav diff --git a/iwdification/wav/cditra60.ogg b/iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/#tra_60.wav similarity index 100% rename from iwdification/wav/cditra60.ogg rename to iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/#tra_60.wav diff --git a/iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/idpro316.pro b/iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/idpro316.pro new file mode 100644 index 0000000..ef1dda4 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/idpro316.pro differ diff --git a/iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/spwi432.spl b/iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/spwi432.spl new file mode 100644 index 0000000..389d910 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/spwi432.spl differ diff --git a/iwdification/bam/cdia432a.bam b/iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/spwi432a.bam similarity index 100% rename from iwdification/bam/cdia432a.bam rename to iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/spwi432a.bam diff --git a/iwdification/bam/cdia432b.bam b/iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/spwi432b.bam similarity index 100% rename from iwdification/bam/cdia432b.bam rename to iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/spwi432b.bam diff --git a/iwdification/bam/cdia432c.bam b/iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/spwi432c.bam similarity index 100% rename from iwdification/bam/cdia432c.bam rename to iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/spwi432c.bam diff --git a/iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/spwi432y.spl b/iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/spwi432y.spl new file mode 100644 index 0000000..cf0e969 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/spwi432y.spl differ diff --git a/iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/spwi432z.spl b/iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/spwi432z.spl new file mode 100644 index 0000000..7c45fe3 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/spwi432z.spl differ diff --git a/iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/vsphert.bam b/iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/vsphert.bam new file mode 100644 index 0000000..54e2a4c Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/vsphert.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/vspherx.bam b/iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/vspherx.bam new file mode 100644 index 0000000..47d2d08 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/vspherx.bam differ diff --git a/iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/vspherx.pro b/iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/vspherx.pro new file mode 100644 index 0000000..7e3c857 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/vspherx.pro differ diff --git a/iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/vspherx.vvc b/iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/vspherx.vvc new file mode 100644 index 0000000..2bf6f41 Binary files /dev/null and b/iwdification/dw_iwdspells_resource/wizard_vitriolic_sphere/vspherx.vvc differ diff --git a/iwdification/eff/326.eff b/iwdification/eff/326.eff deleted file mode 100644 index 859d9d4..0000000 Binary files a/iwdification/eff/326.eff and /dev/null differ diff --git a/iwdification/eff/cdia528.eff b/iwdification/eff/cdia528.eff deleted file mode 100644 index b6e9327..0000000 Binary files a/iwdification/eff/cdia528.eff and /dev/null differ diff --git a/iwdification/eff/cdid617b.eff b/iwdification/eff/cdid617b.eff deleted file mode 100644 index aa4009d..0000000 Binary files a/iwdification/eff/cdid617b.eff and /dev/null differ diff --git a/iwdification/eff/cdifire6.eff b/iwdification/eff/cdifire6.eff deleted file mode 100644 index 915c769..0000000 Binary files a/iwdification/eff/cdifire6.eff and /dev/null differ diff --git a/iwdification/eff/cdiplse0.eff b/iwdification/eff/cdiplse0.eff new file mode 100644 index 0000000..2af32db Binary files /dev/null and b/iwdification/eff/cdiplse0.eff differ diff --git a/iwdification/eff/cdirwf17.eff b/iwdification/eff/cdirwf17.eff deleted file mode 100644 index 626480d..0000000 Binary files a/iwdification/eff/cdirwf17.eff and /dev/null differ diff --git a/iwdification/evasion/evasion.2da b/iwdification/evasion/evasion.2da new file mode 100644 index 0000000..8c1ae65 --- /dev/null +++ b/iwdification/evasion/evasion.2da @@ -0,0 +1,100 @@ + block op placement clone_op subspell file notes + SPBLUN29 324 first 12 0 SPBLUN29.spl // Chain Lightning via Storm Sta + SPCL239 318 above 146 0 SPCL239.spl // Sun Soulbeam + SPCL722 324 above 12 0 SPCL722.spl // Lightning Bolt (talos) + SPDD03 324 first 12 0 SPDD03.spl // Breath Weapon (dragon discipl + SPDR301 324 above 12 0 SPDR301.spl // Lightning Bolt (avenger) + SPDR601 318 above 12 0 SPDR601.spl // Chain Lightning (avenger) + SPIMIX01 324 first 215 0 SPIMIX01.spl // Flame Strike via Zaaman + SPIN160 324 above 12 0 SPIN160.spl // Breathe Fireball (shapechange + SPIN935 324 first 177 0 SPIN935.spl // Glass Dust + SPIN973 324 first 12 0 SPIN973.spl // Air elemental whirlwind + SPPR105 324 first 154 0 SPPR105.spl // Entangle + SPPR302 324 first 12 0 SPPR302.spl // Call Lightning + SPPR304 324 first 12 0 SPPR304.spl // Glyph of Warding + SPPR313 324 first 177 0 SPPR313.spl // Holy Smite + SPPR314 324 first 177 0 SPPR314.spl // Unholy Blight + SPPR450 324 first 12 0 SPPR450.spl // Spirit Fire + SPPR503 324 first 215 0 SPPR503.spl // Flame Strike + SPPR517 324 first 60 0 SPPR517.spl // Insect Plague + SPPR603D 318 first 12 0 SPPR603D.spl // blade barrier subspell + SPPR698D 324 first 12 0 SPPR698D.spl // Blade Barrier + SPPR705 324 first 12 0 SPPR705.spl // Fire Storm + SPPR751 324 above 12 0 SPPR751.spl // Ethereal Retribution + SPPR984 324 above 12 0 SPPR984.spl // Flame Strike + SPPR985 324 first 215 0 SPPR985.spl // Flame Strike + SPWI001 324 first 12 0 SPWI001.spl // Fireball + SPWI002 324 first 12 0 SPWI002.spl // Lightning Bolt + SPWI017 324 first 12 0 SPWI017.spl // Minor Lightning Bolt + SPWI025 324 first 12 0 SPWI025.spl // Minor Lightning Bolt + SPWI026 324 first 12 0 SPWI026.spl // Minor Lightning Bolt + SPWI027 324 first 12 0 SPWI027.spl // Minor Lightning Bolt + SPWI103 324 first 12 0 SPWI103.spl // Burning Hands + SPWI105 324 first 39 0 SPWI105.spl // Color Spray + SPWI217 324 first 12 0 SPWI217.spl // Agannazar's Scorcher + SPWI304 324 first 12 0 SPWI304.spl // Fireball + SPWI308 324 first 12 0 SPWI308.spl // Lightning Bolt + SPWI313 318 first 12 0 SPWI313.spl // Skull Trap + SPWI404 324 first 12 0 SPWI404.spl // Ice Storm + SPWI503 324 first 12 0 SPWI503.spl // Cone of Cold + spwi523d 324 first 12 0 spwi523d.spl // sunfire subspell + SPWI615 318 above 12 0 SPWI615.spl // Chain Lightning + spwi615b 318 above 12 0 spwi615b.spl // No such index + SPWI712 324 first 12 0 SPWI712.spl // Delayed Blast Fireball + SPWI714 324 first 12 0 SPWI714.spl // Prismatic Spray + SPWI812 324 first 12 0 SPWI812.spl // Abi-Dalzim's Horrid Wilting + SPWI911 324 first 12 0 SPWI911.spl // Meteor Swarm + SPWI922 324 first 12 0 SPWI922.spl // Dragon's Breath + SPWI925 324 first 12 0 SPWI925.spl // Comet + SPWISH24 324 first 12 0 SPWISH24.spl // Meteor Swarm + SPWISH27 324 first 12 0 SPWISH27.spl // Knockback + SPWISH32 324 first 12 0 SPWISH32.spl // Abi-Dalzim's Horrid Wilting + SPWM111 324 first 154 0 SPWM111.spl // Entangle + SPYANC01 324 first 12 0 SPYANC01.spl // Whirlwind via chan + SPYANCD 324 first 12 0 SPYANCD.spl // globe of blades via chan + + AMUL01 324 first 12 0 AMUL01.ITM // Necklace of Missiles + POTN13 324 first 12 0 POTN13.ITM // Oil of Fiery Burning + POTN26 324 first 12 0 POTN26.ITM // Potion of Explosions + POTN27 324 first 12 0 POTN27.ITM // Potion of Firebreath + WAND05 324 first 12 0 WAND05.ITM // Wand of Fire + WAND07 324 first 12 0 WAND07.ITM // Wand of Lightning + WAND11 324 first 12 0 WAND11.ITM // Wand of the Heavens + + BOLT07 324 first 45 0 BOLT07.ITM // Flasher Master Bruiser Mate + CDSTAF12 324 first 12 0 CDSTAF12.SPL // Lightning Bolt + FIRESEED 324 above 12 0 FIRESEED.ITM // Fire Seed + FRAG01 324 first 12 0 FRAG01.ITM // Frag Grenade + FRAGSAP 324 first 12 0 FRAGSAP.ITM // Fragmentation Skull + GLOBBLU1 318 first 12 0 GLOBBLU1.ITM // Blue Globe (cone of cold) + GLOBRED1 318 first 12 0 GLOBRED1.ITM // Red Globe (fireball) + JWSIEGE 318 first 12 0 JWSIEGE.SPL // comet explosions in saradush + MELIS02B 324 first 12 0 MELIS02B.SPL // Blade Barrier + OHBDRAG1 324 first 12 0 OHBDRAG1.SPL // Topaz Dragon Breath + OHBSHLD1 324 first 12 0 OHBSHLD1.ITM // Kazrah's Shield +4 + OHBWI304 324 first 12 0 OHBWI304.SPL // Fireball + OHBWI308 324 first 12 0 OHBWI308.SPL // Lightning Bolt + SECRET03 324 first 12 0 SECRET03.ITM // Frag Grenade + SPCL911B 318 first 12 0 SPCL911B.SPL // exploding trap + SPCRYO01 324 first 12 0 SPCRYO01.SPL // Cone of Cold + SPIN560 324 first 12 0 SPIN560.SPL // Cinder Shower + SPIN595 324 first 12 0 SPIN595.SPL // Yellow Dragon Scorching Sand + SPIN596 324 first 12 0 SPIN596.SPL // Brown Dragon Acid Breath + SPIN597 324 first 12 0 SPIN597.SPL // Blue Dragon Lightning Breath + SPIN688 324 first 154 0 SPIN688.SPL // Plant Growth + SPIN693 318 first 12 0 SPIN693.SPL // + SPIN701 324 first 12 0 SPIN701.SPL // Fireball + SPIN714 324 first 12 0 SPIN714.SPL // Lightning Bolt + SPIN832 324 first 45 0 SPIN832.SPL // Silver Dragon Paralyzation + SPIN833 324 first 12 0 SPIN833.SPL // Silver Dragon Cone of Cold + SPIN885 324 first 12 0 SPIN885.SPL // Kamikaze Explosion + SPIN893 324 first 74 0 SPIN893.SPL // Shadow Dragon Breath + SPIN926 324 first 12 0 SPIN926.SPL // Water Jet + SPIN937 324 first 39 0 SPIN937.SPL // Color Spray + SPIN938 324 first 12 0 SPIN938.SPL // Flame Fan + SPIN942 324 first 12 0 SPIN942.SPL // Breathes Grit + SPIN956 318 first 12 0 SPIN956.SPL // Hell Hound Flame Breath + SPPR725D 324 first 12 0 SPPR725D.SPL // Globe of Blades + SPWI957 324 first 12 0 SPWI957.SPL // Fireball + SPWI997 324 first 12 0 SPWI997.SPL // Lightning Bolt + WAND06 324 first 12 0 WAND06.ITM // Wand of Frost \ No newline at end of file diff --git a/iwdification/evasion/evasion.tpa b/iwdification/evasion/evasion.tpa new file mode 100644 index 0000000..3794589 --- /dev/null +++ b/iwdification/evasion/evasion.tpa @@ -0,0 +1,43 @@ + +DEFINE_ACTION_FUNCTION cd_add_evasion + STR_VAR 2da_file = null +BEGIN + + COPY ~%2da_file%~ ~%2da_file%~ + COUNT_2DA_ROWS 6 rows + FOR (row = 1 ; row < rows ; ++row) BEGIN + READ_2DA_ENTRY row 0 6 block + READ_2DA_ENTRY row 1 6 new_op + READ_2DA_ENTRY row 2 6 placement + READ_2DA_ENTRY row 3 6 clone_op + READ_2DA_ENTRY row 4 6 subspell + READ_2DA_ENTRY row 5 6 file + INNER_ACTION BEGIN + + ACTION_IF IS_AN_INT block BEGIN + OUTER_SET num = IDS_OF_SYMBOL (~spell~ ~%file%~) + ACTION_IF num > 3999 BEGIN OUTER_SET num -= 4000 OUTER_SPRINT prefix spcl END + ACTION_IF num > 2999 BEGIN OUTER_SET num -= 3000 OUTER_SPRINT prefix spin END + ACTION_IF num > 1999 BEGIN OUTER_SET num -= 2000 OUTER_SPRINT prefix spwi END + ACTION_IF num > 999 BEGIN OUTER_SET num -= 1000 OUTER_SPRINT prefix sppr END + ACTION_IF num > 0 BEGIN + ACTION_IF IS_AN_INT subspell BEGIN OUTER_SPRINT subspell ~~ END + OUTER_SPRINT file ~%prefix%%num%%subspell%.spl~ + OUTER_SPRINT block ~%prefix%%num%%subspell%~ + END + END + + ACTION_IF !IS_AN_INT block BEGIN // is an IDS reference and not found, block will still be 0 + + COPY_EXISTING ~%file%~ ~override~ // clone so as to inherit target and power + LPF CLONE_EFFECT INT_VAR multi_match = 1 match_opcode = clone_op opcode = new_op parameter1 = 0 parameter2 = 63 timing = 0 duration = 0 probability1 = 100 + probability2 = 0 dicenum = 0 dicesize = 0 savingthrow = 0 special = 0 silent = 1 STR_VAR resource = EVAL ~%block%~ insert = EVAL ~%placement%~ END + BUT_ONLY IF_EXISTS + + END + + END // inner_action + END // for loop + BUT_ONLY + +END \ No newline at end of file diff --git a/iwdification/evasion/evasion_arcane.2da b/iwdification/evasion/evasion_arcane.2da new file mode 100644 index 0000000..8a83127 --- /dev/null +++ b/iwdification/evasion/evasion_arcane.2da @@ -0,0 +1,10 @@ + block op placement clone_op subspell file notes + 0 324 first 326 0 WIZARD_SNILLOCS_SNOWBALL_SWARM // Snilloc's Snowball Swarm + 0 324 first 12 0 WIZARD_ICELANCE // Icelance + 0 324 first 12 0 WIZARD_LANCE_OF_DISRUPTION // Lance of Disruption + 0 324 first 12 0 WIZARD_SHOUT // Shout + 0 318 first 12 y WIZARD_VITRIOLIC_SPHERE // vitriolic sphere splash dama + 0 318 first 12 b WIZARD_SHROUD_OF_FLAME // shroud of flame subspell + 0 324 above 12 0 WIZARD_MALAVONS_RAGE // Malavon's Rage + 0 324 first 12 0 WIZARD_ACID_STORM // Acid Storm + 0 324 first 13 0 WIZARD_GREAT_SHOUT // Great Shout diff --git a/iwdification/evasion/evasion_divine.2da b/iwdification/evasion/evasion_divine.2da new file mode 100644 index 0000000..0d866c1 --- /dev/null +++ b/iwdification/evasion/evasion_divine.2da @@ -0,0 +1,12 @@ + block op placement clone_op subspell file notes + 0 318 first 12 d CLERIC_CIRCLE_OF_BONES // circle of bones subspell + 0 324 first 12 0 CLERIC_SPIKE_GROWTH // Spike Growth + 0 324 first 12 0 CLERIC_CLOUDBURST // Cloudburst + 0 324 first 12 0 CLERIC_PRODUCE_FIRE // Produce Fire + 0 324 first 12 b CLERIC_STATIC_CHARGE // static charge subspell + 0 324 first 12 0 CLERIC_SMASHING_WAVE // Smashing Wave + 0 324 above 12 0 CLERIC_THORN_SPRAY // Thorn Spray + 0 324 first 12 0 CLERIC_SPIKE_STONES // Spike Stones + 0 324 first 12 0 CLERIC_MASS_CAUSE_LIGHT_WOUNDS // Mass Cause Light Wounds + 0 324 first 12 0 CLERIC_WHIRLWIND // Whirlwind + 0 324 first 12 0 CLERIC_SPIRITUAL_WRATH // Spiritual Wrath \ No newline at end of file diff --git a/iwdification/general_spell_notes.txt b/iwdification/general_spell_notes.txt new file mode 100644 index 0000000..8133a77 --- /dev/null +++ b/iwdification/general_spell_notes.txt @@ -0,0 +1,124 @@ +First step, read David's notes from the converter, specifically the 'Modifications +made to the spell system' section: + +https://raw.githubusercontent.com/Gibberlings3/IWDSpells/master/dw_iwdspells/readme.txt + +Everything else here are notes from Cam. For the most part it's a running list of changes +made for oBG2 compatibility (mainly so I can update the readme easier) but in a few cases +I've made changes that contradict or enhance changes from the converter. + +One quick note: this is not, by any means, final. I'm open to discussion on any of this. + +Alignment-restricted spells: The converter correctly identifies (and corrects) that the +various inverse divine necromantics spells (Cause Disease, Cause X Wounds, etc.) are +alignment-restricted in IWD but not in BG/2 and removes these restrictions upon import. +However, it does this with a slightly too-broad brush, and the following spells are +re-restricted: + + * (Greater) Shield of Lathander: unavailable to evil characters. Greater Shield is also + restricted from neutrals in IWDEE, but given that Lathander clerics can be LN I've + only made this non-evil. + * Cloud of Pestilence: only available to evil characters + * Mass Cause Light Wounds: Made cleric-only, as druids can't cast any of the Cause X + Wounds series. This is a change from IWDEE. + +Old IWD resources: The imported spells had a few leftover calls (mainly 318/206) against +IWD spells not present in BG/2, and these are purged. I've also re-instituted the +cross-patches, where e.g. divine spells are checked against arcane spells and these +protections re-added as appropriate. + +Scroll usability fixes: Arcane spell scrolls were still using the IWD school system, so +kit usabilities were generally wrong. The divine scrolls were not reflecting the underlying +spell restrictions (e.g. druid vs. cleric). In both cases, I iterate through the scrolls +and dynamically apply the underlying spell's restrictions to the scroll. + +Summons: I just run everything through a check and make sure the inventory is undroppable +and that they use the correct summon AI script. In oBG2, the mod will check if expanded +animations are available through Infinity Animations are use the IWD versions as +appropriate, but otherwise will use existing oBG2 animations. oBG2 also doesn't allow +the cool animations defined by the tables so these spells just play some generic +summoning animations. + +The Song of Kaudies: The 50% protection from 'any other sound-based attacks' is open to +a lot of interpretation. In addition to its existing protections against silence, (Great) +Shout, (Greater) Command, and Wail of the Banshee, we've extended protections for War +Cry, Demilich Howl, and Moon Dog Howl. In previous versions this song also protected +against Power Words, but after some discussion these protections have been dropped. + +The rest of these notes apply only to oBG2. + +General opcode changes: + * Visual opcodes 7, 8, and 9 are fine unless they use 255 (everything) as param2. + These are converted to a series targeting param2 values of 0-6 (various body parts). + * Op 12 (damage) is problematic if it's flagged as 'split for half', an EE-exclusive + flag. These are systematically split into two op 12s. Similarly, HP drains are + also converted to plain damage + HP gains. + * Op 61 gets converted to a series of op 50s. I'm looking into whether this is the + best soilution. + * Op 126/176: Movement speed increase does not have a mode 5 in oBG2 (multiply %) + so these are shifted to mode 2 (set % of). + * Op 318/324: For the most part these are converted to 177 opcodes, using EFFs + targeting the underlying group. In some cases they cannot be converted. + * Op 321: Unfortunately, oBG2 lacks this awesome opcode, and generally one of + three solutions were used: using op 206 with a duration equal to the spell + to prevent stacking; deletion; or knocking certain effects into a subspell + and preventing that from stacking. + * Op 325 (all save bonus) is converted to five save bonus opcodes (33-37). + * Op 333 is transformed into a series of time-delayed cast opcodes (146). + +Spells that won't work on oBG2: (Great) Shout, Soul Eater, Seven Eyes, Mold Touch, Favor +of Ilmater, Smashing Wave, Wall of Moonlight, and Spiritual Wrath are unavailable in oBG2. +Cat's Grace works on oBG2 with TobEx installed, and Giant Insect will be installed if +the beetle animation from Infinity Animations is installed. Mordenkainen's Force Missiles +are currently skipped, though I've been told someone else has amde it work so I'm currently +looking into it. + +Spells with 'cloud' animations: oBG2 is a lot more restricted on projectiles, so these +spells simulate a cloud-based effect: Suffocate, Spike Growth, Cloudburst, Cloud of +Pestilence, Spike Stones, Mist of Eldath. While the AoE is correct, the way these are +simulated (an invisible creature spawning further invisible creatures to play VVCs) +means that the visuals are likely underselling the AoE. + +Portrait Icons: Unlike the EEs, there's no way to easily extend states.bam to support +additional portrait icons. For spells these are either purged or substitued. I do have +an expanded states.bam from a pull request that I will likely make available on oBG2 +as a separate component, as it will overwrite anyone else's changes to states.bam. + +Shroud of Flame is basically rebuilt from the ground up. It's simualted well except +for the spread from creature to creature. I've been unable to get this to work reliably +so for now it does everything except that. + +Iron Body: Since 'paws' are always dispelled in oBG2, I've moved all of the effects from +the spell to the paw. This is to avoid the awkward situation where the iron fist has +been dispelled but the other spell effects remain active. + +Mordenkainen's Force Blade: Like Iron Body above, the spell effects are moved to the +sword. Unfortunately since this spell varies based on level, a series of Force Blades +are created. + +Static Charge: In oIWD and EEs, this is a spell applied to the caster that zaps a +nearby target once per turn. In oBG2 this spell is reduced to something you cast +on another creature that will simply zap them until they die or the spell ends. + +Blood Rage: There's no way to mask hit points in oBG2, and the only-ally casting +is also problematic. Instead the spell is restricted to green-circled creatures +by using EFFs targeting EA values. I could not get this to work with an ally-only +projectile. + +Thorn Spray: Basically uses a Cone of Cold-style projectile on oBG2. + +Righteous Wrath of the Faithful: Works, but uses a ton of EFFs and subspells. + +Undead Ward: This spell summons an invisble cleric to turn undead, so its AoE +is effectively visual range instead of the listed 10-ft. radius. + +Whirlwind: Another projectile issue, this spell basically creates an invisible +creature with the Whirlwind animation and then moves him about randomly. Any +creature that gets too close gets hit with a subspell like Globe of Blades. + + + + + + + diff --git a/iwdification/icons/icons.2da b/iwdification/icons/icons.2da new file mode 100644 index 0000000..8bc3913 --- /dev/null +++ b/iwdification/icons/icons.2da @@ -0,0 +1,26 @@ +icon tra new_icon existing clone resource spell +iron_body 350 94 0 87 ibody.itm 0 +mind_blank 344 131 0 101 0 WIZARD_MIND_BLANK +cats_grace 357 166 0 15 0 WIZARD_CATS_GRACE +emotion_hope 358 167 22 142 0 WIZARD_EMOTION_HOPE +emotion_courage 359 168 0 54 0 WIZARD_EMOTION_COURAGE +shroud_of_flame 46 169 0 999 0 WIZARD_SHROUD_OF_FLAME +beltyn 25 170 4 142 #beltyn.spl 0 +antimagic_shell 161 171 83 142 0 WIZARD_ANTIMAGIC_SHELL +pain 347 172 0 54 0 CLERIC_SYMBOL_PAIN +isom 348 173 0 101 0 CLERIC_IMPERVIOUS_SANCTITY_OF_MIND +exaltation 352 174 0 101 0 CLERIC_EXALTATION +static_charge 242 175 0 999 0 CLERIC_STATIC_CHARGE +entropy_shield 278 176 56 142 0 CLERIC_ENTROPY_SHIELD +shield_lathander 270 177 0 101 0 CLERIC_SHIELD_OF_LATHANDER +blood_rage 354 178 4 142 0 CLERIC_BLOOD_RAGE +animal_rage 351 179 83 142 0 CLERIC_ANIMAL_RAGE +recitation 353 180 18 142 #reciteg.spl 0 +prayer 355 181 18 142 #prayerg.spl 0 +rwotf 356 182 0 54 0 CLERIC_RIGHTEOUS_WRATH_OF_THE_FAITHFUL +bard_heroes 323 183 40 142 0 BARD_SONG_BALLAD +bard_curran 326 184 40 142 0 BARD_SONG_CURRAN +bard_tymora 329 185 40 142 0 BARD_SONG_TYMORA +bard_kaudies 332 186 40 142 0 BARD_SONG_KAUDIES +bard_siren 335 187 40 142 0 BARD_SONG_SIREN +bard_sith 339 188 40 142 0 BARD_SONG_SITH diff --git a/iwdification/icons/statdesc.2da b/iwdification/icons/statdesc.2da new file mode 100644 index 0000000..1f96f8f --- /dev/null +++ b/iwdification/icons/statdesc.2da @@ -0,0 +1,192 @@ +2DA V1.0 +-1 + DESCRIPTION +0 17391 +1 17392 +2 17393 +3 17394 +4 17395 +5 17396 +6 17397 +7 54337 +8 17399 +9 17400 +10 17401 +11 17402 +12 17403 +13 17404 +14 17405 +15 17406 +16 17407 +17 17408 +18 17409 +19 17410 +20 17411 +21 17412 +22 17413 +23 17414 +24 17415 +25 17416 +26 17417 +27 17418 +28 17419 +29 17420 +30 17421 +31 17422 +32 17423 +33 17424 +34 17425 +35 17426 +36 17427 +37 10953 +38 10954 +39 11330 +40 11798 +41 11799 +42 11800 +43 23739 +44 23740 +45 23741 +46 23742 +47 23743 +48 23744 +49 23745 +50 23746 +51 23747 +52 23748 +53 23779 +54 23780 +55 14043 +56 14091 +57 32877 +58 32878 +59 8266 +60 8267 +61 8268 +62 8270 +63 8271 +64 8272 +65 8273 +66 8275 +67 8276 +68 8277 +69 8279 +70 8280 +71 8282 +72 8284 +73 26228 +74 8291 +75 8292 +76 8293 +77 8296 +78 18141 +79 8299 +80 8300 +81 8303 +82 8306 +83 8307 +84 8308 +85 8309 +86 8311 +87 8313 +88 8315 +89 8316 +90 8318 +91 8320 +92 8322 +93 8324 +94 iron_body +95 8326 +96 8329 +97 779 +98 829 +99 5789 +100 3351 +101 34569 +102 34570 +103 12079 +104 34571 +105 54303 +106 14790 +107 54307 +108 54309 +109 50699 +110 54312 +111 54315 +112 54318 +113 7924 +114 14060 +115 12046 +116 11014 +117 26304 +118 7619 +119 7617 +120 38133 +121 23791 +122 12029 +123 8286 +124 54332 +125 22177 +126 17398 +127 12129 +128 38594 +129 54331 +130 20438 +131 mind_blank +132 38577 +133 2365 +134 22903 +135 12108 +136 12125 +137 54335 +138 42870 +139 34800 +140 34768 +141 54336 +142 42865 +143 42857 +144 47835 +145 12030 +146 65598 +147 63953 +148 63941 +149 63902 +150 63904 +151 70297 +152 65434 +153 63938 +154 63922 +155 64001 +156 65438 +157 63992 +158 63993 +159 63217 +160 63842 +161 63801 +162 64324 +163 64319 +164 63873 +165 63882 +166 cats_grace +167 emotion_hope +168 emotion_courage +169 shroud_of_flame +170 beltyn +171 antimagic_shell +172 pain +173 isom +174 exaltation +175 static_charge +176 entropy_shield +177 shield_lathander +178 blood_rage +179 animal_rage +180 recitation +181 prayer +182 rwotf +183 bard_heroes +184 bard_curran +185 bard_tymora +186 bard_kaudies +187 bard_siren +188 bard_sith diff --git a/iwdification/icons/states.bam b/iwdification/icons/states.bam new file mode 100644 index 0000000..1dce6de Binary files /dev/null and b/iwdification/icons/states.bam differ diff --git a/iwdification/itm/blank.itm b/iwdification/itm/blank.itm deleted file mode 100644 index 6c80dee..0000000 Binary files a/iwdification/itm/blank.itm and /dev/null differ diff --git a/iwdification/itm/blankpr.itm b/iwdification/itm/blankpr.itm deleted file mode 100644 index ae6d942..0000000 Binary files a/iwdification/itm/blankpr.itm and /dev/null differ diff --git a/iwdification/itm/cdia480.itm b/iwdification/itm/cdia480.itm new file mode 100644 index 0000000..1601559 Binary files /dev/null and b/iwdification/itm/cdia480.itm differ diff --git a/iwdification/itm/cdia481.itm b/iwdification/itm/cdia481.itm new file mode 100644 index 0000000..e3e58a1 Binary files /dev/null and b/iwdification/itm/cdia481.itm differ diff --git a/iwdification/itm/cdia482.itm b/iwdification/itm/cdia482.itm new file mode 100644 index 0000000..3a4b40d Binary files /dev/null and b/iwdification/itm/cdia482.itm differ diff --git a/iwdification/itm/cdiaelem.itm b/iwdification/itm/cdiaelem.itm deleted file mode 100644 index 991d5c2..0000000 Binary files a/iwdification/itm/cdiaelem.itm and /dev/null differ diff --git a/iwdification/itm/cdibclaw.itm b/iwdification/itm/cdibclaw.itm deleted file mode 100644 index c0b6525..0000000 Binary files a/iwdification/itm/cdibclaw.itm and /dev/null differ diff --git a/iwdification/itm/cdidbone.itm b/iwdification/itm/cdidbone.itm deleted file mode 100644 index cedad04..0000000 Binary files a/iwdification/itm/cdidbone.itm and /dev/null differ diff --git a/iwdification/itm/cdideca.itm b/iwdification/itm/cdideca.itm deleted file mode 100644 index 45380b7..0000000 Binary files a/iwdification/itm/cdideca.itm and /dev/null differ diff --git a/iwdification/itm/cdidrbr.itm b/iwdification/itm/cdidrbr.itm new file mode 100644 index 0000000..89973d7 Binary files /dev/null and b/iwdification/itm/cdidrbr.itm differ diff --git a/iwdification/itm/cdidree.itm b/iwdification/itm/cdidree.itm new file mode 100644 index 0000000..3bdaa3b Binary files /dev/null and b/iwdification/itm/cdidree.itm differ diff --git a/iwdification/itm/cdidrfe.itm b/iwdification/itm/cdidrfe.itm new file mode 100644 index 0000000..70f007a Binary files /dev/null and b/iwdification/itm/cdidrfe.itm differ diff --git a/iwdification/itm/cdidrwe.itm b/iwdification/itm/cdidrwe.itm new file mode 100644 index 0000000..62516b5 Binary files /dev/null and b/iwdification/itm/cdidrwe.itm differ diff --git a/iwdification/itm/cdieelem.itm b/iwdification/itm/cdieelem.itm deleted file mode 100644 index 65591bc..0000000 Binary files a/iwdification/itm/cdieelem.itm and /dev/null differ diff --git a/iwdification/itm/cdifel18.itm b/iwdification/itm/cdifel18.itm deleted file mode 100644 index 5ebf19f..0000000 Binary files a/iwdification/itm/cdifel18.itm and /dev/null differ diff --git a/iwdification/itm/cdifring.itm b/iwdification/itm/cdifring.itm deleted file mode 100644 index 2cdca49..0000000 Binary files a/iwdification/itm/cdifring.itm and /dev/null differ diff --git a/iwdification/itm/cdiibody.itm b/iwdification/itm/cdiibody.itm deleted file mode 100644 index c7c2ca9..0000000 Binary files a/iwdification/itm/cdiibody.itm and /dev/null differ diff --git a/iwdification/itm/cdiltou.itm b/iwdification/itm/cdiltou.itm deleted file mode 100644 index 5889f1e..0000000 Binary files a/iwdification/itm/cdiltou.itm and /dev/null differ diff --git a/iwdification/itm/cdim1d7s.itm b/iwdification/itm/cdim1d7s.itm deleted file mode 100644 index b814fe5..0000000 Binary files a/iwdification/itm/cdim1d7s.itm and /dev/null differ diff --git a/iwdification/itm/cdimoonb.itm b/iwdification/itm/cdimoonb.itm deleted file mode 100644 index 74db8a0..0000000 Binary files a/iwdification/itm/cdimoonb.itm and /dev/null differ diff --git a/iwdification/itm/cdiplybb.itm b/iwdification/itm/cdiplybb.itm deleted file mode 100644 index b583f1a..0000000 Binary files a/iwdification/itm/cdiplybb.itm and /dev/null differ diff --git a/iwdification/itm/cdiplypb.itm b/iwdification/itm/cdiplypb.itm deleted file mode 100644 index e602ff4..0000000 Binary files a/iwdification/itm/cdiplypb.itm and /dev/null differ diff --git a/iwdification/itm/cdiplyww.itm b/iwdification/itm/cdiplyww.itm deleted file mode 100644 index d13d94f..0000000 Binary files a/iwdification/itm/cdiplyww.itm and /dev/null differ diff --git a/iwdification/itm/cdir1hp2.itm b/iwdification/itm/cdir1hp2.itm deleted file mode 100644 index 27f71e9..0000000 Binary files a/iwdification/itm/cdir1hp2.itm and /dev/null differ diff --git a/iwdification/itm/cdis5-20.itm b/iwdification/itm/cdis5-20.itm deleted file mode 100644 index 77c78a2..0000000 Binary files a/iwdification/itm/cdis5-20.itm and /dev/null differ diff --git a/iwdification/itm/cdisalfi.itm b/iwdification/itm/cdisalfi.itm deleted file mode 100644 index 0d02618..0000000 Binary files a/iwdification/itm/cdisalfi.itm and /dev/null differ diff --git a/iwdification/itm/cdisalfr.itm b/iwdification/itm/cdisalfr.itm deleted file mode 100644 index 78e4e4d..0000000 Binary files a/iwdification/itm/cdisalfr.itm and /dev/null differ diff --git a/iwdification/itm/cdishdw1.itm b/iwdification/itm/cdishdw1.itm deleted file mode 100644 index 463589b..0000000 Binary files a/iwdification/itm/cdishdw1.itm and /dev/null differ diff --git a/iwdification/itm/cdishmbl.itm b/iwdification/itm/cdishmbl.itm deleted file mode 100644 index ffe6495..0000000 Binary files a/iwdification/itm/cdishmbl.itm and /dev/null differ diff --git a/iwdification/itm/cdismcud.itm b/iwdification/itm/cdismcud.itm deleted file mode 100644 index 45e44ae..0000000 Binary files a/iwdification/itm/cdismcud.itm and /dev/null differ diff --git a/iwdification/itm/cditrn20.itm b/iwdification/itm/cditrn20.itm deleted file mode 100644 index fd6f0c4..0000000 Binary files a/iwdification/itm/cditrn20.itm and /dev/null differ diff --git a/iwdification/itm/cditrn4.itm b/iwdification/itm/cditrn4.itm deleted file mode 100644 index 2212fba..0000000 Binary files a/iwdification/itm/cditrn4.itm and /dev/null differ diff --git a/iwdification/itm/cditrn40.itm b/iwdification/itm/cditrn40.itm deleted file mode 100644 index 442809f..0000000 Binary files a/iwdification/itm/cditrn40.itm and /dev/null differ diff --git a/iwdification/itm/cditrn60.itm b/iwdification/itm/cditrn60.itm deleted file mode 100644 index b8eb180..0000000 Binary files a/iwdification/itm/cditrn60.itm and /dev/null differ diff --git a/iwdification/itm/cdiumbhk.itm b/iwdification/itm/cdiumbhk.itm deleted file mode 100644 index 074d10f..0000000 Binary files a/iwdification/itm/cdiumbhk.itm and /dev/null differ diff --git a/iwdification/itm/cdiwelem.itm b/iwdification/itm/cdiwelem.itm deleted file mode 100644 index 4dd2e53..0000000 Binary files a/iwdification/itm/cdiwelem.itm and /dev/null differ diff --git a/iwdification/iwdification.ini b/iwdification/iwdification.ini new file mode 100644 index 0000000..90d9cf6 --- /dev/null +++ b/iwdification/iwdification.ini @@ -0,0 +1,39 @@ +# Never copy this from other mod, always use https://github.com/ALIENQuake/ProjectInfinity/wiki/Adding-metadata-for-mod +# Filename must be the same as tp2 basename, placed at the same folder where +# .tp2 file is located, use UTF8 (without BOM) encoding, everything is optional + +# ini section header is required to avoid false detection +[Metadata] + +# Full name of the mod, without the version number, without the list of supported games +Name = IWDification + +# Author name or nick, don't use an email address +Author = CamDawg and DavidW + +# Short description of the mod, main goals, features etc +Description = "IWDification is a mod to bring some of the elements of Icewind Dale into the Baldur's Gate series of games. A lot of this project is based upon the work of the IWD-in-BG2 conversion project, which later formed the backbone of IWDEE. " + +# Web address of mod readme file (filename is case-sensitive!) You can link to txt, md, html, pdf etc. +Readme = https://gibberlings3.github.io/Documentation/readmes/readme-iwdification.html + +# Web address of mod dedicated forum or forum thread +Forum = https://www.gibberlings3.net/forums/forum/185-iwdification/ + +# Web address of mod personal Homepage, no need to duplicate with a mod dedicated forum + Homepage = https://www.gibberlings3.net/mods/spells/iwdification/ + +# if you use GitHub.com, simply use https://github.com/AccountOrOrgName/RepositoryName +# read more about Delta Updates https://github.com/ALIENQuake/ProjectInfinity/wiki/Delta-Updates-for-mods-hosted-at-Github +Download = https://github.com/Gibberlings3/iwdification + +# Type of LABELs used by the mod, read more here https://www.gibberlings3.net/forums/topic/32516-tutorial-what-is-label +LabelType = GloballyUnique + +# Dynamic Install Order, use mod ID as tp2 name without file extension and `setup-` prefix + +# This mod must be installed *before* the mods listed after the keyword +# Before = EET_end + +# This mod must be installed *after* the mods listed after the keyword +# After = EET \ No newline at end of file diff --git a/iwdification/languages/en_us/game_strings.tra b/iwdification/languages/en_us/game_strings.tra new file mode 100644 index 0000000..975c754 --- /dev/null +++ b/iwdification/languages/en_us/game_strings.tra @@ -0,0 +1,324 @@ +// strings in this file will be overridden by strings in game_strings_ee for EE games. +// this file is ANSI, and will be converted to UTF-8 for EE games. + + @6001 = ~Two Handed Axe~ + @6002 = ~This mighty weapon consists of a haft several feet long, topped with a heavy blade. The axe may be double-bitted, with blades on both sides of the haft, or it may only have a single blade. It is an unwieldy weapon, but a skilled warrior can strike blows of tremendous strength with it. + +STATISTICS: + +Damage: 1D10 +Damage type: Slashing +Weight: 10 +Speed Factor: 9 +Proficiency Type: Axe +Type: 2-handed +Requires: 10 Strength +Not Usable By: + Druid + Cleric + Mage + Thief~ + @6003 = ~Two Handed Axe +1~ + @6004 = ~This mighty weapon consists of a haft several feet long, topped with a heavy blade. The axe may be double-bitted, with blades on both sides of the haft, or it may only have a single blade. This axe has also been bestowed with a small number of magical properties, however, thus making it more effective in combat. Its keen blade, for instance, will shear through your opponent's flesh to find the bone while its barbed tip will seek out gaps in their armor. + +STATISTICS: + +THAC0: +1 bonus +Damage: 1D10+1 +Damage type: Slashing +Weight: 9 +Speed Factor: 8 +Proficiency Type: Axe +Type: 2-handed +Requires: 10 Strength +Not Usable By: + Druid + Cleric + Mage + Thief~ + @6005 = ~Two Handed Axe +2: Tremain's Tumbler~ + @6006 = ~Tremain Longaxe was an adventurer in the Ten Towns with a penchant for axes. While two-handed axes are generally slow and unwieldy, Tremain had this axe specially designed to trip opponents, allowing him to overcome foes with faster and lighter weapons. + +STATISTICS: +Combat Abilities: 10% chance with every hit to knock down opponent for one round + +THAC0: +2 bonus +Damage: 1D10+2 +Damage type: Slashing +Weight: 8 +Speed Factor: 7 +Proficiency Type: Axe +Type: 2-handed +Requires: 10 Strength +Not Usable By: + Druid + Cleric + Mage + Thief~ + @6007 = ~Two Handed Axe +3~ + @6008 = ~This mighty weapon consists of a haft several feet long, topped with a heavy blade. The axe may be double-bitted, with blades on both sides of the haft, or it may only have a single blade. This axe has been imbued with several enchantments, however, thus making it more effective in combat. + +STATISTICS: + +THAC0: +3 bonus +Damage: 1D10+3 +Damage type: Slashing +Weight: 7 +Speed Factor: 6 +Proficiency Type: Axe +Type: 2-handed +Requires: 10 Strength +Not Usable By: + Druid + Cleric + Mage + Thief~ + @6009 = ~Two Handed Axe +4: The Battle Standard~ + @6010 = ~Murzul Dul was a warchief under King Greneire who earned his fame as a skilled tactician. This immense axe doubled as his battle standard in combat and could strike down foes and rally his horde in equal measure. Like King Greniere himself and most of his horde, Dul was killed during the siege of the Citadel of Many Arrows when Emerus Warcrown swept away the battling hordes and the axe claimed as war spoils. The axe retains its ability to rally allies and shake foes by spiking the haft of the weapon into the ground. + +STATISTICS: +Combat Abilities: + Battle Standard twice per day - The axe can knock back foes in a small radius and grant allies +1 THAC0 and damage for two rounds + +THAC0: +4 bonus +Damage: 1D10+4 +Damage type: Slashing +Weight: 6 +Speed Factor: 5 +Proficiency Type: Axe +Type: 2-handed +Not Usable By: + Druid + Cleric + Mage + Thief~ + @6011 = ~Two Handed Axe +5: The Battle Standard~ + @6012 = ~Murzul Dul was a warchief under King Greneire who earned his fame as a skilled tactician. This immense axe doubled as his battle standard in combat and could strike down foes and rally his horde in equal measure. Like King Greniere himself and most of his horde, Dul was killed during the siege of the Citadel of Many Arrows when Emerus Warcrown swept away the battling hordes and the axe claimed as war spoils. The axe retains its ability to rally allies and shake foes by spiking the haft of the weapon into the ground. Cespenar has further enhanced this axe. + +STATISTICS: +Combat Abilities: + Enhanced Battle Standard twice per day - By spiking the haft into the ground, the wielder can knock back foes in a small radius and grant allies +2 to saves, THAC0 and damage for two rounds + +THAC0: +5 bonus +Damage: 1D10+5 +Damage type: Slashing +Weight: 5 +Speed Factor: 4 +Proficiency Type: Axe +Type: 2-handed +Not Usable By: + Druid + Cleric + Mage + Thief~ + @6013 = ~Battle Standard~ + @6014 = ~Enhanced Battle Standard~ + @6015 = ~Ooh, big axe! Gots some woods to chop? Shiny, shiny!~ + @6016 = ~Recipe can make Battle Standard more Standard. 5,000 gold will do it.~ + @6017 = ~Let's see what else you got then.~ + + @7002 = ~Shapeshift: Fire Elemental~ // iwdee 25824 + @7003 = ~Shapeshift: Earth Elemental~ // iwdee 25823 + @7004 = ~Shapeshift: Water Elemental~ // iwdee 25822 + @7005 = ~Shapeshift: Fire Elemental + +Strength: 19 +Dexterity: 9 + +Base Armor Class: 2 +Number of Attacks: 1 +Attack Damage: 1d8 crushing + 1d4 fire + +Special Abilities: +- Cold Resistance: -50% +- Fire Resistance: 100% +- Acid Resistance: 15% +- Electricity Resistance: 15% +- Slashing Resistance: 15% +- Crushing Resistance: 15% +- Piercing Resistance: 15% +- Missile Resistance: 15%~ + @7006 = ~Shapeshift: Earth Elemental + +Strength: 23 +Dexterity: 5 + +Base Armor Class: -2 +Number of Attacks: 1 +Attack Damage: 4d8 crushing + +Special Abilities: +- Cold Resistance: 25% +- Fire Resistance: 25% +- Slashing Resistance: 50% +- Crushing Resistance: -50% +- Piercing Resistance: 50% +- Missile Resistance: 75%~ + @7007 = ~Shapeshift: Water Elemental + +Strength: 18 +Dexterity: 14 + +Base Armor Class: -2 +Number of Attacks: 1 +Attack Damage: 4d8 crushing + +Special Abilities: +- Cold Resistance: -25% +- Electricity Resistance: -75% +- Acid Resistance: 75% +- Slashing Resistance: 75% +- Crushing Resistance: 75% +- Piercing Resistance: 75% +- Missile Resistance: 75%~ + @7008 = ~Shapeshift: Black Bear + +Strength: 18/00 +Dexterity: 12 + +Base Armor Class: 7 +Number of Attacks: 3 +Attack Damage: 1d6 (piercing), strikes as +1 weapon + +Special Abilities: + - Increased movement rate~ + @7009 = ~Water Elemental~ + @7010 = ~Gained Passive Ability: Timeless Body~ // iwdee string: 40026 + @7011 = ~DRUID: The Druid serves the cause of nature and neutrality; the wilderness is community, and uses special powers to protect it and to preserve balance in the world. + +CLASS FEATURES: + +- May only wear non-metallic armor. +- May only equip bucklers and non-metallic shields. +- May only use the following weapons: scimitar, dagger, club, spear, quarterstaff, dart, sling. +- May only become Proficient (one slot) in any weapon class. +- May only become Proficient (one slot) in any fighting style. +- May cast druidic spells. +- 5th level: May shapeshift into a winter wolf once per day. +- 7th level: May shapeshift into a boring beetle once per day. +- 9th level: Becomes immune to poison. May shapeshift into a polar bear once per day. +- 11th level: Gains the ability to transform into a fire elemental once per day. +- 13th level: Gains the ability to transform into an earth elemental once per day. +- 15th level: Gains the Timeless Body ability, becoming immune to fatigue. Gains the ability to transform into a water elemental once per day. +- Alignment restricted to true neutral. +- Hit Die: d8 + +Prime Requisites For Dual-Classing: Wisdom, Charisma~ // iwdee string: 9560 + + @9001 = ~Boring Beetle~ + @9002 = ~Polymorph Self +(Alteration) + +Level: 4 +Range: 0 +Duration: 1 turn + 3 rounds/level +Casting Time: 4 +Area of Effect: The caster +Saving Throw: None + +When this spell is cast, the wizard is able to assume the form of another creature. The caster also gains the physical mode of locomotion and breathing as well. This spell does not give the new form's other abilities such as special attacks and magic, nor does it run the risk of the wizard changing personality and mentality. + +For the duration of the spell, the caster may transform into any of the new forms at any time, and as many times as wishes. The caster gains the natural attacks of the new form in some cases and may use weapons in others. The mental attributes of the wizard remain the same, but all the physical attributes are obtained from the new form. Also, any natural protections that the new form offers are conferred to the wizard, such as the resistance to missile and crushing weapons possessed by the slime form. + +The possible forms given by Polymorph Self are: + Flind: wields a magical halberd (+1 fire damage and strikes as a +3 weapon) + Mustard Jelly: capable of poisoning or slowing opponents (if they fail a Save vs. Death when hit) + Ogre: capable of causing massive damage with its fists + Spider: causes poison damage when it hits an opponent + +In addition, the caster may choose the form of brown bear, black bear, wolf, polar bear, or winter wolf.~ + @9003 = ~Polar Bear~ + @9004 = ~Polymorph Self +(Alteration) + +Level: 4 +Range: 0 +Duration: 1 turn + 3 rounds/level +Casting Time: 4 +Area of Effect: The caster +Saving Throw: None + +When this spell is cast, the wizard is able to assume the form of another creature. The caster also gains the physical mode of locomotion and breathing as well. This spell does not give the new form's other abilities such as special attacks and magic, nor does it run the risk of the wizard changing personality and mentality. + +For the duration of the spell, the caster may transform into any of the new forms at any time, and as many times as wishes. The caster gains the natural attacks of the new form in some cases and may use weapons in others. The mental attributes of the wizard remain the same, but all the physical attributes are obtained from the new form. Also, any natural protections that the new form offers are conferred to the wizard, such as the resistance to missile and crushing weapons possessed by the slime form. + +The possible forms given by Polymorph Self are: + Flind: wields a magical halberd (+1 fire damage and strikes as a +3 weapon) + Mustard Jelly: capable of poisoning or slowing opponents (if they fail a Save vs. Death when hit) + Ogre: capable of causing massive damage with its fists + Spider: causes poison damage when it hits an opponent + +In addition, the caster may choose the form of brown bear, black bear, wolf, boring beetle, polar bear, or winter wolf.~ + @9005 = ~Shapeshift: Boring Beetle~ + @9006 = ~Shapeshift: Boring Beetle + +Strength: 18/51 +Dexterity: 7 + +Base Armor Class: -2 +Number of Attacks: 1 +Attack Damage: 5d4 slashing + +Special Abilities: +- Slashing Resistance: 50% +- Piercing Resistance: 50% +- Missile Resistance: 50%~ + @9007 = ~Shapeshift: Polar Bear~ + @9008 = ~Shapeshift: Polar Bear + +Strength: 18/00 +Dexterity: 10 + +Base Armor Class: 4 +Number of Attacks: 3 +Attack Damage: 1d12 slashing + +Special Abilities: +- Cold Resistance: 75% +- Fire Resistance: -25%~ + @9009 = ~Shapeshift: Winter Wolf~ + @9010 = ~Shapeshift: Winter Wolf + +Strength: 18 +Dexterity: 13 + +Base Armor Class: 2 +Number of Attacks: 2 +Attack Damage: 1d6 slashing + +Special Abilities: +- Cold Resistance: 75% +- Fire Resistance: -25%~ + +@10001 = ~Smite Evil~ // iwdee 26267 +@10002 = ~Smite Evil + +Paladins have the ability to call down a column of holy light once per day. This ability deals 1d6 + 1d6 points of magic damage for every 3 levels to a single, evil-aligned creature within the visual range of the Paladin.~ // iwdee 40020 +@10003 = ~- May cast Detect Evil once per day per level (starts at 1st level with 4 uses).~ // match exact from bg2ee strref 9558 +@10004 = ~- May cast Protection From Evil once per day per level (starts at 1st level with one use).~ // match exact from bg2ee strref 9558 +@10005 = ~- May cast priest spells starting at level 9.~ // match exact from bg2ee strref 9558 +@10006 = ~- May use the Cure Disease ability once per day. +- May use the Detect Evil ability at will (once per round).~ // grab text from iwdee 9558 +@10007 = ~- May cast a special version of Protection From Evil once per day. This ability only affects the Paladin and lasts for 24 turns. +- May use the Smite Evil ability once per day to deal 1d6 + 1d6 points of damage for every 3 levels of the paladin to a single, evil-aligned opponent.~ // grab text from iwdee 9558 +@10008 = ~- May cast priest spells starting at level 6. +- 3rd level: Gains the Divine Courage ability becoming immune to fear. +- Paladins are completely immune to all forms of disease, magical or mundane.~ // grab text from iwdee 9558 +@10009 = ~Gained Passive Ability: Divine Courage~ // iwdee 40025 +@11001 = ~Tracking~ // bg2ee 70494 +@11002 = ~Tracking +With an intimate knowledge of surroundings and the creatures that live within them, a ranger can use the Tracking ability to give self a general idea of what creatures are in an area and which direction they are. Red arrows at the edge of the screen will point in the general direction of the creatures in the area.~ // bg2ee 71467 +@11003 = ~– May use the Tracking ability at will (once per round). + +TRACKING: The ranger can attempt to look for tracks and gain information on what type of creatures, if any, have passed through the area. Potential information that can be gained from tracking includes the number of creatures, the direction they were traveling in, and how long ago the tracks were made. + +~ // from iwdee 37106, keep these extra linebreaks +@11004 = ~- Alignment restricted to good.~ +@12001 = ~Gained Passive Ability: Evasion~ // string 40024 in IWDEE +@12002 = ~- 7th level: Gains the Evasion ability. + +EVASION: When a Thief is hit by a spell that can be evaded (Fireball, Lightning Bolt, etc.), the Thief is allowed a Save vs. Breath to completely avoid the effects. If the Saving Throw is failed, the spell works normally, including a save for half damage if the spell allows for it. A helpless Thief (e.g. held, stunned, or asleep) cannot use Evasion. + +~ // keep these extra linebreaks +@12003 = ~Disadvantages:~ // match this exactly to a kit description, as this is used as a text-match +@12004 = ~- Alignment restricted to any except lawful good.~ // match this exactly to main thief description (strref 9561), as this is used as a text-match \ No newline at end of file diff --git a/iwdification/languages/en_us/game_strings_ee.tra b/iwdification/languages/en_us/game_strings_ee.tra new file mode 100644 index 0000000..72d4f85 --- /dev/null +++ b/iwdification/languages/en_us/game_strings_ee.tra @@ -0,0 +1,229 @@ +// strings in this file will be used exclusively for EE games and override similar strings in game_strings +// this file is UTF-8 and does not get converted. + + @6002 = ~This mighty weapon consists of a haft several feet long, topped with a heavy blade. The axe may be double-bitted, with blades on both sides of the haft, or it may only have a single blade. It is an unwieldy weapon, but a skilled warrior can strike blows of tremendous strength with it. + +STATISTICS: + +Damage: 1d10 (slashing) +Speed Factor: 9 +Proficiency Type: Axe +Type: Two-handed +Requires: + 10 Strength + +Weight: 10~ + @6004 = ~This mighty weapon consists of a haft several feet long, topped with a heavy blade. The axe may be double-bitted, with blades on both sides of the haft, or it may only have a single blade. This axe has also been bestowed with a small number of magical properties, however, thus making it more effective in combat. Its keen blade, for instance, will shear through your opponent's flesh to find the bone while its barbed tip will seek out gaps in their armor. + +STATISTICS: + +THAC0: +1 +Damage: 1d10+1 (slashing) +Speed Factor: 8 +Proficiency Type: Axe +Type: Two-handed +Requires: + 10 Strength + +Weight: 9~ + @6006 = ~Tremain Longaxe was an adventurer in the Ten Towns with a penchant for axes. While two-handed axes are generally slow and unwieldy, Tremain had this axe specially designed to trip opponents, allowing him to overcome foes with faster and lighter weapons. + +STATISTICS: + +Combat abilities: +- 10% chance of knocking down opponent for one round on each hit + +THAC0: +2 +Damage: 1d10+2 (slashing) +Speed Factor: 7 +Proficiency Type: Axe +Type: Two-handed +Requires: + 10 Strength + +Weight: 8~ + @6008 = ~This mighty weapon consists of a haft several feet long, topped with a heavy blade. The axe may be double-bitted, with blades on both sides of the haft, or it may only have a single blade. This axe has been imbued with several enchantments, however, thus making it more effective in combat. + +STATISTICS: + +THAC0: +3 +Damage: 1d10+3 (slashing) +Speed Factor: 6 +Proficiency Type: Axe +Type: Two-handed +Requires: + 10 Strength + +Weight: 7~ + @6010 = ~Murzul Dul was a warchief under King Greneire who earned his fame as a skilled tactician. This immense axe doubled as his battle standard in combat and could strike down foes and rally his horde in equal measure. Like King Greniere himself and most of his horde, Dul was killed during the siege of the Citadel of Many Arrows when Emerus Warcrown swept away the battling hordes and the axe claimed as war spoils. The axe retains its ability to rally allies and shake foes by spiking the haft of the weapon into the ground. + +STATISTICS: + +Combat abilities: +- Battle Standard twice per day - The axe can knock back foes in a small radius and grant allies +1 THAC0 and damage for two rounds + +THAC0: +4 +Damage: 1d10+4 (slashing) +Speed Factor: 5 +Proficiency Type: Axe +Type: Two-handed +Requires: + 10 Strength + +Weight: 6~ + @6012 = ~Murzul Dul was a warchief under King Greneire who earned his fame as a skilled tactician. This immense axe doubled as his battle standard in combat and could strike down foes and rally his horde in equal measure. Like King Greniere himself and most of his horde, Dul was killed during the siege of the Citadel of Many Arrows when Emerus Warcrown swept away the battling hordes and the axe claimed as war spoils. The axe retains its ability to rally allies and shake foes by spiking the haft of the weapon into the ground. Cespenar has further enhanced this axe. + +STATISTICS: + +Combat abilities: +- Enhanced Battle Standard twice per day - By spiking the haft into the ground, the wielder can knock back foes in a small radius and grant allies +2 to saves, THAC0 and damage for two rounds + +THAC0: +5 +Damage: 1d10+5 (slashing) +Speed Factor: 4 +Proficiency Type: Axe +Type: Two-handed +Requires: + 10 Strength + +Weight: 5~ + @7005 = ~Shapeshift: Fire Elemental + +Strength: 19 +Dexterity: 9 + +Base Armor Class: 2 +Number of Attacks: 1 +Attack Damage: 1d8 crushing + 1d4 fire + +Special Abilities: +– Cold Resistance: -50% +– Fire Resistance: 100% +– Acid Resistance: 15% +– Electricity Resistance: 15% +– Slashing Resistance: 15% +– Crushing Resistance: 15% +– Piercing Resistance: 15% +– Missile Resistance: 15%~ + @7006 = ~Shapeshift: Earth Elemental + +Strength: 23 +Dexterity: 5 + +Base Armor Class: -2 +Number of Attacks: 1 +Attack Damage: 4d8 crushing + +Special Abilities: +– Cold Resistance: 25% +– Fire Resistance: 25% +– Slashing Resistance: 50% +– Crushing Resistance: -50% +– Piercing Resistance: 50% +– Missile Resistance: 75%~ + @7007 = ~Shapeshift: Water Elemental + +Strength: 18 +Dexterity: 14 + +Base Armor Class: -2 +Number of Attacks: 1 +Attack Damage: 4d8 crushing + +Special Abilities: +– Cold Resistance: -25% +– Electricity Resistance: -75% +– Acid Resistance: 75% +– Slashing Resistance: 75% +– Crushing Resistance: 75% +– Piercing Resistance: 75% +– Missile Resistance: 75%~ + @7008 = ~Shapeshift: Black Bear + +Strength: 18/00 +Dexterity: 12 + +Base Armor Class: 7 +Number of Attacks: 3 +Attack Damage: 1d6 (piercing), strikes as +1 weapon + +Special Abilities: + – Increased movement rate~ + @7011 = ~DRUID: The Druid serves the cause of nature and neutrality; the wilderness is community, and uses special powers to protect it and to preserve balance in the world. + +CLASS FEATURES: + +– May only wear non-metallic armor. +– May only equip bucklers and non-metallic shields. +– May only use the following weapons: scimitar, dagger, club, spear, quarterstaff, dart, sling. +– May only become Proficient (one slot) in any weapon class. +– May only become Proficient (one slot) in any fighting style. +– May cast druidic spells. +– 5th level: May shapeshift into a winter wolf once per day. +– 7th level: May shapeshift into a boring beetle once per day. +– 9th level: Becomes immune to poison. May shapeshift into a polar bear once per day. +– 11th level: Gains the ability to transform into a fire elemental once per day. +– 13th level: Gains the ability to transform into an earth elemental once per day. +– 15th level: Gains the Timeless Body ability, becoming immune to fatigue. Gains the ability to transform into a water elemental once per day. +– Alignment restricted to true neutral. +– Hit Die: d8 + +Prime Requisites For Dual-Classing: Wisdom, Charisma~ // iwdee string: 9560 + + @9006 = ~Shapeshift: Boring Beetle + +Strength: 18/51 +Dexterity: 7 + +Base Armor Class: -2 +Number of Attacks: 1 +Attack Damage: 5d4 slashing + +Special Abilities: +– Slashing Resistance: 50% +– Piercing Resistance: 50% +– Missile Resistance: 50%~ + @9008 = ~Shapeshift: Polar Bear + +Strength: 18/00 +Dexterity: 10 + +Base Armor Class: 4 +Number of Attacks: 3 +Attack Damage: 1d12 slashing + +Special Abilities: +– Cold Resistance: 75% +– Fire Resistance: -25%~ + @9010 = ~Shapeshift: Winter Wolf + +Strength: 18 +Dexterity: 13 + +Base Armor Class: 2 +Number of Attacks: 2 +Attack Damage: 1d6 slashing + +Special Abilities: +– Cold Resistance: 75% +– Fire Resistance: -25%~ +@10003 = ~– May cast Detect Evil once per day per level (starts at 1st level with 4 uses).~ // match exact from bg2ee strref 9558 +@10004 = ~– May cast Protection From Evil once per day per level (starts at 1st level with one use).~ // match exact from bg2ee strref 9558 +@10005 = ~– May cast priest spells starting at level 9.~ // match exact from bg2ee strref 9558 +@10006 = ~– May use the Cure Disease ability once per day. +– May use the Detect Evil ability at will (once per round).~ // grab text from iwdee 9558 +@10007 = ~– May cast a special version of Protection From Evil once per day. This ability only affects the Paladin and lasts for 24 turns. +– May use the Smite Evil ability once per day to deal 1d6 + 1d6 points of damage for every 3 levels of the paladin to a single, evil-aligned opponent.~ // grab text from iwdee 9558 +@10008 = ~– May cast priest spells starting at level 6. +– 3rd level: Gains the Divine Courage ability becoming immune to fear. +– Paladins are completely immune to all forms of disease, magical or mundane.~ // grab text from iwdee 9558 + +@11003 = ~– May use the Tracking ability at will (once per round).~ // from iwdee 37106 +@11004 = ~– Alignment restricted to good.~ + +@12002 = ~– 7th level: Gains the Evasion ability. + +EVASION: When a Thief is hit by a spell that can be evaded (Fireball, Lightning Bolt, etc.), the Thief is allowed a Save vs. Breath to completely avoid the effects. If the Saving Throw is failed, the spell works normally, including a save for half damage if the spell allows for it. A helpless Thief (e.g. held, stunned, or asleep) cannot use Evasion. + +~ // keep these extra linebreaks +@12004 = ~– Alignment restricted to any except lawful good.~ // match this exactly to main thief description (strref 9561), as this is used as a text-match \ No newline at end of file diff --git a/iwdification/languages/en_us/setup.tra b/iwdification/languages/en_us/setup.tra new file mode 100644 index 0000000..618c330 --- /dev/null +++ b/iwdification/languages/en_us/setup.tra @@ -0,0 +1,57 @@ +/* TRANSLATORS NOTE: + +There are three tra files in this directory. This setup.tra file contains only strings used by +WeiDU for installation. It's in UTF-8 and does not get converted. The other two are for strings that will +actually make it into the game, with game_strings_ee overriding game_strings on EE games. game_strings +will get converted to UTF-8 only on EE games. Since game_strings_ee will only be used on EE games, it is +in UTF-8 already and will not be converted. + +In addition to this folder, there are another four tra files used only for the new spells and bard songs, +located in iwdification/dw_iwdspells_resource/tra. The good news is that the largest one, iwdspells.tra, +is automatically generated when we pull resources from IWDEE. While dw_iwdspells_bard.tra is new, it's also +short. The other two are from SCS so you may be able to use an existing translation from there. + +In the main, automatically generated iwdspells.tra, one manual change is required: in string @218, Cause Disease +is an Abjuration, not Necromancy, and its sphere is Necromantic, not Healing. The rest of the file should +already be pulled directly from your language on IWDEE and should not need translation, though you're welcome +to look it over if you wish. +*/ + + +// this file contains strings only used by the WeiDU installer and does not get converted to UTF-8 for EE games. + @993 = ~Additional Spells~ + @994 = ~Miscellaneous Changes~ + @995 = ~Class Updates~ + @996 = ~This component is only available on non-EE games~ + @997 = ~This component is only available on EE games~ + @998 = ~This functionality is already installed by another mod.~ + @999 = ~DLC Merger is required before mods can be installed on this game. Check the readme for more information and a link to download DLC Merger.~ + + @1000 = ~Icewind Dale Casting Graphics (Andyr)~ + + @2000 = ~Commoners Use Drab Colors~ + + @3000 = ~IWD Arcane Spell Pack~ + + @4000 = ~IWD Divine Spell Pack~ + + @5000 = ~IWD Class Updates: Bard~ + + @6000 = ~Two Handed Axe Item Pack~ + + @7000 = ~IWD Class Updates: Druid~ + @7001 = ~Use IWD Shapeshifting and Ability Progression~ + @7100 = ~Allow Elves to be Druids~ + @7200 = ~Install Both of the Above~ + + @8000 = ~Additional Portrait Icons~ + + @9000 = ~Expanded Polymorph Self~ + +@10000 = ~IWD Class Updates: Paladin~ + +@11000 = ~IWD Class Updates: Ranger~ + +@12000 = ~IWD Class Updates: Thief~ + +@13000 = ~Use IWD Damage Animations~ \ No newline at end of file diff --git a/iwdification/languages/english/game_strings.tra b/iwdification/languages/english/game_strings.tra deleted file mode 100644 index 307619e..0000000 --- a/iwdification/languages/english/game_strings.tra +++ /dev/null @@ -1,1454 +0,0 @@ -// strings in this file will be overridden by strings in game_strings_ee for EE games. -// this file is ANSI, and will be converted to UTF-8 for EE games. -// use the IWDification translator tool on the G3 forums to automatically translate most of these. - - @3001 = ~Emotion, Hopelessness~ - @3002 = ~Emotion, Hopelessness -(Enchantment/Charm) - -Level: 4 -Range: Visual range of the caster -Duration: 1 turn -Casting Time: 4 -Area of Effect: 7-ft. radius -Saving Throw: Neg. - -This spell creates the emotion of hopelessness within the area of effect. All enemies who fail to save vs. Spell just stand and do nothing for 1 turn. This spell nullifies Emotion, Hope within the area of effect at the time of casting.~ - @3003 = ~Hopelessness~ - @3004 = ~Polymorph Self -(Alteration) - -Level: 4 -Range: 0 -Duration: 1 turn + 3 rounds/level -Casting Time: 4 -Area of Effect: The caster -Saving Throw: None - -When this spell is cast, the wizard is able to assume the form of another creature. The caster also gains the physical mode of locomotion and breathing as well. This spell does not give the new form's other abilities such as special attacks and magic, nor does it run the risk of the wizard changing personality and mentality. - -For the duration of the spell, the caster may transform into any of the new forms at any time, and as many times as wishes. The caster gains the natural attacks of the new form in some cases and may use weapons in others. The mental attributes of the wizard remain the same, but all the physical attributes are obtained from the new form. Also, any natural protections that the new form offers are conferred to the wizard, such as the resistance to missile and crushing weapons possessed by the slime form. - -The possible forms given by Polymorph Self are: - Flind: wields a magical halberd (+1 fire damage and strikes as a +3 weapon) - Mustard Jelly: capable of poisoning or slowing opponents (if they fail a Save vs. Death when hit) - Ogre: capable of causing massive damage with its fists - Spider: causes poison damage when it hits an opponent - -In addition, the caster may choose the form of brown bear, black bear, wolf, boring beetle, polar bear, or winter wolf.~ - @3005 = ~Shapeshift: Boring Beetle~ - @3006 = ~Shapeshift: Boring Beetle - -Strength: 18/51 -Dexterity: 7 - -Base Armor Class: -2 -Number of Attacks: 1 -Attack Damage: 5d4 slashing - -Special Abilities: -– Slashing Resistance: 50% -– Piercing Resistance: 50% -– Missile Resistance: 50% - -The Druid is healed 12 Hit Points after using this ability.~ - @3007 = ~Shapeshift: Polar Bear~ - @3008 = ~Shapeshift: Polar Bear - -Strength: 18/00 -Dexterity: 10 - -Base Armor Class: 4 -Number of Attacks: 3 -Attack Damage: 1d12 slashing - -Special Abilities: -– Cold Resistance: 75% -– Fire Resistance: -25% - -The Druid is healed 12 Hit Points after using this ability.~ - @3009 = ~Shapeshift: Winter Wolf~ - @3010 = ~Expeditious Retreat~ - @3011 = ~Expeditious Retreat -(Alteration) - -Level: 1 -Range: 0 -Duration: 3 rounds -Casting Time: 1 -Area of Effect: The caster -Saving Throw: None - -This spell doubles the caster's normal speed for a short period of time... usually long enough to escape. Other movement-altering effects, such as Haste and Slow, cannot affect the caster while this spell is in effect. While Expeditious Retreat is active, the caster cannot attack, cast spells, or use any items or special abilities... can only run.~ - @3012 = ~Shapeshift: Winter Wolf - -Strength: 18 -Dexterity: 13 - -Base Armor Class: 2 -Number of Attacks: 2 -Attack Damage: 1d6 slashing - -Special Abilities: -– Cold Resistance: 75% -– Fire Resistance: -25% - -The Druid is healed 12 Hit Points after using this ability.~ - @3013 = ~Boring Beetle~ - @3014 = ~Polymorph Self -(Alteration) - -Level: 4 -Range: 0 -Duration: 1 turn + 3 rounds/level -Casting Time: 4 -Area of Effect: The caster -Saving Throw: None - -When this spell is cast, the wizard is able to assume the form of another creature. The caster also gains the physical mode of locomotion and breathing as well. This spell does not give the new form's other abilities such as special attacks and magic, nor does it run the risk of the wizard changing personality and mentality. - -For the duration of the spell, the caster may transform into any of the new forms at any time, and as many times as wishes. The caster gains the natural attacks of the new form in some cases and may use weapons in others. The mental attributes of the wizard remain the same, but all the physical attributes are obtained from the new form. Also, any natural protections that the new form offers are conferred to the wizard, such as the resistance to missile and crushing weapons possessed by the slime form. - -The possible forms given by Polymorph Self are: - Flind: wields a magical halberd (+1 fire damage and strikes as a +3 weapon) - Mustard Jelly: capable of poisoning or slowing opponents (if they fail a Save vs. Death when hit) - Ogre: capable of causing massive damage with its fists - Spider: causes poison damage when it hits an opponent - -In addition, the caster may choose the form of brown bear, black bear, wolf, polar bear, or winter wolf.~ - @3015 = ~Polar Bear~ - @3020 = ~Snilloc's Snowball Swarm~ - @3021 = ~Snilloc's Snowball Swarm -(Evocation) - -Level: 2 -Range: Visual range of the caster -Duration: Instant -Casting Time: 2 -Area of Effect: 15-ft. radius -Saving Throw: 1/2 - -This spell causes a flurry of snowballs to erupt from a point within range. These snowballs will hit everything within the area of effect, doing 1d3 points of cold damage per level, up to a maximum of 8d3 points at level 8. Against fire-using or fire-dwelling creatures, it inflicts 1d6 points of cold damage per level, up to a maximum of 8d6 points at level 8.~ - @3030 = ~Decastave~ - @3031 = ~Decastave -(Evocation) - -Level: 2 -Range: 0 -Duration: 3 rounds + 1 round/level -Casting Time: 2 -Area of Effect: The caster -Saving Throw: None - -This spell creates a staff of force in the caster's hand. It is treated as a magical weapon, doing 1d6 Hit Points of damage per hit, and it can hit creatures that require +1 weapons to hit. It is a staff, however, so if the caster does not have a proficiency in staff weapons, then the Decastave is used at a penalty. The staff also has the power to drain a target of 1d2 Hit Points on every strike. These Hit Points are added to the caster's, but they can only heal damage the caster has taken; they will not raise Hit Points beyond normal maximum.~ - @3040 = ~Cat's Grace~ - @3041 = ~Cat's Grace -(Alteration) - -Level: 2 -Range: Touch -Duration: 1 hour/level -Casting Time: 2 -Area of Effect: 1 creature -Saving Throw: None - -This spell magically increases a target's Dexterity. The amount depends on the target's class: Rogues gain 1d8 points, warriors and wizards gain 1d6 points, and priests gain 1d4 points. If a character has more than one class, the larger die is used. Cat's Grace cannot raise a target's Dexterity past 20.~ - @3050 = ~Icelance~ - @3051 = ~Icelance -(Evocation) - -Level: 3 -Range: Visual range of the caster -Duration: Instant -Casting Time: 3 -Area of Effect: 1 creature -Saving Throw: Special - -This spell fires a magical lance of ice at a target of the caster's choosing. It automatically hits, inflicting 5d6 points of cold damage and forcing the target to make a Save vs. Spell or be stunned for 3 rounds.~ - @3060 = ~Lance of Disruption~ - @3061 = ~Lance of Disruption -(Invocation) - -Level: 3 -Range: 100 ft. -Duration: Instant -Casting Time: 3 -Area of Effect: Special -Saving Throw: 1/2 - -This spell shoots a lance of force, which travels from the caster to a specified point 100 ft. in the distance. Any creatures in the lance's path take 5d4 points of crushing damage plus 2 points of damage per level of the caster (maximum of +30). Victims can save vs. Spell for half damage.~ - @3070 = ~Beltyn's Burning Blood~ - @3071 = ~Beltyn's Burning Blood -(Necromancy) - -Level: 4 -Range: Visual range of the caster -Duration: 1 round/2 levels -Casting Time: 4 -Area of Effect: 1 creature -Saving Throw: Neg. - -This spell turns a target's blood to flame, doing 3d4 Hit Points of damage every round and driving the victim berserk with pain. The target gets to save vs. Spell every round; if successful, the damage and berserk state are negated. This spell does not work against undead or extraplanar creatures that do not have blood (such as elementals). If the creature is resistant to fire, this resistance will lower or nullify the damage from this spell.~ - @3080 = ~Shadow Monsters~ - @3081 = ~Shadow Monsters -(Illusion/Phantasm) - -Level: 4 -Range: Visual range of the caster -Duration: 1 round/level -Casting Time: 4 -Area of Effect: Special -Saving Throw: None - -This spell shapes material from the Demiplane of Shadow into illusionary monsters. Up to six shadowy creatures can be summoned at once, but their total Hit Dice will normally not exceed the spellcaster's level.~ - @3082 = ~Lizard Man~ - @3090 = ~Emotion, Courage~ - @3091 = ~Emotion, Courage -(Enchantment/Charm) - -Level: 4 -Range: Visual range of the caster -Duration: 1 hour -Casting Time: 4 -Area of Effect: 7-ft. radius -Saving Throw: None - -This spell creates the emotion of courage within the area of effect. All creatures affected by the spell gain +1 to hit, +3 to their damage rolls, and +5 temporary Hit Points (which can put them above their maximum Hit Points). This spell nullifies all fear effects within the area of effect at the time of casting.~ - @3092 = ~Courage~ - @3100 = ~Emotion, Fear~ - @3101 = ~Emotion, Fear -(Enchantment/Charm) - -Level: 4 -Range: Visual range of the caster -Duration: 5 rounds -Casting Time: 4 -Area of Effect: 7-ft. radius -Saving Throw: Neg. - -This spell creates the emotion of fear within the area of effect. All enemies who fail to save vs. Spell flee for 5 rounds. This spell nullifies Emotion, Courage within the area of effect at the time of casting.~ - @3110 = ~Emotion, Hope~ - @3111 = ~Emotion, Hope -(Enchantment/Charm) - -Level: 4 -Range: Visual range of the caster -Duration: 1 hour -Casting Time: 4 -Area of Effect: 7-ft. radius -Saving Throw: None - -This spell creates the emotion of hope within the area of effect. All creatures affected by the spell gain a morale boost and +2 on their Saving Throws, attack rolls, and damage rolls. This spell nullifies all hopelessness effects within the area of effect at the time of casting.~ - @3112 = ~Hope~ - @3120 = ~Mordenkainen's Force Missiles~ - @3121 = ~Mordenkainen's Force Missiles -(Invocation) - -Level: 4 -Range: Visual range of the caster -Duration: Instant -Casting Time: 4 -Area of Effect: 2-ft. radius -Saving Throw: Special - -This spell creates a brilliant globe of magical energy that streaks forth from the caster's hand to unerringly strike its target, much like a Magic Missile spell. The wizard creates one missile at 7th level and an additional missile at every third level after 7th-in other words, two missiles at 10th level, three at 13th, four at 16th, and so on, to a maximum of seven missiles at 25th level. Each missile inflicts 2d4 points of damage to the target and then bursts in a 2-ft. radius concussive blast that inflicts 1 point of damage per level of the caster-for example, a 12th-level wizard could conjure two force missiles, each of which strikes for 2d4+12 points of magic damage. Creatures taking damage can attempt a Save vs. Spell to negate the concussion damage, but the impact of the missile itself allows no Saving Throw. The 1st-level wizard spell Shield will absorb the force missiles harmlessly, including the concussion damage.~ - @3130 = ~Shout~ - @3131 = ~Shout -(Invocation) - -Level: 4 -Range: 0 -Duration: Instant -Casting Time: 1 -Area of Effect: 17-ft. cone with 15-deg. arc -Saving Throw: Special - -Shout grants the wizard tremendous vocal powers, allowing to emit an earsplitting roar from mouth in a cone-shaped area of effect. Any creature within this area is deafened for 9 rounds and suffers 4d6 points of magic damage. A successful Save vs. Spell negates the deafness and reduces the damage by half.~ - @3140 = ~Vitriolic Sphere~ - @3141 = ~Vitriolic Sphere -(Conjuration) - -Level: 4 -Range: Visual range of the caster -Duration: Special -Casting Time: 4 -Area of Effect: 5-ft. radius -Saving Throw: Special - -This spell conjures a sphere of glowing emerald acid that the caster can direct to strike any target within range. When it reaches its target, the sphere explodes and drenches the victim in potent acid. The victim suffers 1d4 points of acid damage per caster level, to a maximum of 12d4 points of damage. After the initial damage, the victim must save vs. Spell to avoid more damage. If unsuccessful, the victim continues to suffer acid damage in the following rounds, sustaining two less dice of damage each round. For example, an 8th-level wizard inflicts 8d4 damage with this spell on the first round, 6d4 on the second round, 4d4 on the third round, 2d4 on the fourth round, and the spell ends on the fifth round. Each round after the first, the victim is entitled to a Save vs. Spell to avoid further damage. - -The vitriolic sphere also splashes acid in a 5-ft. radius around the primary target. Any creatures within the splash radius must save vs. Petrification/Polymorph or suffer a splash hit that inflicts 1d4 points of damage per every five levels of the caster. Splash hits do not cause continuing damage.~ - @3150 = ~Shroud of Flame~ - @3151 = ~Shroud of Flame -(Invocation) - -Level: 5 -Range: Visual range of the caster -Duration: 1 round/2 levels (special) -Casting Time: 5 -Area of Effect: 5-ft. radius -Saving Throw: Neg. - -This spell causes a creature to burst into flames if it fails a Save vs. Spell. The creature will burn for 2d6 points of fire damage every round, and gouts of flame erupt from the burning target, causing any creatures within 5 ft. to take 1d4 points of fire damage from the flames. Anyone hit by the victim's flames must also make a Save vs. Spell to avoid contracting the shroud themselves. The shroud of flame dissipates if the caster and target are no longer in the same area. This spell is particularly useful in dispersing packs of trolls and frost salamanders.~ - @3160 = ~Demi-Shadow Monsters~ - @3161 = ~Demi-Shadow Monsters -(Illusion/Phantasm) - -Level: 5 -Range: Visual range of the caster -Duration: 1 round/level -Casting Time: 5 -Area of Effect: Special -Saving Throw: None - -This spell is similar to the 4th-level wizard spell Shadow Monsters, except the summoned creatures are much more powerful.~ - @3162 = ~Goblin Elite~ - @3163 = ~Tough Lizard Man~ - @3170 = ~Summon Shadow~ - @3171 = ~Summon Shadow -(Conjuration/Summoning, Necromancy) - -Level: 5 -Range: Visual range of the caster -Duration: 1 round + 1 round/level -Casting Time: 5 -Area of Effect: Special -Saving Throw: None - -This spell summons three 4-HD shadows. The shadows will obey the orders of the caster, attacking enemies or performing tasks until the spell expires or the shadows are slain.~ - @3180 = ~Contact Other Plane~ - @3181 = ~Contact Other Plane -(Divination) - -Level: 5 -Range: 0 -Duration: Instant -Casting Time: 9 -Area of Effect: The caster -Saving Throw: None - -This spell allows the wizard to contact powers from other planes of existence in order to receive advice and information. The nature of the divination is oriented around knowledge of powerful foes, magic items, and spells.~ - @3182 = ~Planar Spirit~ - @3190 = ~Conjure Fire Elemental~ - @3191 = ~Conjure Fire Elemental -(Conjuration/Summoning) - -Level: 5 -Range: Visual range of the caster -Duration: 1 turn/level -Casting Time: 9 -Area of Effect: Special -Saving Throw: None - -This spell allows the caster to summon an 8-HD elemental from the Elemental Plane of Fire and bind it to will. This elemental will fight on behalf of the caster until the spell duration expires or the elemental is destroyed.~ - @3192 = ~Fire Elemental~ - @3200 = ~Conjure Earth Elemental~ - @3201 = ~Conjure Earth Elemental -(Conjuration/Summoning) - -Level: 5 -Range: Visual range of the caster -Duration: 1 turn/level -Casting Time: 9 -Area of Effect: Special -Saving Throw: None - -This spell allows the caster to summon an 8-HD elemental from the Elemental Plane of Earth and bind it to will. This elemental will fight on behalf of the caster until the spell duration expires or the elemental is destroyed.~ - @3202 = ~Earth Elemental~ - @3210 = ~Conjure Air Elemental~ - @3211 = ~Conjure Air Elemental -(Conjuration/Summoning) - -Level: 5 -Range: Visual range of the caster -Duration: 1 turn/level -Casting Time: 9 -Area of Effect: Special -Saving Throw: None - -This spell allows the caster to summon an 8-HD elemental from the Elemental Plane of Air and bind it to will. This elemental will fight on behalf of the caster until the spell duration expires or the elemental is destroyed.~ - @3212 = ~Air Elemental~ - @3220 = ~Conjure Water Elemental~ - @3221 = ~Conjure Water Elemental -(Conjuration/Summoning) - -Level: 5 -Range: Visual range of the caster -Duration: 1 turn/level -Casting Time: 9 -Area of Effect: Special -Saving Throw: None - -This spell allows the caster to summon an 8-HD elemental from the Elemental Plane of Water and bind it to will. This elemental will fight on behalf of the caster until the spell duration expires or the elemental is destroyed.~ - @3222 = ~Water Elemental~ - @3230 = ~Antimagic Shell~ - @3231 = ~Antimagic Shell -(Abjuration) - -Level: 6 -Range: 0 -Duration: 1 turn/level -Casting Time: 1 -Area of Effect: The caster -Saving Throw: None - -This spell surrounds the caster with an invisible barrier that moves with . This barrier makes the wizard immune to any magical attacks, but it prevents from casting spells. - -Antimagic Shell also dispels deafness and feeblemindedness in the caster.~ - @3240 = ~Lich Touch~ - @3241 = ~Lich Touch -(Necromancy) - -Level: 6 -Range: Touch -Duration: 1 round/level -Casting Time: 6 -Area of Effect: The caster -Saving Throw: Special - -This spell confers the powers of a lich's touch and a lich's immunities upon the caster. The wizard gains immunity to paralysis and fear while the spell is in effect, and hands glow with an unearthly blue radiance that does 1d10 cold damage to a target and paralyzes them unless a Save vs. Paralysis is made. This spell has no effect on undead.~ - @3250 = ~Monster Summoning IV~ - @3251 = ~Monster Summoning IV -(Conjuration/Summoning) - -Level: 6 -Range: 20 ft. -Duration: 5 rounds + 1 round/level -Casting Time: 6 -Area of Effect: Special -Saving Throw: None - -With the casting of this spell the wizard summons 1d3 4th-level monsters. These appear within spell range and can be commanded to attack the caster's opponents until the spell duration expires or the monsters are slain.~ - @3252 = ~Yeti~ - @3260 = ~Otiluke's Freezing Sphere~ - @3261 = ~Otiluke's Freezing Sphere -(Alteration, Evocation) - -Level: 6 -Range: Visual range of the caster -Duration: Instant -Casting Time: 6 -Area of Effect: 1 creature -Saving Throw: Neg. - -This spell fires an orb of cold at a creature that inflicts 1d4+2 points of cold damage per level of the caster. If the target makes its Save vs. Spell, however, they have dodged the orb and avoided all damage.~ - @3270 = ~Shades~ - @3271 = ~Shades -(Illusion/Phantasm) - -Level: 6 -Range: Visual range of the caster -Duration: 1 round/level -Casting Time: 6 -Area of Effect: Special -Saving Throw: None - -Shades is similar to Shadow Monsters and Demi-Shadow Monsters-it allows the caster to shape material from the Demiplane of Shadow into illusionary creatures. These shadows are tougher than the shadows summoned by Shadow Monsters and Demi-Shadow Monsters, and they will obey the caster until the spell expires or they are slain.~ - @3272 = ~Umber Hulk~ - @3273 = ~Umber Hulk Gaze~ - @3280 = ~Darts of Bone~ - @3281 = ~Darts of Bone -(Necromancy) - -Level: 6 -Range: 0 -Duration: 5 rounds -Casting Time: 5 -Area of Effect: The caster -Saving Throw: None - -This spell creates nine darts that can be used by the caster and cannot be unequipped so long as the spell is in effect. The darts are +3, do 1d4+3 missile damage, and a creature struck by a dart must save vs. Death or take 2d6 magic damage and have its Strength reduced by 3 for 5 rounds. Strength reduction is noncumulative, and failing a save while the reduction is in effect will not extend its duration. The caster's weapon proficiency with darts (or lack thereof) has no effect on the darts' chances to hit a target.~ - @3282 = ~Dart of Bone +3~ - @3290 = ~Soul Eater~ - @3291 = ~Soul Eater -(Necromancy) - -Level: 6 -Range: Visual range of the caster -Duration: Instant -Casting Time: 5 -Area of Effect: 7-ft. radius -Saving Throw: None - -This spell deals 3d8 magic damage to all living creatures within a 14-ft. radius. Any creatures that die as a result of this damage are obliterated, and their essence is transformed into a 3-Hit-Dice skeleton under control of the caster. Also, for each creature that dies in this manner, the caster receives a +1 bonus to Strength, Dexterity, and Constitution for 1 turn. Soul Eater has no effect on undead, constructs, and elemental creatures.~ - @3300 = ~Trollish Fortitude~ - @3301 = ~Trollish Fortitude -(Necromancy) - -Level: 6 -Range: 0 -Duration: 2 turns -Casting Time: 6 -Area of Effect: The caster -Saving Throw: None - -This spell imbues the caster with the resilience of a troll, allowing the caster to regenerate 5 Hit Points per round up to maximum Hit Points.~ - @3310 = ~Monster Summoning V~ - @3311 = ~Monster Summoning V -(Conjuration/Summoning) - -Level: 7 -Range: 20 ft. -Duration: 6 rounds + 1 round/level -Casting Time: 7 -Area of Effect: Special -Saving Throw: None - -With the casting of this spell the wizard summons 1d3 5th-level monsters. These appear within spell range and can be commanded to attack the caster's opponents until the spell duration expires or the monsters are slain.~ - @3312 = ~Ju-ju Zombie~ - @3313 = ~Minotaur~ - @3320 = ~Malavon's Rage~ - @3321 = ~Malavon's Rage -(Evocation) - -Level: 7 -Range: 0 -Duration: Instant -Casting Time: 1 -Area of Effect: 7-ft. radius -Saving Throw: 1/2 - -Malavon's Rage was created by the dark elf sorcerer Malavon. It shoots darts of pure energy out from the caster's body in all directions, harming friend and foe alike. The small wedges of magic do 20d4 points of piercing damage (save vs. Spell for half) to everything caught in their path. This spell is especially useful when a wizard is surrounded by enemies.~ - @3330 = ~Acid Storm~ - @3331 = ~Acid Storm -(Evocation) - -Level: 7 -Range: Visual range of the caster -Duration: 1 round/level -Casting Time: 7 -Area of Effect: 12-ft. radius -Saving Throw: 1/2 - -This spell unleashes an acidic downpour on the area of effect, doing 1d4 points of acid damage each round for the first three rounds, 1d6 points for the next three rounds, and 1d8 points for each round thereafter. Moving out of the area of effect does not stop the damage-the acid adheres to the skin, and any creatures in the area of effect when Acid Storm is cast continue to suffer acid damage as long as the spell duration lasts. Creatures make a Save vs. Spell every round after they have been hit by the cloud-if successful, they only take half damage (for that round only).~ - @3340 = ~Seven Eyes~ - @3341 = ~Seven Eyes -(Abjuration) - -Level: 7 -Range: 0 -Duration: 2 turns -Casting Time: 7 -Area of Effect: The caster -Saving Throw: None - -This spell conjures forth seven magical orbs that float in a ring above the caster's head. Each eye has a defensive and offensive ability, though once either one is used, the eye will lose its power. The powers of each eye are described below. - -Eye of the Mind: This orb protects the caster against mental attacks such as charm, emotion, and fear. The eye can be expended as the 1st-level wizard spell Charm Person, bringing a humanoid creature under the caster's control for 1 turn (Save vs. Spell negates). - -Eye of the Sword: This eye deflects the first physical damaging attack that strikes the caster. The eye may be expended as the 1st-level wizard spell Magic Missile, creating up to 5 missiles (one for every two levels of experience besides the first) that each strike a target for 1d4+1 magic damage. - -Eye of the Mage: This eye absorbs one manifestation of fire, electrical, cold, or acid damage. The eye can also be expended as the 3rd-level wizard spell Lightning Bolt, dealing 1d6 electrical damage per level (capped at 10d6) to all creatures in its path. - -Eye of Venom: This eye halts any one attack or effect that could poison the caster. The eye can also be expended as the 4th-level priest spell Poison, dealing 20 points of damage to one creature over a period of 20 seconds (Save vs. Poison negates). - -Eye of the Spirit: This eye blocks one instant-death magic attack (Death Spell; Finger of Death; Power Word, Kill; Slay Living; Destruction). The wizard may instead choose to expend the eye's power as the 2nd-level wizard spell Ray of Enfeeblement, dropping a target's Strength to 5 (Save vs. Spell negates). - -Eye of Fortitude: This eye blocks one stunning, deafness, blindness, or silence effect. It may alternatively be expended as the 4th-level wizard spell Shout, dealing 4d6 magic damage and deafening creatures within a 35-ft. cone (Save vs. Spell halves damage and negates deafness). - -Eye of Stone: This eye shields the caster from a single petrification attack. It can also be used as the 3rd-level wizard spell Hold Person, rendering humanoids of man-size or smaller immobile for 1 round/level (Save vs. Spell negates).~ - @3342 = ~Eye of the Mind~ - @3343 = ~Eye of the Mind - -This orb protects the caster against mental attacks such as charm, emotion, and fear. - -The eye can be expended as the 1st-level wizard spell Charm Person, bringing a humanoid creature under the caster's control for 1 turn (Save vs. Spell negates).~ - @3344 = ~Eye of the Sword~ - @3345 = ~Eye of the Sword - -This eye deflects the first physical damaging attack that strikes the caster. - -The eye may be expended as the 1st-level wizard spell Magic Missile, creating up to 5 missiles (one for every two levels of experience besides the first) that each strike a target for 1d4+1 magic damage.~ - @3346 = ~Eye of the Mage~ - @3347 = ~Eye of the Mage - -This eye absorbs one manifestation of fire, electrical, cold, or acid damage. - -The eye can also be expended as the 3rd-level wizard spell Lightning Bolt, dealing 1d6 electrical damage per level (capped at 10d6) to all creatures in its path.~ - @3348 = ~Eye of Venom~ - @3349 = ~Eye of Venom - -This eye halts any one attack or effect that could poison the caster. - -The eye can also be expended as the 4th-level priest spell Poison, dealing 20 points of damage to one creature over a period of 20 seconds (Save vs. Poison negates).~ - @3350 = ~Eye of the Spirit~ - @3351 = ~Eye of the Spirit - -This eye blocks one instant-death magic attack (Death Spell; Finger of Death; Power Word, Kill; Slay Living; Destruction). - -The wizard may instead choose to expend the eye's power as the 2nd-level wizard spell Ray of Enfeeblement, dropping a target's Strength to 5 (Save vs. Spell negates).~ - @3352 = ~Eye of Fortitude~ - @3353 = ~Eye of Fortitude - -This eye blocks one stunning, deafness, blindness, or silence effect. - -It may alternatively be expended as the 4th-level wizard spell Shout, dealing 4d6 magic damage and deafening creatures within a 35-ft. cone (Save vs. Spell halves damage and negates deafness).~ - @3354 = ~Eye of Stone~ - @3355 = ~Eye of Stone - -This eye shields the caster from a single petrification attack. - -It can also be used as the 3rd-level wizard spell Hold Person, rendering humanoids of man-size or smaller immobile for 1 round/level (Save vs. Spell negates).~ - @3356 = ~Eye of Stone blocks effect and dissipates.~ - @3357 = ~Eye of Fortitude blocks effect and dissipates.~ - @3358 = ~Eye of the Spirit blocks effect and dissipates.~ - @3359 = ~Eye of Venom blocks effect and dissipates.~ - @3360 = ~Eye of the Mage blocks effect and dissipates.~ - @3361 = ~Eye of the Sword blocks effect and dissipates.~ - @3362 = ~Eye of the Mind blocks effect and dissipates.~ - @3370 = ~Suffocate~ - @3371 = ~Suffocate -(Alteration) - -Level: 7 -Range: Visual range of the caster -Duration: 4 rounds -Casting Time: 7 -Area of Effect: 7-ft. radius -Saving Throw: Special - -This spell draws the breath out of all creatures within the area of effect. Creatures that do not breathe are unaffected. Suffocating creatures suffer -4 to Armor Class, -4 to hit, -6 to Dexterity, one less attack per round, half movement rate, and take 4d8 points of magic damage per round. A successful Saving Throw negates all effects but 2d8 points of damage for one round. The effects begin to fade when the creature moves out of the area of effect, although it can take a round for a character to catch their second wind.~ - @3380 = ~Monster Summoning VI~ - @3381 = ~Monster Summoning VI -(Conjuration/Summoning) - -Level: 8 -Range: 20 ft. -Duration: 7 rounds + 1 round/level -Casting Time: 8 -Area of Effect: Special -Saving Throw: None - -With the casting of this spell the wizard summons 1d3 6th-level monsters. These appear within spell range and can be commanded to attack the caster's opponents until the spell duration expires or the monsters are slain.~ - @3382 = ~Salamander~ - @3383 = ~Frost Salamander~ - @3390 = ~Mind Blank~ - @3391 = ~Mind Blank -(Abjuration) - -Level: 8 -Range: 0 -Duration: 24 hours -Casting Time: 1 -Area of Effect: The caster -Saving Throw: None - -In the interests of one's self-control and privacy, Mind Blank shields a creature's mind from almost any mental effect-charm, maze, feeblemind, confusion, fear, intoxication, berserk, hold, and petrification.~ - @3400 = ~Great Shout~ - @3401 = ~Great Shout -(Invocation) - -Level: 8 -Range: 0 -Duration: Instant -Casting Time: 1 -Area of Effect: 17-ft. cone with 15-deg. arc -Saving Throw: 1/2 - -Upon uttering the Great Shout, the caster releases a stunning force from mouth in a 17-ft. cone. The Great Shout is extremely taxing and dangerous to the user. The shout drains 2d4 Hit Points from the caster, and must make a Save vs. Spell or fall unconscious for 1 turn. Creatures 5 Hit Dice and under caught within the Great Shout instantly die. All other creatures within the area of effect must save vs. Spell. Those who fail the save are stunned for 2 rounds, deafened for 4 rounds, and suffer 4d12 points of magic damage. Those who make the save are stunned for 1 round, deafened for 2 rounds, and suffer 2d12 points of magic damage.~ - @3410 = ~Iron Body~ - @3411 = ~Iron Body -(Alteration) - -Level: 8 -Range: 0 -Duration: 2 turns -Casting Time: 8 -Area of Effect: The caster -Saving Throw: None - -This spell transforms the caster's body into living iron, granting several powerful resistances and abilities. While the spell is in effect, the caster is 100% resistant to electricity and poison, 50% resistant to fire, and 25% resistant to crushing damage. Spells that affect respiration or the physiology of the caster are ignored. In addition, the caster's Strength is raised to 25, and the caster can attack twice per round with iron fists for 2d4 points of damage plus appropriate Strength bonuses. - -Unfortunately, the caster's movement becomes slow and awkward, setting movement rate to 25% of normal, and cannot cast spells while Iron Body is in effect.~ - @3412 = ~Iron Fist~ - @3420 = ~Monster Summoning VII~ - @3421 = ~Monster Summoning VII -(Conjuration/Summoning) - -Level: 9 -Range: 20 ft. -Duration: 8 rounds + 1 round/level -Casting Time: 9 -Area of Effect: Special -Saving Throw: None - -With the casting of this spell, the wizard summons 1d2 7th- or 8th-level monsters. These appear within spell range and can be commanded to attack the caster's opponents until the spell duration expires or the monsters are slain.~ - @3422 = ~Boneguard Skeleton~ - @4010 = ~Curse~ - @4011 = ~Curse -(Conjuration/Summoning) - -Level: 1 -Sphere: All -Range: Visual range of the caster -Duration: 6 rounds -Casting Time: 9 -Area of Effect: 15-ft. radius -Saving Throw: None - -When uttering the Curse spell, the caster lowers the morale of enemy creatures and any Saving Throws and attack rolls they make by 1. At the instant the spell is completed, it affects all creatures in a 15-ft. radius centered on the point selected by the caster. Affected creatures leaving the area are still subject to the spell's effect; those entering the area after the casting is completed are not.~ - @4020 = ~Cause Light Wounds~ - @4021 = ~Cause Light Wounds -(Necromancy) - -Level: 1 -Sphere: Healing -Range: Touch -Duration: Instant -Casting Time: 5 -Area of Effect: 1 creature -Saving Throw: 1/2 - -By casting this spell and touching a creature, the priest deals 8 points of damage (save vs. Spell for half) to the creature's body. This spell has no effect on undead, constructs, or extraplanar creatures. It cannot be cast by good-aligned characters.~ - @4030 = ~Sunscorch~ - @4031 = ~Sunscorch -(Invocation) - -Level: 1 -Sphere: Sun -Range: Visual range of the caster -Duration: Instant -Casting Time: 4 -Area of Effect: 1 creature -Saving Throw: Special - -When this spell is cast, a brilliant ray of scorching heat slants down from the sky and strikes one target of the caster's choice. Any creature struck by the ray takes 1d6 points of damage, plus 1 point per level of the caster; however, if the target is an undead creature or a monster vulnerable to bright light, the damage is 1d6, plus 2 points per level of the caster. In addition to sustaining damage, victims are also blinded for 3 rounds. The victim is allowed a Save vs. Spell for half damage and to avoid the blindness.~ - @4040 = ~Cure Moderate Wounds~ - @4041 = ~Cure Moderate Wounds -(Necromancy) - -Level: 2 -Sphere: Healing -Range: Touch -Duration: Instant -Casting Time: 5 -Area of Effect: 1 creature -Saving Throw: None - -A stronger version of the 1st-level priest spell Cure Light Wounds, Cure Moderate Wounds heals 11 Hit Points and cures intoxication. This spell has no effect on undead, constructs, or extraplanar creatures.~ - @4042 = ~This spell heals the character by 11 Hit Points.~ - @4050 = ~Alicorn Lance~ - @4051 = ~Alicorn Lance -(Invocation) - -Level: 2 -Sphere: Combat -Range: Visual range of the caster -Duration: Instant -Casting Time: 5 -Area of Effect: 1 creature -Saving Throw: Special - -This spell creates a silver-hued, partially ethereal lance shaped in the form of an alicorn (a unicorn horn). The caster chooses a target, and the alicorn lance instantaneously fires at it, inflicting 3d6 points of piercing damage with a Save vs. Spell for half. Although the alicorn lance dissipates after it strikes, it always leaves a silvery radiance around the target that makes it easier to see and hit, giving it a -2 penalty to its Armor Class for 3 rounds.~ - @4052 = ~Outlined in a Silvery Radiance (AC penalty of 2)~ - @4060 = ~Beast Claw~ - @4061 = ~Beast Claw -(Alteration) - -Level: 2 -Sphere: Combat -Range: 0 -Duration: 1 turn -Casting Time: 5 -Area of Effect: The caster -Saving Throw: None - -This spell transforms the caster's arms into the claws of a mighty beast, giving the caster 18/72 Strength and the ability to rake an opponent for 2d4 (plus Strength bonus) points of slashing damage. The caster can attack twice per round with the beast claws, with a +2 bonus to hit.~ - @4070 = ~Cause Moderate Wounds~ - @4071 = ~Cause Moderate Wounds -(Necromancy) - -Level: 2 -Sphere: Healing -Range: Touch -Duration: Instant -Casting Time: 5 -Area of Effect: 1 creature -Saving Throw: 1/2 - -By casting this spell and touching a creature, the priest deals 11 points of damage (save vs. Spell for half) to the creature's body. This spell has no effect on undead, constructs, or extraplanar creatures. It cannot be cast by good-aligned characters.~ - @4080 = ~Prayer~ - @4081 = ~Prayer -(Conjuration/Summoning) - -Level: 3 -Sphere: Combat -Range: 0 -Duration: 1 round/level -Casting Time: 6 -Area of Effect: 30-ft. radius -Saving Throw: None - -Prayer bestows favor on the priest and allies, and curses their enemies. All attacks, damage, and Saving Throws by friendly characters gain a +1 bonus, while enemy attacks, damage rolls, and saves get a -1 penalty. Any creatures within the area of effect when the spell is cast will continue to be affected by the spell when they leave the area, so if the warriors want to chase down that fleeing goblin, the effects of the Prayer will follow them.~ - @4082 = ~Combat Penalties~ - @4083 = ~Combat Bonuses~ - @4090 = ~Cause Disease~ - @4091 = ~Cause Disease -(Necromancy) - -Level: 3 -Sphere: Healing -Range: Touch -Duration: 8 hours -Casting Time: 9 -Area of Effect: 1 creature -Saving Throw: Neg. - -This spell afflicts one creature the priest touches with a disease that saps the target of 5d4 points of Strength. A successful Save vs. Spell negates the effects. This spell has no effect on undead, constructs, or extraplanar creatures. It cannot be cast by good-aligned characters.~ - @4100 = ~Exaltation~ - @4101 = ~Exaltation -(Abjuration) - -Level: 3 -Sphere: Healing -Range: Touch -Duration: 1 turn -Casting Time: 9 -Area of Effect: 1 creature -Saving Throw: None - -This spell enables a priest to aid and protect any one being other than the priest. By touch, the caster removes the effects of fear, sleep, feeblemindedness, unconsciousness, and intoxication, as well as berserk and confused states of mind. In addition, the recipient is protected against spells and other attacks that cause these effects for the duration of the spell.~ - @4110 = ~Moonblade~ - @4111 = ~Moonblade -(Invocation) - -Level: 3 -Sphere: Combat, Sun -Range: 0 -Duration: 2 turns -Casting Time: 6 -Area of Effect: The caster -Saving Throw: None - -This spell summons forth a silent, weightless sword-like construct made of moonlight that extends four feet from the caster's hand. The moonblade is considered a +4 weapon for determining what creatures it can hit, though the bonus does not apply to attack rolls made with it. In addition, due to the insubstantial nature of the moonblade, melee bonuses from Strength do not apply. - -The strike of a moonblade drains a target's vitality, inflicting 1d12+4 points of magic damage, plus an additional 1d12 points to undead, who are particularly susceptible. A successful strike also temporarily scrambles magic, causing any spells the target casts in the next round to fail.~ - @4120 = ~Circle of Bones~ - @4121 = ~Circle of Bones -(Necromancy) - -Level: 3 -Sphere: Guardian, Creation -Range: 0 -Duration: 3 rounds -Casting Time: 3 -Area of Effect: 3-ft. radius -Saving Throw: None - -This spell conjures forth a barrier of floating bones that spin rapidly around the caster, who cannot move for the duration of the spell. Anyone entering the path of the bones takes 1d6 crushing damage and 1d6 slashing damage per round. Circle of Bones cannot be cast by good-aligned characters.~ - @4130 = ~Spike Growth~ - @4131 = ~Spike Growth -(Alteration) - -Level: 3 -Sphere: Elemental Earth -Range: Visual range of the caster -Duration: 1 turn -Casting Time: 6 -Area of Effect: 15-ft. radius -Saving Throw: None - -This spell transforms the surrounding terrain into spiky plants. Any creature entering the area takes 1d4 points of piercing damage and 1d4 points of slashing damage every round until the spell expires.~ - @4140 = ~Cloudburst~ - @4141 = ~Cloudburst -(Invocation) - -Level: 3 -Sphere: Elemental Water -Range: Visual range of the caster -Duration: 2 rounds -Casting Time: 6 -Area of Effect: 17-ft. radius -Saving Throw: None - -This spell brings forth a magical rain that saturates the area of effect. All cold- and fire-dwelling creatures take 2d3 points of magic damage per round. In addition, all creatures in the area have a 50% chance per round of being struck by bolts of lightning that deal 2d6 electrical damage, with a Save vs. Spell for half. Flame Blade, Shroud of Flame, and salamander auras are extinguished by Cloudburst.~ - @4150 = ~Mold Touch~ - @4151 = ~Mold Touch -(Alteration) - -Level: 3 -Sphere: Plant -Range: Touch -Duration: Special -Casting Time: 6 -Area of Effect: 10-ft. radius -Saving Throw: Special - -This spell infects the creature the caster touches with a rapidly spreading brown mold. If the infected creature fails a Save vs. Spell, the infection is severe and the creature takes magic damage as follows: - -1st round: 4d6 damage -2nd round: 3d6 damage -3rd round: 2d6 damage -4th round: 1d6 damage - -If the Saving Throw is successful, the damage is reduced as follows: - -1st round: 2d6 damage -2nd round: 1d6 damage -3rd round: 1d6 damage - -Each round after the first, the nearest creature within 10 ft. of the victim must make a Save vs. Spell or be infected by the mold at full strength. This process continues until the mold fails to infect a suitable host in time. Creatures already under the effects of the mold cannot contract it again. The brown mold quickly dies once the spell expires.~ - @4160 = ~Storm Shell~ - @4161 = ~Storm Shell -(Abjuration) - -Level: 3 -Sphere: Protection, Weather -Range: 0 -Duration: 1 turn -Casting Time: 6 -Area of Effect: The caster -Saving Throw: None - -This spell surrounds the caster with a bright sphere of disruptive energy that moves with . The storm shell increases the caster's resistance to fire, cold, and electrical damage by 50%.~ - @4170 = ~Cause Medium Wounds~ - @4171 = ~Cause Medium Wounds -(Necromancy) - -Level: 3 -Sphere: Healing -Range: Touch -Duration: Instant -Casting Time: 5 -Area of Effect: 1 creature -Saving Throw: 1/2 - -By casting this spell and touching a creature, the priest deals 14 points of damage (save vs. Spell for half) to the creature's body. This spell has no effect on undead, constructs, or extraplanar creatures. Cause Medium Wounds cannot be cast by good-aligned characters.~ - @4180 = ~Favor of Ilmater~ - @4181 = ~Favor of Ilmater -(Necromancy) - -Level: 3 -Sphere: Necromantic, Protection -Range: 30 ft. -Duration: Instant -Casting Time: 6 -Area of Effect: 1 creature -Saving Throw: None - -By invoking this spell, the caster switches own life force with that of the recipient, exchanging all physical injuries. The spell will only function if the caster has more Hit Points than the target before the switch is attempted. This switch is permanent until the caster uses normal methods to heal the damage. The exchange can be done from a distance so long as the spell range is not exceeded. Only the Hit Points are exchanged; the caster cannot take on other conditions from the target such as disease, poison, intoxication, and similar afflictions. - -This spell cannot be cast by evil-aligned characters. It has no effect on undead, constructs, or extraplanar creatures.~ - @4190 = ~Giant Insect~ - @4191 = ~Giant Insect -(Alteration) - -Level: 4 -Sphere: Animal -Range: Visual range of the caster -Duration: 8 hours -Casting Time: 7 -Area of Effect: Special -Saving Throw: None - -This spell summons 2-3 boring beetles or bombardier beetles to the caster's side. The beetles will obey the caster until the spell expires or they are slain.~ - @4192 = ~Bombardier Beetle~ - @4193 = ~Releases Acidic Vapor~ - @4200 = ~Produce Fire~ - @4201 = ~Produce Fire -(Alteration) - -Level: 4 -Sphere: Elemental Fire -Range: Visual range of the caster -Duration: 1 round -Casting Time: 7 -Area of Effect: 4-ft. radius -Saving Throw: None - -When cast, flames erupt from the target point, dealing 1d4 points of fire damage plus 1 point per level of the caster to all creatures within the spell's radius. Creatures will take damage once per round regardless of when they enter the area of effect.~ - @4210 = ~Static Charge~ - @4211 = ~Static Charge -(Alteration) - -Level: 4 -Sphere: Weather -Range: 0 -Duration: 1 turn/level -Casting Time: 9 -Area of Effect: Visual range of the caster -Saving Throw: 1/2 - -Static Charge is similar to Call Lightning, except it can be used indoors. This spell allows the caster to generate a static charge around any creature within the area of effect, dealing 2d8 points of electrical damage plus an additional 1d8 points per level of the caster (save vs. Spell for half). The charge keeps going off once every turn for the duration of the spell.~ - @4212 = ~Discharge of static electricity~ - @4220 = ~Recitation~ - @4221 = ~Recitation -(Abjuration, Invocation/Evocation) - -Level: 4 -Sphere: Combat -Range: 0 -Duration: 1 round/level -Casting Time: 7 -Area of Effect: 25-ft. radius -Saving Throw: None - -By reciting a sacred passage or declaration, the priest invokes deity's blessing upon self and allies while sowing confusion and weakness among enemies. The priest's allies gain a +2 bonus to their attack rolls and Saving Throws, and the priest's enemies receive a -2 penalty to the same. Recitation does not nullify a Prayer spell-the two can be cast in tandem, and the effects are cumulative.~ - @4230 = ~Blood Rage~ - @4231 = ~Blood Rage -(Alteration) - -Level: 4 -Sphere: Combat -Range: Visual range of the caster -Duration: 2 turns -Casting Time: 7 -Area of Effect: 1 creature -Saving Throw: None - -This spell works only on player characters or allied creatures. When cast, the target of this spell goes berserk, attacking the nearest creature until that creature is dead, then moving on to the next target. While under Blood Rage, the target is immune to charm, sleep, fear, hold, stunning, confusion, emotion, symbol spells, and related effects. In addition, the target gains +2 to hit, +3 to damage, +2 to Strength, +10 to maximum Hit Points, and +2 to movement rate. The spell has several disadvantages, however: The Hit Points of the target are masked for the duration of the spell, and the target cannot benefit from any effect that heals Hit Points. At the end of the spell's duration, the target becomes fatigued and Strength drops to 3 for 2 turns. Blood Rage cannot affect-and cannot be cast by-creatures of lawful alignment.~ - @4240 = ~Cloud of Pestilence~ - @4241 = ~Cloud of Pestilence -(Alteration) - -Level: 4 -Sphere: Combat, Elemental Air -Range: Visual range of the caster -Duration: 4 rounds -Casting Time: 7 -Area of Effect: 12-ft. radius -Saving Throw: Neg. - -This spell transforms the air in a 12-ft. radius into sickening, grayish mists. The caster and non-living creatures are immune to the effects of the cloud. For every round of exposure to the disease-ridden air, a creature must save vs. Breath or suffer 3 points of magic damage, blindness, and the loss of 3 points of Strength and Dexterity. The blindness and ability score penalties last 1 turn. Cloud of Pestilence can only be cast by evil-aligned characters.~ - @4250 = ~Unfailing Endurance~ - @4251 = ~Unfailing Endurance -(Necromancy) - -Level: 4 -Sphere: Necromantic -Range: Touch -Duration: Instant -Casting Time: 9 -Area of Effect: 1 creature -Saving Throw: None - -This spell restores the stamina of the creature touched, eliminating any fatigue.~ - @4260 = ~Star Metal Cudgel~ - @4261 = ~Star Metal Cudgel -(Conjuration) - -Level: 4 -Sphere: Combat -Range: 0 -Duration: 3 turns -Casting Time: 7 -Area of Effect: The caster -Saving Throw: None - -This spell creates a meteoric iron magical club that deals 1d6+2 points of crushing damage, confers a +2 bonus to attack rolls, and is treated as a +4 weapon for purposes of what it can hit. Strength, proficiency, and specialization bonuses and penalties apply normally. The club deals an additional 2d6 points of crushing damage against unnatural creatures (undead, elementals, golems, outer-planar creatures, etc.).~ - @4270 = ~Smashing Wave~ - @4271 = ~Smashing Wave -(Invocation) - -Level: 4 -Sphere: Elemental Water -Range: 100 ft. -Duration: Instant -Casting Time: 9 -Area of Effect: Special -Saving Throw: Special - -This spell summons a 5-ft. wide wave of water that moves in the direction willed by the caster, striking all in its path with massive force. The wave deals 4d10 points of crushing damage; in addition, struck creatures may be either stunned (25% chance) or knocked unconscious (5% chance) for 2 rounds. If the creature struck makes a successful Save vs. Breath Weapon, the damage is reduced by half and the creature avoids being stunned or knocked unconscious.~ - @4280 = ~Thorn Spray~ - @4281 = ~Thorn Spray -(Alteration) - -Level: 4 -Sphere: Plant -Range: 30 ft. -Duration: Instant -Casting Time: 3 -Area of Effect: 17-ft. cone with 90-deg. arc -Saving Throw: 1/2 - -By means of this spell, the caster can cause a spray of barbs, spikes, thorns, and spines to spring forth from hand. The thorn spray covers a 17-ft.-long cone, inflicting 2d10 points of piercing damage to all creatures within the area of effect, or 1d10 points of damage if a Save vs. Death is successful.~ - @4290 = ~Wall of Moonlight~ - @4291 = ~Wall of Moonlight -(Invocation) - -Level: 4 -Sphere: Protection, Sun -Range: Visual range of the caster -Duration: 1 turn -Casting Time: 7 -Area of Effect: 8 ft. long, 2 ft. wide wall -Saving Throw: None - -This spell invokes a shimmering tapestry of blue-white force. This wall is intangible, requiring no physical anchor, and can easily be passed through. Evil creatures passing through the wall take 2d10 magic damage; evil undead creatures take 5d10. A creature that has passed through the wall can only take damage from it once.~ - @4300 = ~Righteous Wrath of the Faithful~ - @4301 = ~Righteous Wrath of the Faithful -(Enchantment/Charm) - -Level: 5 -Sphere: Combat -Range: 0 -Duration: 1 round/level -Casting Time: 8 -Area of Effect: 17-ft. radius -Saving Throw: None - -This spell bestows a form of divine madness upon the priest's allies, improving their combat skills. All the priest's allies in the area of effect gain a +1 to attack rolls and Saving Throws, plus 8 bonus Hit Points for the duration of the spell (these Hit Points can take a target beyond Hit Point maximum). Allies of the same alignment, however, gain an extra attack every round (canceling haste), a +2 bonus to their attack rolls, damage rolls, and Saving Throws, and immunity to charm and hold spells. Anyone affected by Righteous Wrath of the Faithful will suffer fatigue when the spell wears off.~ - @4310 = ~Spike Stones~ - @4311 = ~Spike Stones -(Alteration, Enchantment) - -Level: 5 -Sphere: Elemental Earth -Range: Visual range of the caster -Duration: 12 rounds -Casting Time: 6 -Area of Effect: 8-ft. radius -Saving Throw: Special - -This spell warps the surrounding rock, reshaping the terrain into spiked projections that blend into the background. Any creature entering the area takes 2d4 Hit Points of piercing damage per round and must make a Save vs. Spell or have its movement rate reduced by 30%.~ - @4320 = ~Shield of Lathander~ - @4321 = ~Shield of Lathander -(Conjuration) - -Level: 5 -Sphere: Guardian -Range: Touch -Duration: 2 rounds -Casting Time: 8 -Area of Effect: 1 creature -Saving Throw: None - -This spell grants the recipient immunity to damage for the duration of the spell. Evil creatures cannot be protected by a Shield of Lathander. This spell cannot be cast by evil-aligned characters.~ - @4330 = ~Undead Ward~ - @4331 = ~Undead Ward -(Necromancy) - -Level: 5 -Sphere: Wards -Range: 0 -Duration: 1 turn -Casting Time: 7 -Area of Effect: 10-ft. radius -Saving Throw: None - -This spell amplifies the influence a priest has over undead, though it is tied to the area surrounding the priest at the moment of its casting and does not move. Any undead creature entering the area of effect is affected as if turned by the priest that cast this spell. If the turning fails, the undead creature is immune to further turning attempts by the spell unless it leaves and reenters the area of effect.~ - @4340 = ~Animal Rage~ - @4341 = ~Animal Rage -(Enchantment) - -Level: 5 -Sphere: Combat -Range: Touch -Duration: 15 rounds -Casting Time: 8 -Area of Effect: 1 creature -Saving Throw: None - -This spell imbues the target creature with animal ferocity. The target creature gains a Strength score of 19, +20 Hit Points, +20% movement rate, and a +2 bonus to all Saving Throws. The target loses the ability to cast spells while Animal Rage is in effect; when enemies are within sight, immediately attacks in melee, using whatever is in hand. While this spell is in effect, there is a 5% chance per round that the target will go berserk, attacking friend and foe alike.~ - @4350 = ~Mass Cause Light Wounds~ - @4351 = ~Mass Cause Light Wounds -(Necromancy) - -Level: 5 -Sphere: Healing -Range: 0 -Duration: Instant -Casting Time: 5 -Area of Effect: 15-ft. radius -Saving Throw: 1/2 - -By casting this spell, the priest deals 1d8 + 1/level points of damage to nearby enemies. A successful Save vs. Spell halves the damage. This spell has no effect on undead, constructs, or extraplanar creatures. It can only be cast by evil-aligned characters.~ - @4360 = ~Entropy Shield~ - @4361 = ~Entropy Shield -(Abjuration) - -Level: 6 -Sphere: Protection -Range: 0 -Duration: 1 round/level -Casting Time: 9 -Area of Effect: The caster -Saving Throw: None - -When cast, this spell surrounds the caster with a defensive maelstrom of energy that blocks or deflects many attacks. This gives the priest a +6 bonus to Armor Class, a +2 bonus to Saving Throws, and +50% resistance to electricity, fire, cold, and acid. The priest is also immune to Flamestrike and all missile-based attacks, including missiles created by spells such as Magic Missile.~ - @4370 = ~Whirlwind~ - @4371 = ~Whirlwind -(Invocation) - -Level: 6 -Sphere: Elemental Air -Range: Visual range of the caster -Duration: Special -Casting Time: 9 -Area of Effect: Special -Saving Throw: Special - -This spell creates a small whirlwind within the caster's sight. The whirlwind will fly around randomly, harming friend and foe alike. The caster is immune to own spell, and elementals and other huge creatures are also unaffected. If a creature is caught in the path of the whirlwind, it takes 2d8 crushing damage, 2d8 slashing damage, and must make a Save vs. Breath Weapon or be stunned for 2 rounds. Creatures with 2 or fewer Hit Dice are automatically killed by this spell. A maximum of 8 targets can be affected, after which the whirlwind will dissipate.~ - @4380 = ~Spiritual Wrath~ - @4381 = ~Spiritual Wrath -(Invocation) - -Level: 6 -Sphere: Combat -Range: Visual range of the caster -Duration: Instant -Casting Time: 2 -Area of Effect: Special -Saving Throw: 1/2 - -Upon completion of this spell, the priest becomes a focus of spiritual energy, which then shoots out from the caster in four directions, like lightning bolts. All creatures in the bolts' paths take 4d10 points of magic damage (save vs. Spell for half). Creatures of the same moral alignment (good, neutral, evil) as the caster are unaffected by the spell.~ - @4390 = ~Symbol, Pain~ - @4391 = ~Symbol, Pain -(Conjuration/Summoning) - -Level: 7 -Sphere: Guardian -Range: Visual range of the caster -Duration: 11 turns -Casting Time: 3 -Area of Effect: 15-ft. radius -Saving Throw: Neg. - -All enemies within 15 ft. of the symbol of pain at the moment it is invoked must make a Save vs. Spell. Those who fail their Saving Throws are overwhelmed by pain, suffering a -4 penalty to their attack rolls, a -2 penalty to their Dexterity scores, and a -2 penalty to their Armor Class.~ - @4392 = ~Wracking Pains~ - @4393 = ~Pain~ - @4400 = ~Symbol, Hopelessness~ - @4401 = ~Symbol, Hopelessness -(Conjuration/Summoning) - -Level: 7 -Sphere: Guardian -Range: Visual range of the caster -Duration: 2 turns -Casting Time: 3 -Area of Effect: 15-ft. radius -Saving Throw: Neg. - -Symbol, Hopelessness is a powerful enchantment that allows the priest to inscribe a symbol on the ground or any other surface. The symbol will remain there until an opponent comes too close, at which point it will explode, causing all enemies within the area of effect to make a Save vs. Spell with a -2 penalty or stand in place, overwhelmed by dejection and surrender. They will make no move to defend themselves from attack. This spell nullifies Emotion, Hope within the area of effect at the time of casting.~ - @4410 = ~Impervious Sanctity of Mind~ - @4411 = ~Impervious Sanctity of Mind -(Abjuration) - -Level: 7 -Sphere: Protection -Range: 0 -Duration: 1 turn/level -Casting Time: 9 -Area of Effect: The caster -Saving Throw: None - -This spell steels the caster's mind against any outside influence. Charm, confusion, fear, feeblemindedness, hold, sleep, maze, berserk, and intoxication will not affect the caster as long as this spell is in effect.~ - @4420 = ~Destruction~ - @4421 = ~Destruction -(Necromancy) - -Level: 7 -Sphere: Healing -Range: Touch -Duration: Instant -Casting Time: 9 -Area of Effect: The caster -Saving Throw: Special - -This spell instantly destroys a target, blasting it into small chunks. The victim is allowed a Save vs. Death at a penalty of -4; if successful, the target takes 8d6 points of magic damage instead of being destroyed. Destruction can only be cast by evil characters. Note that a character struck with a Destruction spell cannot be raised from the dead with a Raise Dead or Resurrection spell.~ - @4430 = ~Greater Shield of Lathander~ - @4431 = ~Greater Shield of Lathander -(Conjuration) - -Level: 7 -Sphere: Guardian -Range: Touch -Duration: 3 rounds -Casting Time: 9 -Area of Effect: 1 creature -Saving Throw: None - -This spell grants the recipient 100% Magic Resistance and immunity to damage for the duration of the spell. Evil creatures cannot be protected by a Greater Shield of Lathander. This spell can only be cast by good-aligned characters.~ - @4440 = ~Mist of Eldath~ - @4441 = ~Mist of Eldath -(Invocation) - -Level: 7 -Sphere: Elemental -Range: Visual range of the caster -Duration: Instant -Casting Time: 9 -Area of Effect: 7-ft. radius -Saving Throw: None - -This spell blankets the area of effect with a silver-blue mist-any creature within the mist will be cured of disease and poison and healed 25 Hit Points.~ - @4450 = ~Stalker~ - @4451 = ~Stalker -(Conjuration) - -Level: 7 -Sphere: Plant -Range: Visual range of the caster -Duration: 8 hours -Casting Time: 9 -Area of Effect: Special -Saving Throw: None - -This spell creates two 11-HD shambling mounds. These creatures willingly aid the caster in combat or whatever other duties they are assigned and have the capability to carry out.~ - @4452 = ~Shambling Mound~ - @4460 = ~Energy Drain~ - @4461 = ~Energy Drain -(Necromancy) - -Level: 7 -Sphere: Necromantic -Range: Touch -Duration: Permanent -Casting Time: 3 -Area of Effect: 1 creature -Saving Throw: None - -Casting this spell opens a channel between the caster's plane and the Negative Energy Plane. The caster acts as a conduit between the two planes, sucking life from a victim and transferring it to the Negative Energy Plane, draining of 2 levels of experience. The target of this spell loses levels, Hit Dice, Hit Points, and abilities permanently. These levels can only be restored by a priest's Restoration spell. This spell has no effect on undead, constructs, or extraplanar creatures. It can only be cast by evil-aligned characters.~ - @4462 = ~Two Levels Drained~ - @5001 = ~The Ballad of Three Heroes - Combat Bonuses~ - @5002 = ~The Ballad of Three Heroes~ - @5003 = ~All allies gain +1 to hit, +1 to damage, and +1 to all their Saving Throws.~ - @5004 = ~The Tale of Curran Strongheart - Immunity Fear~ - @5005 = ~The Tale of Curran Strongheart~ - @5006 = ~All allies gain immunity to fear effects for as long as the song lasts, and any fear effects currently on them are removed.~ - @5007 = ~Tymora's Melody - Luck and Skill Bonuses~ - @5008 = ~Tymora's Melody~ - @5009 = ~All allies gain +1 to luck, +3 to Saving Throws, +10 to lore, and a +10% bonus to all of their thieving skills.~ - @5010 = ~The Song of Kaudies - Resistant to Sound Attacks~ - @5011 = ~The Song of Kaudies~ - @5012 = ~All allies have a 50% chance to shrug off the effects of spells such as Silence, Shout, Great Shout, Command, Greater Command, or any other sound-based attack.~ - @5013 = ~The Siren's Yearning - Enthralls Creatures~ - @5014 = ~The Siren's Yearning~ - @5015 = ~All enemies within 15 ft. must save vs. Spell or become enthralled, unable to take action until 1 round passes or they take damage.~ - @5016 = ~Enthralled~ - @5017 = ~War Chant of Sith - Armor Bonuses and Regeneration~ - @5018 = ~War Chant of Sith~ - @5019 = ~All allies gain a +2 bonus to Armor Class, +10% resistance to slashing, piercing, crushing, and missile damage, and the ability to regenerate 2 Hit Points per round.~ - @5020 = ~BARD: The Bard is a rogue, but is very different from the Thief. The Bard's strength is pleasant and charming personality. With it and wits, makes way through the world. A Bard is a talented musician and a walking storehouse of gossip, tall tales, and lore; learns a little bit about everything that crosses path and is a jack-of-all-trades but master of none. While many Bards are scoundrels, their stories and songs are welcome almost everywhere. -CLASS FEATURES: -- May not wear armor heavier than chain mail. (Spells cannot be cast while wearing armor.) -- May not equip shields larger than bucklers. -- May only become Proficient (one slot) in any weapon class. -- May only become Proficient (one slot) in any fighting style. -- Thieving abilities: Pick Pockets. -- Increased Lore score. -- May cast arcane spells starting at 2nd level. -- May use Bard Song ability to play any song from repertoire: - 1st level: Can play "The Ballad of Three Heroes." All allies within 30 ft. gain +1 to hit, +1 to damage, and +1 to all their Saving Throws. - 3rd level: Can play "The Tale of Curran Strongheart." All allies within 30 ft. gain immunity to fear effects for as long as the song lasts, and any fear effects currently on them are removed. - 5th level: Can play "Tymora's Melody." All allies within 30 ft. gain +1 to luck, +3 to Saving Throws, +10 to lore, and a +10% bonus to all of their thieving skills. - 7th level: Can play "The Song of Kaudies." All allies within 30 ft. have a 50% chance to shrug off the effects of spells such as Silence, Shout, Great Shout, Command, Greater Command, or any other sound-based attack. - 9th level: Can play "The Siren's Yearning." All enemies within 30 ft. must save vs. Spell or become enthralled, unable to take action until 1 round passes or they take damage. - 11th level: Can play "War Chant of Sith." All allies within 30 ft. gain a +2 bonus to Armor Class, +10% resistance to slashing, piercing, crushing, and missile damage, and the ability to regenerate 2 Hit Points per round. -- Alignment restricted to any neutral. -- Hit Die: d6~ - @6001 = ~Two Handed Axe~ - @6002 = ~This mighty weapon consists of a haft several feet long, topped with a heavy blade. The axe may be double-bitted, with blades on both sides of the haft, or it may only have a single blade. It is an unwieldy weapon, but a skilled warrior can strike blows of tremendous strength with it. - -STATISTICS: - -Damage: 1D10 -Damage type: Slashing -Weight: 10 -Speed Factor: 9 -Proficiency Type: Axe -Type: 2-handed -Requires: 10 Strength -Not Usable By: - Druid - Cleric - Mage - Thief~ - @6003 = ~Two Handed Axe +1~ - @6004 = ~This mighty weapon consists of a haft several feet long, topped with a heavy blade. The axe may be double-bitted, with blades on both sides of the haft, or it may only have a single blade. This axe has also been bestowed with a small number of magical properties, however, thus making it more effective in combat. Its keen blade, for instance, will shear through your opponent's flesh to find the bone while its barbed tip will seek out gaps in their armor. - -STATISTICS: - -THAC0: +1 bonus -Damage: 1D10+1 -Damage type: Slashing -Weight: 9 -Speed Factor: 8 -Proficiency Type: Axe -Type: 2-handed -Requires: 10 Strength -Not Usable By: - Druid - Cleric - Mage - Thief~ - @6005 = ~Two Handed Axe +2: Tremain's Tumbler~ - @6006 = ~Tremain Longaxe was an adventurer in the Ten Towns with a penchant for axes. While two-handed axes are generally slow and unwieldy, Tremain had this axe specially designed to trip opponents, allowing him to overcome foes with faster and lighter weapons. - -STATISTICS: -Combat Abilities: 10% chance with every hit to knock down opponent for one round - -THAC0: +2 bonus -Damage: 1D10+2 -Damage type: Slashing -Weight: 8 -Speed Factor: 7 -Proficiency Type: Axe -Type: 2-handed -Requires: 10 Strength -Not Usable By: - Druid - Cleric - Mage - Thief~ - @6007 = ~Two Handed Axe +3~ - @6008 = ~This mighty weapon consists of a haft several feet long, topped with a heavy blade. The axe may be double-bitted, with blades on both sides of the haft, or it may only have a single blade. This axe has been imbued with several enchantments, however, thus making it more effective in combat. - -STATISTICS: - -THAC0: +3 bonus -Damage: 1D10+3 -Damage type: Slashing -Weight: 7 -Speed Factor: 6 -Proficiency Type: Axe -Type: 2-handed -Requires: 10 Strength -Not Usable By: - Druid - Cleric - Mage - Thief~ - @6009 = ~Two Handed Axe +4: The Battle Standard~ - @6010 = ~Murzul Dul was a warchief under King Greneire who earned his fame as a skilled tactician. This immense axe doubled as his battle standard in combat and could strike down foes and rally his horde in equal measure. Like King Greniere himself and most of his horde, Dul was killed during the siege of the Citadel of Many Arrows when Emerus Warcrown swept away the battling hordes and the axe claimed as war spoils. The axe retains its ability to rally allies and shake foes by spiking the haft of the weapon into the ground. - -STATISTICS: -Combat Abilities: - Battle Standard twice per day - The axe can knock back foes in a small radius and grant allies +1 THAC0 and damage for two rounds - -THAC0: +4 bonus -Damage: 1D10+4 -Damage type: Slashing -Weight: 6 -Speed Factor: 5 -Proficiency Type: Axe -Type: 2-handed -Not Usable By: - Druid - Cleric - Mage - Thief~ - @6011 = ~Two Handed Axe +5: The Battle Standard~ - @6012 = ~Murzul Dul was a warchief under King Greneire who earned his fame as a skilled tactician. This immense axe doubled as his battle standard in combat and could strike down foes and rally his horde in equal measure. Like King Greniere himself and most of his horde, Dul was killed during the siege of the Citadel of Many Arrows when Emerus Warcrown swept away the battling hordes and the axe claimed as war spoils. The axe retains its ability to rally allies and shake foes by spiking the haft of the weapon into the ground. Cespenar has further enhanced this axe. - -STATISTICS: -Combat Abilities: - Enhanced Battle Standard twice per day - By spiking the haft into the ground, the wielder can knock back foes in a small radius and grant allies +2 to saves, THAC0 and damage for two rounds - -THAC0: +5 bonus -Damage: 1D10+5 -Damage type: Slashing -Weight: 5 -Speed Factor: 4 -Proficiency Type: Axe -Type: 2-handed -Not Usable By: - Druid - Cleric - Mage - Thief~ - @6013 = ~Battle Standard~ - @6014 = ~Enhanced Battle Standard~ - @6015 = ~Ooh, big axe! Gots some woods to chop? Shiny, shiny!~ - @6016 = ~Recipe can make Battle Standard more Standard. 5,000 gold will do it.~ - @6017 = ~Let's see what else you got then.~ \ No newline at end of file diff --git a/iwdification/languages/english/game_strings_ee.tra b/iwdification/languages/english/game_strings_ee.tra deleted file mode 100644 index c62364d..0000000 --- a/iwdification/languages/english/game_strings_ee.tra +++ /dev/null @@ -1,89 +0,0 @@ -// strings in this file will be used exclusively for EE games and override similar strings in game_strings -// this file is UTF-8 and does not get converted. - - @6002 = ~This mighty weapon consists of a haft several feet long, topped with a heavy blade. The axe may be double-bitted, with blades on both sides of the haft, or it may only have a single blade. It is an unwieldy weapon, but a skilled warrior can strike blows of tremendous strength with it. - -STATISTICS: - -Damage: 1d10 (slashing) -Speed Factor: 9 -Proficiency Type: Axe -Type: Two-handed -Requires: - 10 Strength - -Weight: 10~ - @6004 = ~This mighty weapon consists of a haft several feet long, topped with a heavy blade. The axe may be double-bitted, with blades on both sides of the haft, or it may only have a single blade. This axe has also been bestowed with a small number of magical properties, however, thus making it more effective in combat. Its keen blade, for instance, will shear through your opponent's flesh to find the bone while its barbed tip will seek out gaps in their armor. - -STATISTICS: - -THAC0: +1 -Damage: 1d10+1 (slashing) -Speed Factor: 8 -Proficiency Type: Axe -Type: Two-handed -Requires: - 10 Strength - -Weight: 9~ - @6006 = ~Tremain Longaxe was an adventurer in the Ten Towns with a penchant for axes. While two-handed axes are generally slow and unwieldy, Tremain had this axe specially designed to trip opponents, allowing him to overcome foes with faster and lighter weapons. - -STATISTICS: - -Combat abilities: -- 10% chance of knocking down opponent for one round on each hit - -THAC0: +2 -Damage: 1d10+2 (slashing) -Speed Factor: 7 -Proficiency Type: Axe -Type: Two-handed -Requires: - 10 Strength - -Weight: 8~ - @6008 = ~This mighty weapon consists of a haft several feet long, topped with a heavy blade. The axe may be double-bitted, with blades on both sides of the haft, or it may only have a single blade. This axe has been imbued with several enchantments, however, thus making it more effective in combat. - -STATISTICS: - -THAC0: +3 -Damage: 1d10+3 (slashing) -Speed Factor: 6 -Proficiency Type: Axe -Type: Two-handed -Requires: - 10 Strength - -Weight: 7~ - @6010 = ~Murzul Dul was a warchief under King Greneire who earned his fame as a skilled tactician. This immense axe doubled as his battle standard in combat and could strike down foes and rally his horde in equal measure. Like King Greniere himself and most of his horde, Dul was killed during the siege of the Citadel of Many Arrows when Emerus Warcrown swept away the battling hordes and the axe claimed as war spoils. The axe retains its ability to rally allies and shake foes by spiking the haft of the weapon into the ground. - -STATISTICS: - -Combat abilities: -- Battle Standard twice per day - The axe can knock back foes in a small radius and grant allies +1 THAC0 and damage for two rounds - -THAC0: +4 -Damage: 1d10+4 (slashing) -Speed Factor: 5 -Proficiency Type: Axe -Type: Two-handed -Requires: - 10 Strength - -Weight: 6~ - @6012 = ~Murzul Dul was a warchief under King Greneire who earned his fame as a skilled tactician. This immense axe doubled as his battle standard in combat and could strike down foes and rally his horde in equal measure. Like King Greniere himself and most of his horde, Dul was killed during the siege of the Citadel of Many Arrows when Emerus Warcrown swept away the battling hordes and the axe claimed as war spoils. The axe retains its ability to rally allies and shake foes by spiking the haft of the weapon into the ground. Cespenar has further enhanced this axe. - -STATISTICS: - -Combat abilities: -- Enhanced Battle Standard twice per day - By spiking the haft into the ground, the wielder can knock back foes in a small radius and grant allies +2 to saves, THAC0 and damage for two rounds - -THAC0: +5 -Damage: 1d10+5 (slashing) -Speed Factor: 4 -Proficiency Type: Axe -Type: Two-handed -Requires: - 10 Strength - -Weight: 5~ \ No newline at end of file diff --git a/iwdification/languages/english/setup.tra b/iwdification/languages/english/setup.tra deleted file mode 100644 index 4bc0747..0000000 --- a/iwdification/languages/english/setup.tra +++ /dev/null @@ -1,16 +0,0 @@ -// this file contains strings only used by the WeiDU installer and does not get converted to UTF-8 for EE games. - -@0 = ~This functionality is already installed by another mod.~ -@1 = ~Modmerge is required before mods can be installed on this game. Check the readme for more information and a link to download Modmerge.~ - -@1000 = ~Icewind Dale Casting Graphics (Andyr)~ - -@2000 = ~Commoners Use Drab Colors~ - -@3000 = ~IWD Arcane Spell Pack~ - -@4000 = ~IWD Divine Spell Pack~ - -@5000 = ~IWD Bard Song~ - -@6000 = ~Two Handed Axe Item Pack~ \ No newline at end of file diff --git a/iwdification/languages/fr_fr/game_strings.tra b/iwdification/languages/fr_fr/game_strings.tra new file mode 100644 index 0000000..71bc08d --- /dev/null +++ b/iwdification/languages/fr_fr/game_strings.tra @@ -0,0 +1,227 @@ +// this file was auto-generated by the iwdification translator tool v1. +// strings which will need manual translation: 3014, 5003, 5006, 5009, 5012, 5015, 5019, and all strings past 6001 +// all strings in setup.tra need manual translation + +// strings in this file will be overridden by strings in game_strings_ee for EE games. +// this file is ANSI, and will be converted to UTF-8 for EE games. + + + @6001 = ~Hache à deux mains~ + @6002 = ~Cette arme puissante consiste en un manche de 1,20 mètre à 1,50 mètre de long, au bout duquel a été fixée une lourde lame, laquelle peut être simple ou double (une lame de chaque côté du manche). C'est une arme difficile à manier, mais un combattant aguerri peut s'en servir pour assener de terribles coups. + +PARAMÈTRES : + +Dégâts : 1d10 +Type de dégâts : tranchant +Poids : 10 +Facteur de vitesse : 9 +Type de compétence : hache +Type : arme à 2 mains +Nécessite : 10 en Force +Non utilisable par : + Druide + Clerc + Mage + Voleur + Moine + Belluaire~ + @6003 = ~Hache à deux mains +1~ + @6004 = ~Cette arme puissante consiste en un manche de 1,20 mètre à 1,50 mètre de long, au bout duquel a été fixée une lourde lame, laquelle peut être simple ou double (une lame de chaque côté du manche). Cette hache a également été dotée de plusieurs propriétés magiques, ce qui la rend plus efficace au combat. Sa lame acérée, par exemple, cisaillera la chair de votre adversaire pour trouver l'os tandis que sa pointe barbelée cherchera des trous dans son armure. + +PARAMÈTRES : + +TAC0 : +1 +Dégâts : 1d10 +1 +Type de dégâts : tranchant +Poids : 9 +Facteur de vitesse : 8 +Type de compétence : hache +Type : arme à 2 mains +Nécessite : 10 en Force +Non utilisable par : + Druide + Clerc + Mage + Voleur + Moine + Belluaire~ + @6005 = ~Hache à deux mains +2 : Culbuteuse de Tremain~ + @6006 = ~Tremain Hachelongue était un aventurier des Dix-Cités qui avait un penchant pour les haches. Alors que les haches à deux mains sont généralement lentes et difficiles à manier, Tremain avait conçu spécialement celle-ci pour faire trébucher ses adversaires, lui permettant de vaincre des ennemis équipés d'armes plus rapides et plus légères. + +PARAMÈTRES : + +Capacité de combat : +- 10 % de chance de renverser l'adversaire pendant un round, à chaque coup réussi. + +TAC0 : +2 +Dégâts : 1d10 +2 +Type de dégâts : tranchant +Poids : 8 +Facteur de vitesse : 7 +Type de compétence : hache +Type : arme à 2 mains +Nécessite : 10 en Force +Non utilisable par : + Druide + Clerc + Mage + Voleur + Moine + Belluaire~ + @6007 = ~Hache à deux mains +3~ + @6008 = ~Cette arme puissante consiste en un manche de 1,20 mètre à 1,50 mètre de long, au bout duquel a été fixée une lourde lame, laquelle peut être simple ou double (une lame de chaque côté du manche). Cette hache a été imprégnée de plusieurs enchantements, ce qui la rend plus efficace au combat. + +PARAMÈTRES : + +TAC0 : +3 +Dégâts : 1d10 +3 +Type de dégâts : tranchant +Poids : 7 +Facteur de vitesse : 6 +Type de compétence : hache +Type : arme à 2 mains +Nécessite : 10 en Force +Non utilisable par : + Druide + Clerc + Mage + Voleur + Moine + Belluaire~ + @6009 = ~Hache à deux mains +4 : Étendard de bataille~ + @6010 = ~Murzul Dul était un chef de guerre du roi Greneire, qui avait gagné sa renommée en tant que tacticien habile. Cette immense hache lui servait aussi d'étendard sur le champ de bataille, et pouvait à la fois terrasser ses ennemis et rallier sa horde. Comme le roi Greneire et la majeure partie de sa horde, Dul fut tué pendant le siège de la Citadelle des Mille et Une Flèches lorsque Emerus Couronne-de-Guerre les balaya, et sa hache fut revendiquée comme butin de guerre. Elle a conservé ses capacités que l'on peut activer en plantant son manche dans le sol. + +PARAMÈTRES : + +Capacité de charge : +- Étendard de bataille deux fois par jour : en plantant le manche de la hache dans le sol, le porteur peut repousser ses ennemis situés à proximité, et accorder à ses alliés un bonus de 1 à leur TAC0 et à leurs dégâts, pour deux rounds. + +TAC0 : +4 +Dégâts : 1d10 +4 +Type de dégâts : tranchant +Poids : 6 +Facteur de vitesse : 5 +Type de compétence : hache +Type : arme à deux mains +Nécessite : 10 en Force +Non utilisable par : + Druide + Clerc + Mage + Voleur + Moine + Belluaire~ + @6011 = ~Hache à deux mains +5 : Étendard de bataille~ + @6012 = ~Murzul Dul était un chef de guerre du roi Greneire, qui avait gagné sa renommée en tant que tacticien habile. Cette immense hache lui servait aussi d'étendard sur le champ de bataille, et pouvait à la fois terrasser ses ennemis et rallier sa horde. Comme le roi Greneire et la majeure partie de sa horde, Dul fut tué pendant le siège de la Citadelle des Mille et Une Flèches lorsque Emerus Couronne-de-Guerre les balaya, et sa hache fut revendiquée comme butin de guerre. Elle a conservé ses capacités que l'on peut activer en plantant son manche dans le sol. Cespenar l'a encore améliorée. + +PARAMÈTRES : + +Capacité de charge : +- Étendard de bataille amélioré deux fois par jour : en plantant le manche de la hache dans le sol, le porteur peut repousser ses ennemis situés à proximité, et accorder à ses alliés un bonus de 2 à leurs jets de sauvegarde, leur TAC0 et leurs dégâts, pour deux rounds. + +TAC0 : +5 +Dégâts : 1d10 +5 +Type de dégâts : tranchant +Poids : 5 +Facteur de vitesse : 4 +Type de compétence : hache +Type : arme à deux mains +Nécessite : 10 en Force +Non utilisable par : + Druide + Clerc + Mage + Voleur + Moine + Belluaire~ + @6013 = ~Étendard de bataille~ + @6014 = ~Étendard de bataille amélioré~ + @6015 = ~Ooh, une grosse hache ! T'as du petit bois à couper ? Brillante, brillante !~ + @6016 = ~J'ai une recette qui peut rendre Étendard de bataille encore plus batailleur. 5 000 pièces d'or et il est à toi.~ + @6017 = ~Alors, voyons voir ce que tu as d'autre.~ + + + @9001 = ~Scarabée scolyte~ + @9002 = ~Métamorphose +(Transmutation) + +Niveau : 4 +Portée : personnelle +Durée : 1 tour + 3 rounds par niveau +Temps d'incantation : 4 +Zone d'effet : le lanceur +Jet de sauvegarde : aucun + +Une fois ce sort jeté, le personnage est capable de prendre la forme d'une autre créature. Il acquiert également le mode physique de locomotion et de respiration de sa nouvelle forme. Mais celle-ci n'acquiert pas d'aptitudes supplémentaires (attaques spéciales ou magiques), et le magicien ne risque pas de changer de personnalité ni de mentalité. +Une fois le sort jeté, et pendant la durée de son effet, le jeteur de sorts peut prendre toutes ces nouvelles formes à tout moment et à volonté. Dans certains cas, il acquiert les moyens d'attaque naturels de la nouvelle forme, dans d'autres, il peut utiliser des armes. Quant au magicien, ses attributs mentaux restent les mêmes, mais tous ses attributs physiques sont affectés par la nouvelle forme, dont il acquiert aussi toutes les protections naturelles (par exemple, résistance aux projectiles et armes contondantes du limon). +Les formes qu'il est possible d'adopter sont les suivantes : +- loup +- loup arctique +- ours brun +- ours noir +- ours polaire +- gnoll (manie une hallebarde magique qui inflige +1 point de dégât de feu et frappe comme une arme +3) +- gelée moutarde (ralentit les adversaires qui ratent un jet de sauvegarde contre la pétrification/métamorphose) +- ogre (peut causer des dégâts massifs à l'aide de ses points) +- araignée (empoisonne les adversaires touchés au corps-à-corps)~ // ~copy contents of @9004 and remove the reference to boring beetle in the last line~ + @9003 = ~Ours polaire~ + @9004 = ~Métamorphose +(Transmutation) + +Niveau : 4 +Portée : personnelle +Durée : 1 tour + 3 rounds par niveau +Temps d'incantation : 4 +Zone d'effet : le lanceur +Jet de sauvegarde : aucun + +Une fois ce sort jeté, le personnage est capable de prendre la forme d'une autre créature. Il acquiert également le mode physique de locomotion et de respiration de sa nouvelle forme. Mais celle-ci n'acquiert pas d'aptitudes supplémentaires (attaques spéciales ou magiques), et le magicien ne risque pas de changer de personnalité ni de mentalité. +Une fois le sort jeté, et pendant la durée de son effet, le jeteur de sorts peut prendre toutes ces nouvelles formes à tout moment et à volonté. Dans certains cas, il acquiert les moyens d'attaque naturels de la nouvelle forme, dans d'autres, il peut utiliser des armes. Quant au magicien, ses attributs mentaux restent les mêmes, mais tous ses attributs physiques sont affectés par la nouvelle forme, dont il acquiert aussi toutes les protections naturelles (par exemple, résistance aux projectiles et armes contondantes du limon). +Les formes qu'il est possible d'adopter sont les suivantes : +- loup +- loup arctique +- ours brun +- ours noir +- ours polaire +- scarabée scolyte +- gnoll (manie une hallebarde magique qui inflige +1 point de dégât de feu et frappe comme une arme +3) +- gelée moutarde (ralentit les adversaires qui ratent un jet de sauvegarde contre la pétrification/métamorphose) +- ogre (peut causer des dégâts massifs à l'aide de ses points) +- araignée (empoisonne les adversaires touchés au corps-à-corps)~ + @9005 = ~Métamorphose en scarabée scolyte~ + @9006 = ~Métamorphose en scarabée scolyte +Force : 18/51 +Dextérité : 7 +Classe d'armure de base : -2 +Attaques par round : 1 +Dégâts : 5d4 (tranchant) +Capacités spéciales : +- résistance aux dégâts tranchants : 50 % +- résistance aux dégâts perforants : 50 % +- résistance aux dégâts projectiles : 50 % + +Le druide récupère 12 points de vie après l'utilisation de cette capacité.~ + @9007 = ~Métamorphose en ours polaire~ + @9008 = ~Métamorphose en ours polaire +Force : 18/00 +Dextérité : 10 +Classe d'armure de base : 4 +Attaques par round : 3 +Dégâts : 1d12 (tranchant) +Capacités spéciales : +- résistance au froid : 75 % +- résistance au feu : -25 % + +Le druide récupère 12 points de vie après l'utilisation de cette capacité.~ + @9009 = ~Métamorphose en loup arctique~ + @9010 = ~Métamorphose en loup arctique +Force : 18 +Dextérité : 13 +Classe d'armure de base : 2 +Attaques par round : 2 +Dégâts : 1d6 (tranchant) +Capacités spéciales : +- résistance au froid : 75 % +- résistance au feu : -25 % + +Le druide récupère 12 points de vie après l'utilisation de cette capacité.~ \ No newline at end of file diff --git a/iwdification/languages/french/game_strings_ee.tra b/iwdification/languages/fr_fr/game_strings_ee.tra similarity index 100% rename from iwdification/languages/french/game_strings_ee.tra rename to iwdification/languages/fr_fr/game_strings_ee.tra diff --git a/iwdification/languages/fr_fr/setup.tra b/iwdification/languages/fr_fr/setup.tra new file mode 100644 index 0000000..b7d98b2 --- /dev/null +++ b/iwdification/languages/fr_fr/setup.tra @@ -0,0 +1,111 @@ +// this file contains strings only used by the WeiDU installer and does not get converted to UTF-8 for EE games. + +@998 = ~Les fonctionnalites de ce composant sont deja installees par un autre mod.~ +@999 = ~Il est necessaire d'utiliser Modmerge avant d'installer des mods pour ce jeu. Consultez le readme pour plus d'informations et pour trouver un lien pour telecharger Modmerge.~ + +@1000 = ~Incantation des sorts style Icewind Dale (Andyr)~ + +@2000 = ~Couleurs ternes pour les habits des roturiers~ + +@3000 = ~Pack de sortileges profanes d'IWD~ + +@4000 = ~Pack de sortileges divins d'IWD~ + +@5000 = ~Chanson du barde d'IWD~ + +@6000 = ~Pack de haches a deux mains~ + + +// WeiDU prompts +@-1000= "Le mod %TP2_FILE_NAME% contient" +@-1001= "composants optionnels distincts. +Pour gagner du temps, vous pouvez choisir ce que vous souhaitez faire d'eux +au niveau general plutot que de repondre aux questions pour chacun. +" +@-1002= "Que faut-il faire de tous les composants qui NE sont PAS ENCORE installes ? +Les [I]nstaller, les [S]auter, dem[A]nder pour chacun ? " +@-1003= "Que faut-il faire de tous les composants qui sont DEJA installes ? +Les [R]einstaller, les s[U]pprimer, les [S]auter, dem[A]nder pour chacun ? " + +@-1004= "S'IL VOUS PLAIT, envoyez par e-mail le fichier" +@-1005= "a" + +@-1006= "Installer le composant [" +@-1007= "] ? +[R]einstaller, co[N]server, s[U]pprimer ou [Q]uitter ? " +@-1008= "] ? +[I]nstaller, [N]e pas installer ou [Q]uitter ? " + +@-1009= "Entrez une partie du nom du module : " + +@-1010= "Reinstallation du composant [" +@-1011= "] " +@-1012= "Reinstallation dans la langue" + +@-1013= "Suppression de l'ancienne installation de [" +@-1014= "] au prealable..." +@-1015= "SUPPRESSION REUSSIE DE L'ANCIEN" + +@-1016= "Installation en cours" +@-1017= "ERREUR pendant l'installation de [" +@-1018= "], retour a l'etat anterieur" +@-1019= "INSTALLATION REUSSIE" +@-1020= "Saute" +@-1021= "Suppression de [" +@-1022= "] (composant #" +@-1023= ")" +@-1024= "SUPPRESSION REUSSIE DE [" + +@-1025= "] ? +[R]einstaller, co[N]server, s[U]pprimer, [Q]uitter ou choisir un parmi :" +@-1026= "] ? +[N]e pas installer, [Q]uitter ou choisir un parmi :" +@-1027= " (installe actuellement)" + +@-1028= "Souhaitez-vous afficher les composants de [" +@-1029= "] ? +[Y]Oui, [N]on ? " + +@-1030= "] ? +choisir un parmi :" +@-1031= "] ? +[R]einstaller, co[N]server, [Q]uitter ou choisir un parmi :" +@-1032= "INSTALLATION ECHOUEE A CAUSE D'ERREURS" +@-1033= "INSTALLATION AVEC DES ALERTES" +@-1034= "Souhaitez-vous afficher les instructions (ReadMe) ? [Y]Oui [N]on" +@-1035= "Dans la langue" + +@-1036= "Saute le GROUPE [" +@-1037= "] pour cause d'absence des pre-requis." + +@-1038= "dem[A]nder pour chaque composant, tout [S]auter, ou choisir une selection pre-definie :" +@-1039= "dem[A]nder pour chaque composant, [R]einstaller la configuration courante, tout s[U]pprimer, tout [S]auter, ou choisir une selection pre-definie :" + +@-1040= " +Veuillez choisir la langue dans laquelle vous souhaitez jouer au jeu. +Si par la suite vous desirez jouer au jeu dans une langue differente, il vous +faudra editer le fichier weidu.conf et reinstaller vos mods. +" +@-1041= "Tcheque" +@-1042= "Allemand" +@-1043= "Anglais" +@-1044= "Espagnol" +@-1045= "Francais" +@-1046= "Italien" +@-1047= "Polonais" +@-1048= "Portugais" +@-1049= "Turc" +@-1050= "Japonais" +@-1051= "Coreen" +@-1052= "Chinois simplifie" +@-1053= "Russe" +@-1054= "Ukrainien" + +@-1060= " +Ce jeu est disponible en plusieurs langues mais WeiDU ne sait pas laquelle a ete choisie quand ce mod a ete installe. + +Veuillez indiquer quelle langue du jeu a ete utilisee quand vous avez installe ce mod. Votre choix servira jusqu'a ce que WeiDU s'arrete mais ne sera pas memorise. +" +@-1061= " +Utilisation de" +@-1062= " et " diff --git a/iwdification/languages/french/game_strings.tra b/iwdification/languages/french/game_strings.tra deleted file mode 100644 index b03e93c..0000000 --- a/iwdification/languages/french/game_strings.tra +++ /dev/null @@ -1,1438 +0,0 @@ -// this file was auto-generated by the iwdification translator tool v1. -// strings which will need manual translation: 3014, 5003, 5006, 5009, 5012, 5015, 5019, and all strings past 6001 -// all strings in setup.tra need manual translation - -// strings in this file will be overridden by strings in game_strings_ee for EE games. -// this file is ANSI, and will be converted to UTF-8 for EE games. - @3001 = ~Émotion : désespoir~ - @3002 = ~Émotion : désespoir -(Enchantement/Charme) - -Niveau : 4 -Portée : champ visuel du lanceur -Durée : 1 tour -Temps d'incantation : 4 -Zone d'effet : 4,5 mètres de rayon -Jet de sauvegarde : annule - -Ce sort fait naître un grand désespoir chez toutes les créatures situées dans la zone d'effet. Celles qui sont affectées ne peuvent rien faire pendant toute la durée de l'enchantement.~ - @3003 = ~Désespoir~ - @3004 = ~Métamorphose -(Transmutation) - -Niveau : 4 -Portée : personnelle -Durée : 1 tour + 3 rounds par niveau -Temps d'incantation : 4 -Zone d'effet : le lanceur -Jet de sauvegarde : aucun - -Une fois ce sort jeté, le personnage est capable de prendre la forme d'une autre créature. Il acquiert également le mode physique de locomotion et de respiration de sa nouvelle forme. Mais celle-ci n'acquiert pas d'aptitudes supplémentaires (attaques spéciales ou magiques), et le magicien ne risque pas de changer de personnalité ni de mentalité. -Une fois le sort jeté, et pendant la durée de son effet, le jeteur de sorts peut prendre toutes ces nouvelles formes à tout moment et à volonté. Dans certains cas, il acquiert les moyens d'attaque naturels de la nouvelle forme, dans d'autres, il peut utiliser des armes. Quant au magicien, ses attributs mentaux restent les mêmes, mais tous ses attributs physiques sont affectés par la nouvelle forme, dont il acquiert aussi toutes les protections naturelles (par exemple, résistance aux projectiles et armes contondantes du limon). -Les formes qu'il est possible d'adopter sont les suivantes : -- loup -- loup arctique -- ours brun -- ours noir -- ours polaire -- scarabée scolyte -- gnoll (manie une hallebarde magique qui inflige +1 point de dégât de feu et frappe comme une arme +3) -- gelée moutarde (ralentit les adversaires qui ratent un jet de sauvegarde contre la pétrification/métamorphose) -- ogre (peut causer des dégâts massifs à l'aide de ses points) -- araignée (empoisonne les adversaires touchés au corps-à-corps)~ - @3005 = ~Métamorphose en scarabée scolyte~ - @3006 = ~Métamorphose en scarabée scolyte -Force : 18/51 -Dextérité : 7 -Classe d'armure de base : -2 -Attaques par round : 1 -Dégâts : 5d4 (tranchant) -Capacités spéciales : -- résistance aux dégâts tranchants : 50 % -- résistance aux dégâts perforants : 50 % -- résistance aux dégâts projectiles : 50 % - -Le druide récupère 12 points de vie après l'utilisation de cette capacité.~ - @3007 = ~Métamorphose en ours polaire~ - @3008 = ~Métamorphose en ours polaire -Force : 18/00 -Dextérité : 10 -Classe d'armure de base : 4 -Attaques par round : 3 -Dégâts : 1d12 (tranchant) -Capacités spéciales : -- résistance au froid : 75 % -- résistance au feu : -25 % - -Le druide récupère 12 points de vie après l'utilisation de cette capacité.~ - @3009 = ~Métamorphose en loup arctique~ - @3010 = ~Repli expéditif~ - @3011 = ~Repli expéditif -(Transmutation) - -Niveau : 1 -Portée : personnelle -Durée : 3 rounds -Temps d'incantation : 1 -Zone d'effet : le lanceur -Jet de sauvegarde : aucun - -Ce sort double la vitesse de déplacement du sujet pendant un bref instant, ce qui lui permet généralement de s'enfuir. Les autres enchantements affectant la vitesse, comme Hâte et Lenteur, cessent de faire effet jusqu'au terme de la durée du Repli expéditif. Lorsqu'il est sous l'effet de ce sort, le lanceur ne peut ni attaquer, ni incanter, ni utiliser d'objets magiques ou avoir recours à des capacités spéciales... il ne peut que fuir.~ - @3012 = ~Métamorphose en loup arctique -Force : 18 -Dextérité : 13 -Classe d'armure de base : 2 -Attaques par round : 2 -Dégâts : 1d6 (tranchant) -Capacités spéciales : -- résistance au froid : 75 % -- résistance au feu : -25 % - -Le druide récupère 12 points de vie après l'utilisation de cette capacité.~ - @3013 = ~Scarabée scolyte~ - @3014 = ~Métamorphose -(Transmutation) - -Niveau : 4 -Portée : personnelle -Durée : 1 tour + 3 rounds par niveau -Temps d'incantation : 4 -Zone d'effet : le lanceur -Jet de sauvegarde : aucun - -Une fois ce sort jeté, le personnage est capable de prendre la forme d'une autre créature. Il acquiert également le mode physique de locomotion et de respiration de sa nouvelle forme. Mais celle-ci n'acquiert pas d'aptitudes supplémentaires (attaques spéciales ou magiques), et le magicien ne risque pas de changer de personnalité ni de mentalité. -Une fois le sort jeté, et pendant la durée de son effet, le jeteur de sorts peut prendre toutes ces nouvelles formes à tout moment et à volonté. Dans certains cas, il acquiert les moyens d'attaque naturels de la nouvelle forme, dans d'autres, il peut utiliser des armes. Quant au magicien, ses attributs mentaux restent les mêmes, mais tous ses attributs physiques sont affectés par la nouvelle forme, dont il acquiert aussi toutes les protections naturelles (par exemple, résistance aux projectiles et armes contondantes du limon). -Les formes qu'il est possible d'adopter sont les suivantes : -- loup -- loup arctique -- ours brun -- ours noir -- ours polaire -- gnoll (manie une hallebarde magique qui inflige +1 point de dégât de feu et frappe comme une arme +3) -- gelée moutarde (ralentit les adversaires qui ratent un jet de sauvegarde contre la pétrification/métamorphose) -- ogre (peut causer des dégâts massifs à l'aide de ses points) -- araignée (empoisonne les adversaires touchés au corps-à-corps)~ // ~copy contents of @3004 and remove the reference to boring beetle in the last line~ - @3015 = ~Ours polaire~ - @3020 = ~Nuée de boules de neige de Snilloc~ - @3021 = ~Nuée de boules de neige de Snilloc -(Invocation) - -Niveau : 2 -Portée : champ visuel du lanceur -Durée : instantanée -Temps d'incantation : 2 -Zone d'effet : 9 mètres de rayon -Jet de sauvegarde : demi-dégâts - -Ce sort fait apparaître un déluge de boules de neige à partir du point choisi par le magicien. Ces projectiles touchent toutes les créatures prises dans la zone d'effet et leur infligent 1d3 points de dégâts de froid par niveau du personnage, jusqu'à un maximum de 8d3 au niveau 8. Contre les créatures à base de feu (ou qui l'utilisent), le sort cause 1d6 points de dégâts de froid par niveau, jusqu'à un maximum de 8d6 au niveau 8.~ - @3030 = ~Bâton décuplé~ - @3031 = ~Bâton décuplé -(Invocation) - -Niveau : 2 -Portée : personnelle -Durée : 3 rounds + 1 round par niveau -Temps d'incantation : 2 -Zone d'effet : le lanceur -Jet de sauvegarde : aucun - -Ce sort fait apparaître un bâton d'énergie dans la main du magicien. Il est considéré comme une arme magique infligeant 1d6 points de dégâts par coup et pouvant toucher les créatures comme s'il était une arme +1. Mais il reste un bâton, que son utilisateur doit savoir manier pour ne pas encourir de pénalité à l'attaque. Au premier coup porté, le bâton a également la possibilité d'absorber 1d2 points de vie de la cible, qui sont aussitôt transférés au mage, mais uniquement pour le soigner (pas pour augmenter ses points de vie au-dessus du maximum).~ - @3040 = ~Grâce féline~ - @3041 = ~Grâce féline -(Transmutation) - -Niveau : 2 -Portée : toucher -Durée : 1 heure par niveau -Temps d'incantation : 2 -Zone d'effet : 1 créature -Jet de sauvegarde : aucun - -Ce sort augmente la Dextérité du sujet en fonction de la classe de ce dernier : 1d8 points pour un voleur, 1d6 points pour un guerrier ou un mage et 1d4 points pour un prêtre. Grâce féline ne permet pas d'avoir plus de 20 en Dextérité.~ - @3050 = ~Lance de glace~ - @3051 = ~Lance de glace -(Invocation) - -Niveau : 3 -Portée : champ visuel du lanceur -Durée : instantanée -Temps d'incantation : 3 -Zone d'effet : 1 créature -Jet de sauvegarde : spécial - -Ce sort projette une lance de glace sur la cible choisie. Elle touche automatiquement, inflige 5d6 points de dégâts et oblige la victime à réussir un jet de sauvegarde contre les sorts pour ne pas être étourdie pendant 3 rounds.~ - @3060 = ~Lance de destruction~ - @3061 = ~Lance de destruction -(Évocation) - -Niveau : 3 -Portée : 30 mètres -Durée : instantanée -Temps d'incantation : 3 -Zone d'effet : spéciale -Jet de sauvegarde : demi-dégâts - -Ce sort fait apparaître une lance de force partant du doigt du personnage et pouvant être lancée jusqu'à 30 mètres. Toute créature touchée par le rayon d'énergie subit 5d4 points de dégâts, +2 par niveau du magicien (jusqu'à un maximum de +30). Un jet de sauvegarde réussi contre les sorts réduit les dégâts de moitié.~ - @3070 = ~Sang brûlant de Beltyn~ - @3071 = ~Sang brûlant de Beltyn -(Nécromancie) - -Niveau : 4 -Portée : champ visuel du lanceur -Durée : 1 round par 2 niveaux -Temps d'incantation : 4 -Zone d'effet : 1 créature -Jet de sauvegarde : annule - -Ce sort fait brûler le sang de la cible, ce qui lui inflige 3d4 points de dégâts par round et la rend folle de douleur. Chaque round, la victime a droit à un jet de sauvegarde contre les sorts (à -3). Dès qu'elle en réussit un, le sort cesse de faire effet. Il ne fonctionne pas contre les morts-vivants ou les créatures natives des autres plans qui n'ont pas de sang dans les veines (comme les élémentaires). Si la cible résiste au feu, cela réduit ou annule les dégâts provoqués par le sort.~ - @3080 = ~Monstres d'ombre~ - @3081 = ~Monstres d'ombre -(Illusion/Fantasme) - -Niveau : 4 -Portée : champ visuel du lanceur -Durée : 1 round par niveau -Temps d'incantation : 4 -Zone d'effet : spécial -Jet de sauvegarde : aucun - -Ce sort façonne la matière du Demi-plan de l'Ombre pour créer des monstres illusoires. Jusqu'à 6 créatures peuvent être invoquées, dont le total des dés de vie ne pourra dépasser le niveau du lanceur.~ - @3082 = ~Homme-lézard~ - @3090 = ~Émotion : courage~ - @3091 = ~Émotion : courage -(Enchantement/Charme) - -Niveau : 4 -Portée : champ visuel du lanceur -Durée : 1 heure -Temps d'incantation : 4 -Zone d'effet : 4,5 mètres de rayon -Jet de sauvegarde : aucun - -Ce sort génère un grand courage chez toutes les créatures situées dans la zone d'effet. Ces dernières bénéficient alors des bonus suivants : +1 à l'attaque, +3 aux dégâts et +5 points de vie temporaires (ce qui peut leur permettre de dépasser leur maximum). Enfin, le sort dissipe automatiquement la terreur dans la zone d'effet.~ - @3092 = ~Courage~ - @3100 = ~Émotion : terreur~ - @3101 = ~Émotion : terreur -(Enchantement/Charme) - -Niveau : 4 -Portée : champ visuel du lanceur -Durée : 5 rounds -Temps d'incantation : 4 -Zone d'effet : 4,5 mètres de rayon -Jet de sauvegarde : annule - -Ce sort terrifie les créatures situées dans la zone d'effet. En cas de jet de sauvegarde raté, elles s'enfuient pendant 5 rounds.~ - @3110 = ~Émotion : espoir~ - @3111 = ~Émotion : espoir -(Enchantement/Charme) - -Niveau : 4 -Portée : champ visuel du lanceur -Durée : 1 heure -Temps d'incantation : 4 -Zone d'effet : 4,5 mètres de rayon -Jet de sauvegarde : aucun - -Ce sort génère l'espoir chez les créatures situées dans la zone d'effet. Leur moral s'en ressent, et elles bénéficient d'un bonus de 2 à tous leurs jets d'attaque, de dégâts et de sauvegarde.~ - @3112 = ~Espoir~ - @3120 = ~Projectiles de force de Mordenkainen~ - @3121 = ~Projectiles de force de Mordenkainen -(Évocation) - -Niveau : 4 -Portée : champ visuel du lanceur -Durée : instantanée -Temps d'incantation : 4 -Zone d'effet : 1,5 mètres de rayon -Jet de sauvegarde : spécial - -Ce sort fait apparaître un petit globe d'énergie magique filant de la main tendue du mage pour aller frapper à coup sûr la cible désignée. Le personnage crée un projectile au niveau 7, plus un autre tous les trois niveaux supplémentaires (deux au niveau 10, trois au niveau 13, quatre au niveau 16, et ainsi de suite jusqu'à un maximum de sept au niveau 25). Chaque projectile cause 2d4 points de dégâts, puis explose, la détonation infligeant 1 point de dégâts par niveau du magicien dans un rayon de 1,50 mètre. Par exemple, un mage de niveau 12 fait apparaître deux projectiles de force, infligeant chacun 2d4+12 points de dégâts. Les créatures touchées ont droit à un jet de sauvegarde contre les sorts pour éviter les dégâts de l'explosion (elles subissent automatiquement les 2d4 points dus au projectile lui-même). Le sort Bouclier protège totalement contre les projectiles.~ - @3130 = ~Cri~ - @3131 = ~Cri -(Évocation) - -Niveau : 4 -Portée : personnelle -Durée : instantanée -Temps d'incantation : 1 -Zone d'effet : cône de 10,5 mètres de long et de 15 degrés d'angle -Jet de sauvegarde : demi-dégâts - -Ce sort confère un pouvoir vocal terrifiant au personnage, lequel peut laisser fuser un cri à déchirer les tympans affectant un cône de 10,5 mètres de long pour un angle de 15 degrés. Toute créature prise dans la zone d'effet perd 4d6 points de vie et se retrouve assourdie pendant 2d6 rounds. Un jet de sauvegarde réussi contre les sorts annule la surdité et réduit les dégâts de moitié.~ - @3140 = ~Sphère acide~ - @3141 = ~Sphère acide -(Conjuration) - -Niveau : 4 -Portée : champ visuel du lanceur -Durée : spéciale -Temps d'incantation : 4 -Zone d'effet : rayon de 3 mètres -Jet de sauvegarde : spécial - -Cette incantation fait apparaître une sphère d'acide vert émeraude, que le personnage peut lancer sur la cible de son choix. La sphère explose et inonde d'acide la créature choisie. Celle-ci perd 1d4 points de vie par niveau du magicien, jusqu'à un maximum de 12d4. Une fois les premiers dégâts encaissés, la victime doit réussir un jet de sauvegarde contre les sorts si elle ne veut pas en subir davantage. En cas d'échec, l'acide continue de la ronger round après round, les dégâts diminuant de deux dés par round. Par exemple, un magicien de niveau 8 inflige 8d4 points de dégâts grâce à ce sort. Si la victime rate son jet de sauvegarde, elle perd 6d4 points de vie lors du deuxième round, 4d4 pendant le troisième, et 2d4 au cours du quatrième. À chaque round, elle a droit à un nouveau jet de sauvegarde contre les sorts ; dès qu'elle en réussit un, les dégâts s'arrêtent. -L'acide asperge toutes les créatures situées à moins de 1,50 mètre de la cible. Toutes doivent réussir un jet de sauvegarde contre la pétrification/métamorphose si elles ne veulent pas subir 1d4 points de dégâts par cinq niveaux du lanceur. Ces dégâts d'aspersion ne sont pas continus.~ - @3150 = ~Linceul de flammes~ - @3151 = ~Linceul de flammes -(Évocation) - -Niveau : 5 -Portée : champ visuel du lanceur -Durée : 1 round par 2 niveaux (spécial) -Temps d'incantation : 5 -Zone d'effet : rayon de 3,5 mètres -Jet de sauvegarde : annule - -La créature affectée par ce sort s'enflamme si elle rate son jet de sauvegarde. Elle subit 2d6 points de dégâts de feu par round et des langues de feu projetées par la victime atteignent toutes les créatures distantes de moins de 3 mètres et leur infligent 1d4 points de dégâts de feu (si elles ratent leur jet de sauvegarde, ces dernières se retrouvent également dévorées par les flammes). Le linceul se dissipe si le jeteur de sorts et sa cible ne sont plus dans la même zone. Ce sort est particulièrement utile pour disperser un groupe de trolls ou de salamandres du givre.~ - @3160 = ~Demi-ombres~ - @3161 = ~Demi-ombres -(Illusion/Fantasme) - -Niveau : 5 -Portée : champ visuel du lanceur -Durée : 1 round par niveau -Temps d'incantation : 5 -Zone d'effet : spécial -Jet de sauvegarde : aucun - -Ce sort est semblable à Monstres d'ombre (4e niveau), si ce n'est que les créatures invoquées sont bien plus puissantes.~ - @3162 = ~Gobelin d'élite~ - @3163 = ~Homme-lézard coriace~ - @3170 = ~Convocation d'ombres~ - @3171 = ~Convocation d'ombres -(Conjuration/Convocation, Nécromancie) - -Niveau : 5 -Portée : champ visuel du lanceur -Durée : 1 round + 1 round par niveau -Temps d'incantation : 5 -Zone d'effet : spécial -Jet de sauvegarde : aucun - -Ce sort fait apparaître trois ombres disposant chacune de 3 dés de vie. Ces créatures obéissent aux ordres de leur maître et combattent pour lui jusqu'au terme du sort (ou jusqu'à ce qu'elles soient détruites).~ - @3180 = ~Contact avec un autre plan~ - @3181 = ~Contact avec un autre plan -(Divination) - -Niveau : 5 -Portée : personnelle -Durée : instantanée -Temps d'incantation : 9 -Zone d'effet : le lanceur -Jet de sauvegarde : aucun - -Cette incantation permet au magicien d'entrer en contact avec les entités des autres plans afin d'obtenir des informations. Elle sert surtout à se renseigner sur les ennemis, les objets magiques et les sorts.~ - @3182 = ~Esprit planaire~ - @3190 = ~Conjuration d'un élémentaire de feu~ - @3191 = ~Conjuration d'un élémentaire de feu -(Conjuration/Convocation) - -Niveau : 5 -Portée : champ visuel du lanceur -Durée : 1 tour par niveau -Temps d'incantation : 9 -Zone d'effet : spéciale -Jet de sauvegarde : aucun - -Ce sort invoque un Élémentaire de Feu de 8 DV au service du personnage en ouvrant un portail magique vers le Plan Élémentaire du Feu. L'élémentaire se battra pour le personnage jusqu'à sa destruction ou la fin du sort.~ - @3192 = ~Élémentaire de feu~ - @3200 = ~Conjuration d'un élémentaire de terre~ - @3201 = ~Conjuration d'un élémentaire de terre -(Conjuration/Convocation) - -Niveau : 5 -Portée : champ visuel du lanceur -Durée : 1 tour par niveau -Temps d'incantation : 9 -Zone d'effet : spéciale -Jet de sauvegarde : aucun - -Ce sort invoque un Élémentaire de Terre de 8 DV au service du personnage en ouvrant un portail magique vers le Plan Élémentaire de la Terre. L'élémentaire se battra pour le personnage jusqu'à sa destruction ou la fin du sort.~ - @3202 = ~Élémentaire de terre~ - @3210 = ~Conjuration d'un élémentaire d'air~ - @3211 = ~Conjuration d'un élémentaire d'air -(Conjuration/Convocation) - -Niveau : 5 -Portée : champ visuel du lanceur -Durée : 1 tour par niveau -Temps d'incantation : 9 -Zone d'effet : spéciale -Jet de sauvegarde : aucun - -Ce sort invoque un Élémentaire d'Air de 8 DV au service du personnage en ouvrant un portail magique vers le Plan Élémentaire de l'Air. L'élémentaire se battra pour le personnage jusqu'à sa destruction ou la fin du sort.~ - @3212 = ~Élémentaire d'air~ - @3220 = ~Conjuration d'un élémentaire d'eau~ - @3221 = ~Conjuration d'un élémentaire d'eau -(Conjuration/Convocation) - -Niveau : 5 -Portée : champ visuel du lanceur -Durée : 1 tour par niveau -Temps d'incantation : 9 -Zone d'effet : spéciale -Jet de sauvegarde : aucun - -Ce sort invoque un Élémentaire d'Eau de 8 DV au service du personnage en ouvrant un portail magique vers le Plan Élémentaire de l'Eau. L'élémentaire se battra pour le personnage jusqu'à sa destruction ou la fin du sort.~ - @3222 = ~Élémentaire d'eau~ - @3230 = ~Coquille antimagique~ - @3231 = ~Coquille antimagique -(Abjuration) - -Niveau : 6 -Portée : personnelle -Durée : 1 tour par niveau -Temps d'incantation : 1 -Zone d'effet : le lanceur -Jet de sauvegarde : aucun - -Ce sort entoure le magicien d'une barrière invisible se déplaçant avec lui. Elle l'immunise contre toutes les attaques magiques, mais l'empêche dans le même temps de jeter le moindre sort. Ce sort dissipe également les effets de surdité et de débilité mentale sur le lanceur.~ - @3240 = ~Toucher de la liche~ - @3241 = ~Toucher de la liche -(Nécromancie) - -Niveau : 6 -Portée : toucher -Durée : 1 round par niveau -Temps d'incantation : 6 -Zone d'effet : le lanceur -Jet de sauvegarde : spécial - -Ce sort confère les pouvoirs et les immunités d'une liche au magicien. Ce dernier n'a plus rien à craindre de la paralysie ou de la terreur tant que l'enchantement fait effet. Dans le même temps, ses mains luisent d'un éclat vert surnaturel qui inflige 1d10 points de dégâts à toute créature qu'il touche et la paralyse à moins qu'elle ne réussisse son jet de sauvegarde. Ce sort n'affecte pas les morts-vivants.~ - @3250 = ~Convocation de monstres IV~ - @3251 = ~Convocation de monstres IV -(Conjuration/Convocation) - -Niveau : 6 -Portée : 6 mètres -Durée : 5 rounds + 1 round par niveau -Temps d'incantation : 6 -Zone d'effet : spéciale -Jet de sauvegarde : aucun - -Ce sort fait apparaître 1d3 monstres de niveau 4. Ils se manifestent dans la limite de portée, et le magicien peut leur ordonner d'attaquer ses adversaires jusqu'à ce que la durée du sort arrive à son terme (à moins que les monstres invoqués ne soient tués auparavant).~ - @3252 = ~Yéti~ - @3260 = ~Sphère glaciale d'Otiluke~ - @3261 = ~Sphère glaciale d'Otiluke -(Transmutation, Invocation) - -Niveau : 6 -Portée : champ visuel du lanceur -Durée : instantanée -Temps d'incantation : 6 -Zone d'effet : 1 créature -Jet de sauvegarde : annule - -Ce sort projette un rayon glacé contre la cible. Il peut toucher toute créature située dans le champ de vision du magicien et inflige 1d4 +2 points de dégâts de froid par niveau de ce dernier. Si la victime réussit son jet de sauvegarde, elle évite totalement le rayon et ne subit pas le moindre dégât.~ - @3270 = ~Reflets~ - @3271 = ~Reflets -(Illusion/Fantasme) - -Niveau : 6 -Portée : champ visuel du lanceur -Durée : 1 round par niveau -Temps d'incantation : 6 -Zone d'effet : spéciale -Jet de sauvegarde : aucun - -Reflets est similaire aux sorts Monstres d'ombre et Demi-ombres, en ce sens qu'il permet de former des créatures illusoires à partir de matière prise au Demi-plan des Ombres. Ces monstres sont plus puissants que ceux qu'appellent les deux sorts mentionnés ci-dessus. Ils obéissent au magicien jusqu'au terme de la durée du sort ou jusqu'à ce qu'ils soient détruits.~ - @3272 = ~Ombre des roches~ - @3273 = ~Regard d'ombre des roches~ - @3280 = ~Dards d'os~ - @3281 = ~Dards d'os -(Nécromancie) - -Niveau : 6 -Portée : personnelle -Durée : 5 rounds -Temps d'incantation : 5 -Zone d'effet : le lanceur -Jet de sauvegarde : aucun - -Ce sort crée 9 dards pouvant être lancés par le personnage (qui est obligé de les garder en main tant que l'enchantement fait effet). Les dards sont +3, infligent 1d4 points de dégâts chacun, et toute créature touchée doit réussir un jet de sauvegarde contre la mort magique sous peine de perdre 2d6 points de vie supplémentaires et de voir sa Force baisser de 3 points pendant 5 rounds. Le personnage n'a pas besoin de savoir manier les dards pour pouvoir utiliser ce sort.~ - @3282 = ~Dard d'os +3~ - @3290 = ~Destruction d'âme~ - @3291 = ~Destruction d'âme -(Nécromancie) - -Niveau : 6 -Portée : champ visuel du lanceur -Durée : instantanée -Temps d'incantation : 5 -Zone d'effet : 4 mètres de rayon -Jet de sauvegarde : aucun - -Ce sort inflige 3d8 points de dégâts à toutes les créatures vivantes situées à moins de 4 mètres à la ronde. De plus, toute créature tuée par Destruction d'âme est aussitôt oblitérée, et son énergie vitale est transformée en squelette de 3 DV sous le contrôle du personnage. Pour chaque créature mourant de la sorte, le magicien gagne +1 en force, Dextérité et Constitution (pendant 1 tour).~ - @3300 = ~Résistance de troll~ - @3301 = ~Résistance de troll -(Nécromancie) - -Niveau : 6 -Portée : personnelle -Durée : 2 tours -Temps d'incantation : 6 -Zone d'effet : le lanceur -Jet de sauvegarde : aucun - -Ce sort confère au personnage la résistance d'un troll, ce qui lui permet de se régénérer au rythme de 5 points de vie par round.~ - @3310 = ~Convocation de monstres V~ - @3311 = ~Convocation de monstres V -(Conjuration/Convocation) - -Niveau : 7 -Portée : 6 mètres -Durée : 6 rounds + 1 round par niveau -Temps d'incantation : 6 -Zone d'effet : spéciale -Jet de sauvegarde : aucun - -Ce sort fait apparaître 1d3 monstres de niveau 5. Ils se manifestent dans la limite de portée, et le magicien peut leur ordonner d'attaquer ses adversaires jusqu'à ce que la durée du sort arrive à son terme (à moins que les monstres invoqués ne soient tués auparavant).~ - @3312 = ~Zombi ju-ju~ - @3313 = ~Minotaure~ - @3320 = ~Rage de Malavon~ - @3321 = ~Rage de Malavon -(Invocation) - -Niveau : 7 -Portée : personnelle -Durée : instantanée -Temps d'incantation : 1 -Zone d'effet : rayon de 4,5 mètres -Jet de sauvegarde : demi-dégâts - -Rage de Malavon a été inventé par un elfe noir du nom de Malavon. Sous l'effet du sort, le corps du magicien projette dans toutes les directions des rayons d'énergie noire, nuisibles pour ses alliés comme pour ses ennemis. Les barbillons magiques infligent 20d4 points de dégâts perforants à tout ce qu'ils touchent. Ce sort est particulièrement utile lorsqu'on se retrouve environné d'adversaires.~ - @3330 = ~Tempête acide~ - @3331 = ~Tempête acide -(Invocation) - -Niveau : 7 -Portée : champ visuel du lanceur -Durée : 1 round par niveau -Temps d'incantation : 7 -Zone d'effet : 7,5 mètres de rayon -Jet de sauvegarde : demi-dégâts - -Ce sort déchaîne une violente pluie acide sur la zone d'effet, ce qui inflige 1d4 points de dégâts d'acide par round pendant les trois premiers rounds, 1d6 points pendant les trois suivants, et 1d8 points par round au-delà du sixième. Quitter la zone d'effet ne signifie pas que l'on échappe au sort, car l'acide s'accroche à la peau, et toute créature affectée au début du sort continue de subir des dégâts jusqu'à ce que la tempête acide s'achève. Les victimes ont droit à un jet de sauvegarde chaque round après le premier. En cas de succès, les dégâts qu'elles subissent sont réduits de moitié (mais seulement pour le round concerné).~ - @3340 = ~Cercle d'yeux~ - @3341 = ~Cercle d'yeux -(Abjuration) - -Niveau : 7 -Portée : personnelle -Durée : 2 tours -Temps d'incantation : 7 -Zone d'effet : le lanceur -Jet de sauvegarde : aucun - -Ce sort fait apparaître sept yeux magiques flottant en cercle autour de la tête du personnage. Chacun a une vertu défensive et une autre offensive, mais chaque œil perd tout pouvoir dès qu'on s'en sert une fois. On ne peut lancer ce sort une seconde fois tant que le premier continue de faire effet, et ce même si tous les yeux ont disparu. Voici quels sont les pouvoirs de chaque œil : -- Œil de l'esprit : Cet œil protège contre les attaques mentales, telles que Charme, Émotion et Terreur. Il peut être dépensé pour lancer le sort de magicien de premier niveau Charme-personne (durée d'un tour, jet de sauvegarde contre les sorts pour annuler). -- Œil de l'épée : Cet œil détourne la première attaque physique infligeant des dégâts au personnage. L'œil peut également être dépensé pour jeter le sort de magicien de premier niveau Projectile magique, créant un projectile tous les deux niveaux d'expérience après le premier (5 projectiles maximum) qui infligent 1d4 +1 dégâts magiques. -- Œil du mage : Cet œil absorbe une attaque de type feu, électricité, froid ou acide. Il peut également être dépensé pour jeter le sort de magicien de troisième niveau Éclair, qui inflige 1d6 dégâts électriques par niveau (10d6 maximum) à toutes les créatures se trouvant sur son chemin. -- Œil du venin : Cet œil bloque une attaque ou un sort pouvant empoisonner le personnage. Il peut à la place être dépensé pour empoisonner une créature (20 points de dégâts en 20 secondes, jet de sauvegarde contre le poison pour annuler). -- Œil de l'âme : Cet œil annule un sort causant une mort instantanée (Sort de mort, Doigt de mort, Mot de pouvoir : mort, Mise à mort ou Destruction). Il peut également être transformé en un Rayon débilitant, similaire au sort de magicien de deuxième niveau, qui abaisse la force de la cible à 5 (jet de sauvegarde contre les sorts pour annuler). -- Œil de la résistance : Cet œil bloque une attaque étourdissante, assourdissante, aveuglante ou de type silence. Il peut également être dépensé pour lancer le sort de magicien de quatrième niveau Cri, qui inflige 4d6 dégâts magiques et assourdit les créatures prises dans un cône de 10,5 mètres (jet de sauvegarde contre les sorts pour diviser les dégâts par deux et annuler la surdité). -- Œil de la pierre : Cet œil protège le personnage contre une seule attaque pétrifiante. Il peut également être dépensé pour lancer le sort de magicien de troisième niveau Immobilisation des personnes, qui immobilise des créatures humanoïdes pendant un round par niveau (jet de sauvegarde contre les sorts pour annuler).~ - @3342 = ~Œil de l'esprit~ - @3343 = ~Œil de l'esprit -Cet œil protège contre les attaques mentales, telles que Charme, Émotion et Terreur. -Il peut être dépensé pour lancer le sort de magicien de premier niveau Charme-personne (durée d'un tour, jet de sauvegarde contre les sorts pour annuler).~ - @3344 = ~Œil de l'épée~ - @3345 = ~Œil de l'épée -Cet œil détourne la première attaque physique infligeant des dégâts au personnage. -L'œil peut également être dépensé pour jeter le sort de magicien de premier niveau Projectile magique, créant un projectile tous les deux niveaux d'expérience après le premier (5 projectiles maximum) qui infligent 1d4 +1 points de dégâts magiques.~ - @3346 = ~Œil du mage~ - @3347 = ~Œil du mage -Cet œil absorbe une attaque de type feu, électricité, froid ou acide. -Il peut également être dépensé pour jeter le sort de magicien de troisième niveau Éclair, qui inflige 1d6 dégâts électriques par niveau (10d6 maximum) à toutes les créatures se trouvant sur son chemin.~ - @3348 = ~Œil du venin~ - @3349 = ~Œil du venin -Cet œil bloque une attaque ou un sort pouvant empoisonner le personnage. -Il peut à la place être dépensé pour empoisonner une créature (20 points de dégâts en 20 secondes, jet de sauvegarde contre le poison pour annuler).~ - @3350 = ~Œil de l'âme~ - @3351 = ~Œil de l'âme -Cet œil annule un sort causant une mort instantanée (Sort de mort, Doigt de mort, Mot de pouvoir mortel, Mise à mort ou Destruction). -Il peut également être transformé en un Rayon débilitant, similaire au sort de magicien de deuxième niveau, qui abaisse la force de la cible à 5 (jet de sauvegarde contre les sorts pour annuler).~ - @3352 = ~Œil de la résistance~ - @3353 = ~Œil de la résistance -Cet œil bloque une attaque étourdissante, assourdissante, aveuglante ou de type silence. -Il peut également être dépensé pour lancer le sort de magicien de quatrième niveau Cri, qui inflige 4d6 points de dégâts magiques et assourdit les créatures prises dans un cône de 10,5 mètres (jet de sauvegarde contre les sorts pour diviser les dégâts par deux et annuler la surdité).~ - @3354 = ~Œil de la pierre~ - @3355 = ~Œil de la pierre -Cet œil protège le personnage contre une seule attaque pétrifiante. -Il peut également être dépensé pour lancer le sort de magicien de troisième niveau Immobilisation des personnes, qui immobilise des créatures humanoïdes pendant un round par niveau (jet de sauvegarde contre les sorts pour annuler).~ - @3356 = ~L'Œil de la pierre bloque un effet magique et se dissipe.~ - @3357 = ~L'Œil de la résistance bloque un effet magique et se dissipe.~ - @3358 = ~L'Œil de l'âme bloque un effet magique et se dissipe.~ - @3359 = ~L'Œil du venin bloque un effet magique et se dissipe.~ - @3360 = ~L'Œil du mage bloque un effet magique et se dissipe.~ - @3361 = ~L'Œil de l'épée bloque un effet magique et se dissipe.~ - @3362 = ~L'Œil de l'esprit bloque un effet magique et se dissipe.~ - @3370 = ~Suffocation~ - @3371 = ~Suffocation -(Transmutation) - -Niveau : 7 -Portée : champ visuel du lanceur -Durée : 4 rounds -Temps d'incantation : 7 -Zone d'effet : 4 mètres de rayon -Jet de sauvegarde : demi-dégâts - -Ce sort vide les poumons de toutes les créatures se trouvant dans la zone d'effet. Les êtres qui ne respirent pas sont immunisés contre cette attaque. Les autres subissent les effets suivants : -4 à la CA, -4 à l'attaque, -6 en Dextérité, une attaque de moins par round, vitesse de déplacement réduite de moitié, et 4d8 points de dégâts par round. Un jet de sauvegarde réussi annule les effets sauf 2d8 points de dégâts pour le round en cours. Les effets se dissipent lentement quand la cible quitte la zone d'effet, mais un round est parfois nécessaire avant de trouver son second souffle.~ - @3380 = ~Convocation de monstres VI~ - @3381 = ~Convocation de monstres VI -(Conjuration/Convocation) - -Niveau : 8 -Portée : 6 mètres -Durée : 7 rounds + 1 round par niveau -Temps d'incantation : 8 -Zone d'effet : spéciale -Jet de sauvegarde : aucun - -Ce sort fait apparaître 1d3 monstres de niveau 6. Ils se manifestent dans la limite de portée, et le magicien peut leur ordonner d'attaquer ses adversaires jusqu'à ce que la durée du sort arrive à son terme (à moins que les monstres invoqués ne soient tués auparavant).~ - @3382 = ~Salamandre~ - @3383 = ~Salamandre du givre~ - @3390 = ~Esprit impénétrable~ - @3391 = ~Esprit impénétrable -(Abjuration) - -Niveau : 8 -Portée : personnelle -Durée : 24 heures -Temps d'incantation : 1 -Zone d'effet : le lanceur -Jet de sauvegarde : aucun - -Esprit impénétrable est le meilleur garant d'intimité qui soit, puisqu'il protège de presque tous les effets mentaux, tels que le charme, le sort de Labyrinthe, la débilité mentale, la confusion, la terreur, l'ébriété, la rage sanguinaire, l'immobilisation et la pétrification.~ - @3400 = ~Grand cri~ - @3401 = ~Grand cri -(Évocation) - -Niveau : 8 -Portée : personnelle -Durée : instantanée -Temps d'incantation : 1 -Zone d'effet : cône de 10,5 mètres de long et de 15 degrés d'angle -Jet de sauvegarde : demi-dégâts - -Au terme de l'incantation, le personnage libère un cri terrible dans un cône de 10,5 mètres de long pour un angle de 15 degrés. L'effort exigé de la part du magicien est tel que ce dernier perd 2d4 points de vie et doit réussir un jet de sauvegarde contre les sorts sous peine de perdre connaissance pendant un round. Les créatures ayant 5 DV ou moins meurent instantanément si elles sont prises dans la zone d'effet du Grand cri. Toutes les autres cibles ont droit à un jet de sauvegarde contre les sorts. Celles qui le ratent sont étourdies pour 2 rounds, assourdies pour 4 rounds, et perdent 4d12 points de vie. Pour celles qui le réussissent, l'effet est deux fois moindre (1 round d'étourdissement, 2 rounds de surdité et 2d12 points de dégâts).~ - @3410 = ~Corps de fer~ - @3411 = ~Corps de fer -(Transmutation) - -Niveau : 8 -Portée : personnelle -Durée : 2 tours -Temps d'incantation : 8 -Zone d'effet : le lanceur -Jet de sauvegarde : aucun - -Ce sort transforme le corps du personnage en fer vivant, ce qui lui confère plusieurs pouvoirs distincts. Tant que le sort fait effet, le personnage bénéficie des résistances suivantes : 100 % contre l'électricité, 50 % contre le feu et 25 % contre les attaques contondantes. Il est en outre immunisé contre les sorts affectant la respiration ou la physiologie. De plus, sa Force passe à 25 et il peut donner deux coups de poing par round (2d4 points de dégâts + bonus de Force). Malheureusement, les mouvements du personnage deviennent lents et gourds, ce qui réduit sa vitesse de déplacement de 75 % et l'empêche de lancer le moindre sort tant que Corps de fer fait effet.~ - @3412 = ~Poing de fer~ - @3420 = ~Convocation de monstres VII~ - @3421 = ~Convocation de monstres VII -(Conjuration/Convocation) - -Niveau : 9 -Portée : 6 mètres -Durée : 8 rounds + 1 round par niveau -Temps d'incantation : 9 -Zone d'effet : spéciale -Jet de sauvegarde : aucun - -Ce sort fait apparaître 1d2 monstres de niveau 7 ou 8. Ils se manifestent dans la limite de portée, et le magicien peut leur ordonner d'attaquer ses adversaires jusqu'à ce que la durée du sort arrive à son terme (à moins que les monstres invoqués ne soient tués auparavant).~ - @3422 = ~Squelette de garde~ - @4010 = ~Imprécation~ - @4011 = ~Imprécation -(Conjuration/Convocation) - -Niveau : 1 -Sphère : Générale -Portée : champ visuel du lanceur -Durée : 6 rounds -Temps d'incantation : 1 round -Zone d'effet : rayon de 9 mètres -Jet de sauvegarde : aucun - -Grâce à ce sort, le prêtre diminue le moral de ses adversaires et pénalise de -1 leurs jets de sauvegarde et d'attaque. Dès que l'incantation s'achève, le sort affecte toutes les créatures se trouvant dans un cube de 15 mètres d'arête, dont le centre est choisi par le prêtre (les créatures quittant la zone d'effet sont toujours affectées ; par contre, celles qui y entrent par la suite ne le sont pas).~ - @4020 = ~Blessures légères~ - @4021 = ~Blessures légères -(Nécromancie) - -Niveau : 1 -Sphère : Guérison -Portée : toucher -Durée : instantanée -Temps d'incantation : 5 -Zone d'effet : 1 créature -Jet de sauvegarde : demi-dégâts - -Une fois qu'il a lancé ce sort, le prêtre inflige 8 points de dégâts à la première créature qu'il touche (4 points en cas de jet de sauvegarde réussi). Ce sort reste sans effet sur les morts-vivants, les créatures artificielles ou extra-planaires. Il ne peut être lancé par un personnage d'alignement bon.~ - @4030 = ~Soleil ardent~ - @4031 = ~Soleil ardent -(Évocation) - -Niveau : 1 -Sphère : Soleil -Portée : champ visuel du lanceur -Durée : instantanée -Temps d'incantation : 4 -Zone d'effet : 1 créature -Jet de sauvegarde : demi-dégâts - -Au terme de l'incantation, un rayon de soleil tombe du ciel et va frapper la cible désignée par le prêtre. La victime réduit les dégâts de moitié si elle réussit un jet de sauvegarde contre les sorts. Si elle est touchée, elle subit 1d6 points de dégâts, +1 par niveau du prêtre. Les morts-vivants et autres créatures vulnérables à la lumière du jour encaissent 1d6 points de dégâts, +2 par niveau du personnage. De plus, les victimes sont aveuglées pendant 3 rounds.~ - @4040 = ~Soin des blessures modérées~ - @4041 = ~Soin des blessures modérées -(Nécromancie) - -Niveau : 2 -Sphère : Guérison -Portée : toucher -Durée : instantanée -Temps d'incantation : 5 -Zone d'effet : 1 créature -Jet de sauvegarde : aucun - -Cette version plus puissante de Soin des blessures légères permet à la créature touchée de récupérer 11 points de vie et de soigner l'ébriété. Ce sort reste sans effet sur les morts-vivants, les créatures artificielles ou extra-planaires.~ - @4042 = ~Le personnage sélectionné est soigné et récupère 11 points de vie.~ - @4050 = ~Lance d'alicorne~ - @4051 = ~Lance d'alicorne -(Évocation) - -Niveau : 2 -Sphère : Combat -Portée : champ visuel du lanceur -Durée : instantanée -Temps d'incantation : 5 -Zone d'effet : 1 créature -Jet de sauvegarde : spécial - -Ce sort fait apparaître une lance argentée et partiellement éthérée en forme d'alicorne (une corne de licorne). Le personnage choisit sa cible, et la lance d'alicorne va aussitôt la transpercer, lui infligeant 3d6 points de dégâts perforants (ou deux fois moins en cas de jet de sauvegarde réussi). Même si la lance se dissipe instantanément après l'impact, elle laisse une aura argentée autour de la cible, rendant celle-ci plus facile à toucher (-2 à la CA pendant 3 rounds).~ - @4052 = ~Entouré d'une aura argentée (-2 à la CA)~ - @4060 = ~Griffes~ - @4061 = ~Griffes -(Transmutation) - -Niveau : 2 -Sphère : Combat -Portée : personnelle -Durée : 1 tour -Temps d'incantation : 5 -Zone d'effet : le lanceur -Jet de sauvegarde : aucun - -Ce sort transforme les bras du personnage en pattes musclées et dotées de griffes, qui lui confèrent une Force de 18/72 et la faculté de lacérer ses adversaires (2d4 points de dégâts + bonus de Force). Le personnage peut frapper deux fois par round, avec un bonus de 2 à l'attaque.~ - @4070 = ~Blessures modérées~ - @4071 = ~Blessures modérées -(Nécromancie) - -Niveau : 2 -Sphère : Guérison -Portée : toucher -Durée : instantanée -Temps d'incantation : 5 -Zone d'effet : 1 créature -Jet de sauvegarde : demi-dégâts - -En lançant ce sort, le personnage peut, en touchant la créature ciblée, lui infliger 11 points de dégâts (jet de sauvegarde contre les sorts pour demi-dégâts). Ce sort reste sans effet sur les morts-vivants, les créatures artificielles et extra-planaires. Il ne peut être lancé par des personnages d'alignement bon.~ - @4080 = ~Prière~ - @4081 = ~Prière -(Conjuration/Convocation) - -Niveau : 3 -Sphère : Combat -Portée : personnelle -Durée : 1 round par niveau -Temps d'incantation : 6 -Zone d'effet : 18 mètres de rayon -Jet de sauvegarde : aucun - -Prière favorise le prêtre et ses alliés, tout en maudissant leurs ennemis. Tous les jets d'attaque, de dégâts et de sauvegarde des compagnons du prêtre bénéficient d'un bonus de 1, tandis que ses adversaires subissent un malus de 1. Les créatures situées dans la zone d'effet au moment où le sort est lancé continuent d'être affectées même si elles la quittent. Autrement dit, si le guerrier du groupe décide de poursuivre un gobelin, Prière l'aide toujours.~ - @4082 = ~Pénalités de combat~ - @4083 = ~Bonus de combat~ - @4090 = ~Contagion~ - @4091 = ~Contagion -(Nécromancie) - -Niveau : 3 -Sphère : Guérison -Portée : toucher -Durée : 8 heures -Temps d'incantation : 9 -Zone d'effet : 1 créature -Jet de sauvegarde : annule - -La créature touchée par le prêtre contracte une maladie qui lui fait perdre 5d4 points de Force si elle rate son jet de sauvegarde contre les sorts. Contagion reste sans effet sur les morts-vivants, créatures artificielles et créatures extra-planaires. Ce sort ne peut être jeté par les personnages d'alignement bon.~ - @4100 = ~Exaltation~ - @4101 = ~Exaltation -(Abjuration) - -Niveau : 3 -Sphère : Guérison -Portée : toucher -Durée : 1 tour -Temps d'incantation : 9 -Zone d'effet : 1 créature -Jet de sauvegarde : aucun - -Ce sort permet au prêtre d'aider et de protéger un compagnon (mais pas lui-même). D'un simple contact, le prêtre fait disparaître les effets de la peur, de la fatigue, de la débilité, de l'inconscience, de l'ébriété, de la confusion et de la rage sanguinaire. De plus, le sujet est protégé contre les sorts et attaques provoquant ces effets jusqu'au terme de la durée indiquée.~ - @4110 = ~Lame de lune~ - @4111 = ~Lame de lune -(Invocation) - -Niveau : 3 -Sphère : Combat, Soleil -Portée : personnelle -Durée : 2 tours -Temps d'incantation : 6 -Zone d'effet : le lanceur -Jet de sauvegarde : aucun - -Ce sort fait apparaître une épée silencieuse entièrement constituée de clarté lunaire et s'étendant à 1,20 mètre de la main du personnage. Elle est considérée comme une arme +4 afin de déterminer ce qu'elle peut toucher, même si ce bonus ne s'applique pas au TAC0. Comme il s'agit d'une arme dénuée de substance, les bonus de Force du personnage ne s'appliquent ni à l'attaque ni aux dégâts. -La lame de lune absorbe l'énergie de la cible, ce qui se traduit par un total de 1d12 +4 points de dégâts à chaque coup, +1d12 points pour les morts-vivants, qui sont particulièrement vulnérables à ce sort. De plus, la lame a une action négative sur le flux des énergies magiques, avec pour conséquence que tout sort que la cible cherche à lancer lors du prochain round échoue automatiquement.~ - @4120 = ~Cercle d'ossements~ - @4121 = ~Cercle d'ossements -(Nécromancie) - -Niveau : 3 -Sphère : Création, Garde -Portée : personnelle -Durée : 3 rounds -Temps d'incantation : 3 -Zone d'effet : 1 mètre de rayon -Jet de sauvegarde : aucun - -Ce sort fait apparaître une barrière d'ossements flottants qui tourbillonnent rapidement autour du personnage. Quiconque tente de la franchir subit 1d6 points de dégâts contondants et 1d6 points de dégâts tranchants par round. Le personnage ne peut pas se déplacer tant que le sort fait effet. Cercle d'ossements ne peut être lancé par les personnages d'alignement bon.~ - @4130 = ~Croissance d'épines~ - @4131 = ~Croissance d'épines -(Transmutation) - -Niveau : 3 -Sphère : Élémentaire (Terre) -Portée : champ visuel du lanceur -Durée : 1 tour -Temps d'incantation : 6 -Zone d'effet : 5 mètres de rayon -Jet de sauvegarde : aucun - -Ce sort transforme la végétation affectée en plantes épineuses. Toute créature pénétrant dans la zone d'effet subit 1d4 points de dégâts tranchants et 1d4 points de dégâts perforants par round, jusqu'au terme du sort.~ - @4140 = ~Trombes d'eau~ - @4141 = ~Trombes d'eau -(Évocation) - -Niveau : 3 -Sphère : Élémentaire (Eau) -Portée : champ visuel du lanceur -Durée : 2 rounds -Temps d'incantation : 6 -Zone d'effet : 10,5 mètres de rayon -Jet de sauvegarde : aucun - -Ce sort génère une pluie diluvienne dans la zone d'effet. Toutes les créatures à base de feu ou de froid (ou vivant dans ces éléments) perdent 2d3 points de vie par round. De plus, toutes les créatures situées dans la zone d'effet ont 50 % de chances par round d'être frappées par la foudre (2d6 points de dégâts, ou deux fois moins en cas de jet de sauvegarde réussi). Les sorts de Lame de feu et de Linceul de flammes, ainsi que l'aura des salamandres, sont éteints par Trombes d'eau.~ - @4150 = ~Moisissure~ - @4151 = ~Moisissure -(Transmutation) - -Niveau : 3 -Sphère : Flore -Portée : toucher -Durée : spéciale -Temps d'incantation : 6 -Zone d'effet : rayon de 3 mètres -Jet de sauvegarde : spécial - -Ce sort couvre rapidement la créature touchée par le lanceur d'une moisissure brune à même sa peau. La créature infectée a droit à un jet de sauvegarde contre les sorts. En cas d'échec, l'infection est sévère et les dégâts subis sont les suivants : -1er round : 4d6 points -2e round : 3d6 points -3e round : 2d6 points -4e round : 1d6 points -Si le jet de sauvegarde est réussi, les dégâts sont moins importants : -1er round : 2d6 points -2e round : 1d6 points -3e round : 1d6 points - -Chaque round après le premier, la plus proche créature (dans un rayon de 3 mètres) doit réussir un jet de sauvegarde sous peine d'être affectée à son tour. Le processus se poursuit jusqu'à ce que la moisissure soit incapable d'infecter un nouvel hôte dans le temps imparti. Les créatures déjà affectées ne peuvent l'être une nouvelle fois. La moisissure brune meurt rapidement au terme de la durée du sort.~ - @4160 = ~Protection anti-tempête~ - @4161 = ~Protection anti-tempête -(Abjuration) - -Niveau : 3 -Sphère : Climat, Protection -Portée : personnelle -Durée : 1 tour -Temps d'incantation : 6 -Zone d'effet : le lanceur -Jet de sauvegarde : aucun - -Le personnage se retrouve entouré d'une sphère d'énergie noire qui se déplace avec lui. Toutes les attaques de type feu, froid ou électricité lui infligent automatiquement des dégâts réduits de moitié.~ - @4170 = ~Blessures moyennes~ - @4171 = ~Blessures moyennes -(Nécromancie) - -Niveau : 3 -Sphère : Guérison -Portée : toucher -Durée : instantanée -Temps d'incantation : 5 -Zone d'effet : 1 créature -Jet de sauvegarde : demi-dégâts - -En lançant ce sort, le personnage peut, en touchant la créature ciblée, lui infliger 14 points de dégâts (jet de sauvegarde contre les sorts pour demi-dégâts). Ce sort reste sans effet sur les morts-vivants, les créatures artificielles et extra-planaires. Il ne peut être lancé par des personnages d'alignement bon.~ - @4180 = ~Faveur d'Ilmater~ - @4181 = ~Faveur d'Ilmater -(Nécromancie) - -Niveau : 3 -Sphère : Nécromancie, Protection -Portée : 9 mètres -Durée : instantanée -Temps d'incantation : 6 -Zone d'effet : 1 créature -Jet de sauvegarde : aucun - -En lançant ce sort, le personnage échange sa force de vie avec celle de la cible, ce qui échange également leurs blessures physiques. Ce sort fonctionnera uniquement si le lanceur dispose de plus de points de vie que la cible. L'échange est permanent, et le lanceur peut soigner les blessures acquises avec les méthodes habituelles. L'échange peut être fait à distance, dans la limite de la portée du sort. Seuls les points de vie sont échangés, le lanceur ne peut pas "prendre" à la cible d'autres types de dommages, tels que le poison, la maladie, l'ébriété, etc. Ce sort reste sans effet sur les morts-vivants, les créatures artificielles et extra-planaires. Il ne peut être lancé par un personnage d'alignement mauvais.~ - @4190 = ~Insecte géant~ - @4191 = ~Insecte géant -(Transmutation) - -Niveau : 4 -Sphère : Faune -Portée : champ visuel du lanceur -Durée : 8 heures -Temps d'incantation : 7 -Zone d'effet : spéciale -Jet de sauvegarde : aucun - -Ce sort invoque 2 ou 3 scarabées scolytes ou scarabées bombardiers. Les insectes seront aux ordres du lanceur jusqu'à leur mort ou l'expiration de la durée du sort.~ - @4192 = ~Scarabée bombardier~ - @4193 = ~Libère des vapeurs acides~ - @4200 = ~Flammes~ - @4201 = ~Flammes -(Transmutation) - -Niveau : 4 -Sphère : Élémentaire (Feu) -Portée : champ visuel du lanceur -Durée : 1 round -Temps d'incantation : 7 -Zone d'effet : rayon de 2,5 mètres -Jet de sauvegarde : aucun - -Ce sort fait apparaître des flammes causant 1d4 points de dégâts plus 1 point par niveau du prêtre à toutes les créatures situées dans la zone d'effet.~ - @4210 = ~Électricité statique~ - @4211 = ~Électricité statique -(Transmutation) - -Niveau : 4 -Sphère : Climat -Portée : personnelle -Durée : 1 tour par niveau -Temps d'incantation : 9 -Zone d'effet : champ visuel du lanceur -Jet de sauvegarde : demi-dégâts - -Électricité statique est similaire à Appel de la foudre, si ce n'est qu'il est possible de l'utiliser en intérieur. Le sort permet de générer une charge d'électricité statique dans la zone d'effet, ce qui inflige 2d8 points de dégâts plus 1d8 par niveau du prêtre. La charge se déclenche une fois par tour jusqu'à ce que le sort arrive à son terme.~ - @4212 = ~Décharge d'électricité statique~ - @4220 = ~Récitation~ - @4221 = ~Récitation -(Abjuration, Invocation/Évocation) - -Niveau : 4 -Sphère : Combat -Portée : personnelle -Durée : 1 round par niveau -Temps d'incantation : 7 -Zone d'effet : rayon de 18 mètres -Jet de sauvegarde : aucun - -En récitant un passage de texte sacré, le prêtre invoque la bénédiction de son dieu sur lui-même et ses alliés, tout en affaiblissant ses ennemis et en semant la confusion dans leurs rangs. Les compagnons du prêtre bénéficient d'un bonus de 2 à leurs jets d'attaque et de sauvegarde, tandis que ses adversaires subissent une pénalité de 2. Ce sort n'annule pas Prière ; tous deux peuvent être jetés en même temps, auquel cas leurs effets se cumulent.~ - @4230 = ~Rage sanguinaire~ - @4231 = ~Rage sanguinaire -(Transmutation) - -Niveau : 4 -Sphère : Combat -Portée : champ visuel du lanceur -Durée : 2 tours -Temps d'incantation : 7 -Zone d'effet : 1 créature -Jet de sauvegarde : aucun - -Ce sort ne fonctionne que sur les personnages et leurs alliés. Le sujet est aussitôt pris d'une rage meurtrière : il s'acharne sur la créature la plus proche jusqu'à la tuer, puis passe à la suivante. Sous l'emprise de ce sort, le sujet est immunisé contre l'étourdissement et les effets de type Charme, Sommeil, Terreur, Immobilisation, Confusion, Émotion et Symbole. De plus, il gagne +2 à l'attaque, +3 aux dégâts, +2 en force, 10 points de vie et un bonus à sa vitesse de déplacement. Cela étant, le sort présente également certains inconvénients : les points de vie du sujet sont masqués jusqu'au terme de la durée indiquée, et il ne peut bénéficier d'aucun effet permettant de récupérer des points de vie. Quand le sort s'achève, le personnage se sent pris d'une grande fatigue et tombe à 3 de Force pendant 2 tours. Les créatures d'alignement loyal ne peuvent ni avoir recours à Rage sanguinaire, ni être affecté par ce sort.~ - @4240 = ~Nuage de pestilence~ - @4241 = ~Nuage de pestilence -(Transmutation) - -Niveau : 4 -Sphère : Combat, Élémentaire (Air) -Portée : champ visuel du lanceur -Durée : 4 rounds -Temps d'incantation : 7 -Zone d'effet : 7,5 mètres de rayon -Jet de sauvegarde : annule - -Ce sort transforme l'air en brume gris-vert à 7,5 mètres à la ronde. Le personnage est immunisé contre l'effet des vapeurs, de même que les créatures qui ne respirent pas. Quant aux autres, elles perdent la vue, 3 points de Dextérité et 3 points de vie par round. Ces effets durent 1 tour. Nuage de pestilence ne peut être lancé que par les personnages mauvais.~ - @4250 = ~Endurance infaillible~ - @4251 = ~Endurance infaillible -(Nécromancie) - -Niveau : 4 -Sphère : Nécromancie -Portée : toucher -Durée : instantanée -Temps d'incantation : 9 -Zone d'effet : 1 créature -Jet de sauvegarde : aucun - -Ce sort permet à la créature touchée de recouvrer les forces perdues au cours des 36 dernières heures (par une succession d'efforts physiques). Notez qu'il n'est pas forcément suffisant pour sortir d'un état fatigué.~ - @4260 = ~Masse d'armes météorique~ - @4261 = ~Masse d'armes météorique -(Conjuration) - -Niveau : 4 -Sphère : Combat -Portée : personnelle -Durée : 3 tours -Temps d'incantation : 7 -Zone d'effet : le lanceur -Jet de sauvegarde : aucun - -Ce sort crée une masse d'armes en fer météorique infligeant 1d6 +2 dégâts contondants, bénéficiant d'un bonus de +2 à l'attaque et considérée comme une arme +4 afin de déterminer ce qu'elle peut toucher. Tous les bonus habituels s'appliquent normalement (Force, compétence et spécialisation). La masse inflige 2d6 points de dégâts contondants supplémentaires aux créatures qui ne sont pas d'origine naturelle (morts-vivants, élémentaires, golems, entités extra-planaires, etc.).~ - @4270 = ~Vague destructrice~ - @4271 = ~Vague destructrice -(Évocation) - -Niveau : 4 -Sphère : Élémentaire (Eau) -Portée : 30 mètres -Durée : instantanée -Temps d'incantation : 1 round -Zone d'effet : spéciale -Jet de sauvegarde : spécial - -Le sort appelle une vague d'eau qui se dirige dans la direction déterminée par le personnage, occasionnant de terribles ravages sur son passage. Toute créature touchée subit 4d10 points de dégâts contondants et a 25 % de chances de se retrouver étourdie pour 2 rounds, ainsi que 5 % de chances de perdre connaissance. En cas de jet de sauvegarde réussi contre les souffles, les dégâts sont réduits de moitié et il n'y a aucun risque d'étourdissement ou de perte de connaissance.~ - @4280 = ~Projection d'épines~ - @4281 = ~Projection d'épines -(Transmutation) - -Niveau : 4 -Sphère : Flore -Portée : 9 mètres -Durée : instantanée -Temps d'incantation : 3 -Zone d'effet : cône de 9 mètres de long et de 90 degrés d'angle -Jet de sauvegarde : demi-dégâts - -Ce sort fait jaillir un grand nombre d'épines, pics, barbillons et pointes de la main tendue du personnage. Les projectiles couvrent une zone conique de 9 mètres de long et de 90 degrés d'angle. Ils infligent 2d10 points de dégâts perforants à toutes les créatures touchées, ou 1d10 en cas de jet de sauvegarde réussi contre la mort magique.~ - @4290 = ~Mur de lune~ - @4291 = ~Mur de lune -(Évocation) - -Niveau : 4 -Sphère : Protection, Soleil -Portée : champ visuel du lanceur -Durée : 1 tour -Temps d'incantation : 7 -Zone d'effet : mur de 6 mètres de long sur 1,50 mètre d'épaisseur -Jet de sauvegarde : aucun - -Ce sort fait apparaître un mur luisant d'énergie blanc-bleu. Il est intangible et n'a pas besoin d'être ancré à des points fixes. On peut passer librement au travers, mais les créatures d'alignement mauvais qui s'y risquent subissent 2d10 points de dégâts (5d10 pour les morts-vivants d'alignement mauvais). Une créature blessée par le mur ne peut être affectée une seconde fois, même si elle le retraverse. Plusieurs Murs de lune ne peuvent fonctionner en même temps.~ - @4300 = ~Juste courroux des fidèles~ - @4301 = ~Juste courroux des fidèles -(Enchantement/Charme) - -Niveau : 5 -Sphère : Combat -Portée : personnelle -Durée : 1 round par niveau -Temps d'incantation : 8 -Zone d'effet : 10,5 mètres de rayon -Jet de sauvegarde : aucun - -Ce sort confère une sorte de folie divine aux alliés du prêtre, ce qui améliore leurs facultés martiales. Tous les compagnons du prêtre se trouvant dans la zone d'effet bénéficient d'un bonus de 1 aux jets d'attaque et de sauvegarde, tout en gagnant 8 points de vie supplémentaires (pouvant leur permettre de dépasser temporairement leur maximum de points de vie). S'ils ont le même alignement que le prêtre, le bonus auquel ils ont droit passe à 2 et s'applique également aux jets de dégâts, et ils gagnent l'immunité aux sorts de charme et d'immobilisation, ainsi qu'une attaque supplémentaire par round. Les cibles du sort seront sujettes à la fatigue une fois que l'enchantement prendra fin.~ - @4310 = ~Pierres acérées~ - @4311 = ~Pierres acérées -(Transmutation, Enchantement) - -Niveau : 5 -Sphère : Élémentaire (Terre) -Portée : champ visuel du lanceur -Durée : 12 rounds -Temps d'incantation : 6 -Zone d'effet : 5 mètres de rayon -Jet de sauvegarde : spécial - -Ce sort déforme la roche pour faire apparaître des pointes camouflées et invisibles. Toute créature pénétrant dans la zone d'effet perd 2d4 points de vie par round et doit réussir un jet de sauvegarde contre les sorts ou voir sa vitesse de déplacement diminuer de 30 %.~ - @4320 = ~Bouclier de Lathandre~ - @4321 = ~Bouclier de Lathandre -(Conjuration) - -Niveau : 5 -Sphère : Garde -Portée : toucher -Durée : 2 rounds -Temps d'incantation : 8 -Zone d'effet : 1 créature -Jet de sauvegarde : aucun - -Le sujet est immunisé contre les dégâts jusqu'au terme de la durée indiquée. Bouclier de Lathandre ne peut protéger une créature d'alignement mauvais. Seul un personnage d'alignement non-mauvais peut lancer ce sort.~ - @4330 = ~Vigilance contre les morts-vivants~ - @4331 = ~Vigilance contre les morts-vivants -(Nécromancie) - -Niveau : 5 -Sphère : Glyphes -Portée : personnelle -Durée : 1 tour -Temps d'incantation : 7 -Zone d'effet : 6 mètres de rayon -Jet de sauvegarde : aucun - -Ce sort amplifie l'influence que le prêtre a sur les morts-vivants, mais il est lié à une zone statique. Tout mort-vivant pénétrant dans la zone d'effet est automatiquement affecté comme si le prêtre venait d'essayer de le repousser. En cas d'échec, le mort-vivant est immunisé contre le sort, sauf s'il quitte la zone d'effet pour y revenir par la suite.~ - @4340 = ~Rage animale~ - @4341 = ~Rage animale -(Enchantement) - -Niveau : 5 -Sphère : Combat -Portée : toucher -Durée : 15 rounds -Temps d'incantation : 8 -Zone d'effet : 1 créature -Jet de sauvegarde : aucun - -Ce sort confère au sujet la férocité d'une bête sauvage, ce qui se traduit par les avantages suivants : 19 en force, +20 points de vie, +20 % en vitesse de déplacement et +2 à tous les jets de sauvegarde. Par contre, le sujet ne peut jeter le moindre sort tant que Rage animale fait effet. Il peut être contrôlé normalement, sauf s'il aperçoit le moindre ennemi, auquel cas il se rue sur lui en utilisant toutes les armes possibles et imaginables. Chaque round, il y a 5 % de chances que le personnage devienne totalement enragé et attaque tout le monde, amis comme ennemis.~ - @4350 = ~Blessures légères de masse~ - @4351 = ~Blessures légères de masse -(Nécromancie) - -Niveau : 5 -Sphère : Guérison -Portée : personnelle -Durée : instantanée -Temps d'incantation : 5 -Zone d'effet : rayon de 9 mètres -Jet de sauvegarde : demi-dégâts - -Avec ce sort, le lanceur inflige 1d8 dégâts, +1 point de dégât par niveau, aux adversaires à proximité. Un jet de sauvegarde contre les sorts permet de diviser les dégâts par 2. Ce sort reste sans effet contre les morts-vivants, les créatures artificielles et extra-planaires. Ce sort ne peut être lancé que par des personnages d'alignement mauvais.~ - @4360 = ~Bouclier entropique~ - @4361 = ~Bouclier entropique -(Abjuration) - -Niveau : 6 -Sphère : Protection -Portée : personnelle -Durée : 1 round par niveau -Temps d'incantation : 9 -Zone d'effet : le lanceur -Jet de sauvegarde : aucun - -Ce sort entoure le prêtre d'une aura d'énergie stoppant ou détournant la plupart des attaques. Elle confère un bonus de +6 à la CA et 50 % de résistance à la magie contre la plupart des attaques (feu, froid, électricité, etc.). Enfin, le prêtre bénéficie d'un bonus de +2 à tous ses jets de sauvegarde, tout en étant immunisé contre les projectiles.~ - @4370 = ~Tornade~ - @4371 = ~Tornade -(Évocation) - -Niveau : 6 -Sphère : Élémentaire (Air) -Portée : champ visuel du lanceur -Durée : spéciale -Temps d'incantation : 9 -Zone d'effet : spéciale -Jet de sauvegarde : spécial - -Ce sort génère un petit tourbillon à proximité du personnage, lequel peut l'envoyer en n'importe quel point de son champ de vision. Une fois que le tourbillon atteint sa destination, le prêtre peut cesser de le contrôler et le tourbillon se déplace alors au hasard, affectant toutes les créatures qu'il touche. Le personnage est immunisé contre l'effet du sort, de même que les élémentaires et les créatures énormes ou plus. Toute autre créature prise dans le tourbillon subit 2d8 points de dégâts contondant et 2d8 points de dégâts tranchants. Elle doit également réussir un jet de sauvegarde contre les souffles pour ne pas être étourdie pendant 2 rounds. Les créatures de 2 DV ou moins sont automatiquement tuées par ce sort. Le tourbillon peut affecter un maximum de 8 cibles, après quoi il se dissipe.~ - @4380 = ~Courroux spirituel~ - @4381 = ~Courroux spirituel -(Évocation) - -Niveau : 6 -Sphère : Combat -Portée : champ visuel du lanceur -Durée : instantanée -Temps d'incantation : 2 -Zone d'effet : spéciale -Jet de sauvegarde : demi-dégâts - -Au terme de l'incantation, le prêtre canalise l'énergie spirituelle pour la libérer sous forme d'éclairs dans quatre directions. Le personnage en choisit une, les autres éclairs partant à angle droit du premier (en forme de croix). Toute créature touchée par un éclair subit 4d10 points de dégâts, total réduit de moitié en cas de jet de sauvegarde réussi. Les créatures ayant la même composante morale d'alignement que le lanceur (bien, mal ou neutralité) ne sont pas affectées.~ - @4390 = ~Symbole : douleur~ - @4391 = ~Symbole : douleur -(Conjuration/Convocation) - -Niveau : 7 -Sphère : Garde -Portée : champ visuel du lanceur -Durée : 11 tours -Temps d'incantation : 3 -Zone d'effet : 9 mètres de rayon -Jet de sauvegarde : annule - -Toutes les créatures situées à moins de 9 mètres du symbole doivent effectuer un jet de sauvegarde contre les sorts. En cas d'échec, la douleur qu'elles ressentent se traduit par -4 aux jets d'attaque et -2 en Dextérité et à la CA.~ - @4392 = ~Douleurs atroces~ - @4393 = ~Douleur~ - @4400 = ~Symbole : désespoir~ - @4401 = ~Symbole : désespoir -(Conjuration/Convocation) - -Niveau : 7 -Sphère : Garde -Portée : champ visuel du lanceur -Durée : 2 tours -Temps d'incantation : 3 -Zone d'effet : 9 mètres de rayon -Jet de sauvegarde : annule - -Toutes les créatures situées à moins de 9 mètres du symbole doivent effectuer un jet de sauvegarde contre les sorts (à -2). En cas d'échec, elles sont tellement dépitées et découragées qu'elles ne se défendent même pas lorsqu'on les attaque.~ - @4410 = ~Citadelle de l'âme~ - @4411 = ~Citadelle de l'âme -(Abjuration) - -Niveau : 7 -Sphère : Protection -Portée : personnelle -Durée : 1 tour par niveau -Temps d'incantation : 9 -Zone d'effet : le lanceur -Jet de sauvegarde : aucun - -Ce sort immunise l'esprit du prêtre contre toute influence extérieure. Tant que le sort fait effet, le personnage est immunisé aux effets de charme, confusion, terreur, débilité mentale, immobilisation, sommeil, sort de Labyrinthe et ébriété.~ - @4420 = ~Destruction~ - @4421 = ~Destruction -(Nécromancie) - -Niveau : 7 -Sphère : Guérison -Portée : toucher -Durée : instantanée -Temps d'incantation : 9 -Zone d'effet : le lanceur -Jet de sauvegarde : spécial - -Ce sort détruit la cible et la fait tomber en débris. La victime a droit à un jet de sauvegarde contre la mort magique, à -4. En cas de succès, elle n'est pas détruite mais perd 8d6 points de vie. Ce sort ne peut être lancé que par les personnages d'alignement mauvais. À noter qu'un individu tué par Destruction ne peut être ramené à la vie grâce à Rappel à la vie ou Résurrection.~ - @4430 = ~Bouclier suprême de Lathandre~ - @4431 = ~Bouclier suprême de Lathandre -(Conjuration) - -Niveau : 7 -Sphère : Garde -Portée : toucher -Durée : 3 rounds -Temps d'incantation : 9 -Zone d'effet : 1 créature -Jet de sauvegarde : aucun - -Le sujet bénéficie d'une résistance à la magie de 100 % et d'une immunité totale contre les dégâts jusqu'au terme de la durée indiquée. Bouclier suprême de Lathandre ne peut protéger une créature d'alignement mauvais. Seul un personnage d'alignement bon peut lancer ce sort.~ - @4440 = ~Brume d'Eldath~ - @4441 = ~Brume d'Eldath -(Évocation) - -Niveau : 7 -Sphère : Élémentaire -Portée : champ visuel du lanceur -Durée : 1 round -Temps d'incantation : 9 -Zone d'effet : 4 mètres de rayon -Jet de sauvegarde : aucun - -Une brume bleutée parée de reflets d'argent baigne la zone d'effet. Elle soigne toutes les maladies, vient à bout de tous les empoisonnements et rend 25 points de vie à chaque créature qu'elle effleure.~ - @4450 = ~Traqueur~ - @4451 = ~Traqueur -(Conjuration) - -Niveau : 7 -Sphère : Flore -Portée : champ visuel du lanceur -Durée : 8 heures -Temps d'incantation : 9 -Zone d'effet : spéciale -Jet de sauvegarde : aucun - -Ce sort fait apparaître 11 DV de tertres errants, qui servent fidèlement le personnage, soit au combat, soit en lui rendant les services dont ils sont capables de se charger.~ - @4452 = ~Tertre errant~ - @4460 = ~Absorption d'énergie~ - @4461 = ~Absorption d'énergie -(Nécromancie) - -Niveau : 7 -Sphère : Nécromancie -Portée : toucher -Durée : permanente -Temps d'incantation : 3 -Zone d'effet : 1 créature -Jet de sauvegarde : aucun - -Ce sort permet de transformer le lanceur en un conduit d'énergie entre son plan et le Plan d'Énergie Négative. En touchant une créature, le personnage aspire son essence vitale en direction du Plan d'Énergie Négative, lui drainant 2 niveaux d'expérience. La cible perd ainsi des niveaux, des points de vie et des capacités de manière permanente. Ces niveaux ne peuvent être restaurés que par le sort de prêtre de Restauration. Ce sort reste sans effet contre les morts-vivants, les créatures artificielles et extra-planaires. Il ne peut être lancé que par un personnage d'alignement mauvais.~ - @4462 = ~Deux niveaux absorbés~ - @5001 = ~Ballade des Trois Héros - bonus au combat~ - @5002 = ~Ballade des Trois Héros~ - @5003 = ~Tous les alliés à 9 mètres de distance gagnent un bonus de 1 à l'attaque, aux dégâts et aux jets de sauvegarde.~ - @5004 = ~Ballade de Curran Cœurvaillant - immunité contre la terreur~ - @5005 = ~Ballade de Curran Cœurvaillant~ - @5006 = ~Tous les alliés à 9 mètres de distance sont immunisés à la terreur aussi longtemps que dure la musique, et tout effet de terreur est dissipé instantanément.~ - @5007 = ~Mélodie de Tymora - bonus de chance et de compétence~ - @5008 = ~Mélodie de Tymora~ - @5009 = ~Tous les alliés gagnent à 9 mètres de distance un bonus de 1 à la chance, 3 aux jets de sauvegarde, 10 au score de connaissance et +10 % aux talents de voleur.~ - @5010 = ~Chant de Kaudiès - résistance aux attaques soniques~ - @5011 = ~Chant de Kaudiès~ - @5012 = ~Tous les alliés à 9 mètres de distance ont 50 % de chances de résister aux effets des sorts de Silence, Cri, Grand Cri, Injonction, Injonction majeure et tout autre attaque à base de son.~ - @5013 = ~Chant des sirènes - fascine qui l'entend~ - @5014 = ~Chant des sirènes~ - @5015 = ~Tous les adversaires à 7,5 mètres de distance doivent réussir un jet de sauvegarde contre les sorts ou perdre leur action pendant un round, ou jusqu'à ce qu'ils subissent des dégâts.~ - @5016 = ~Captivé(e)~ - @5017 = ~Chant de guerre de Sith - bonus à l'armure et régénération~ - @5018 = ~Chant de guerre de Sith~ - @5019 = ~Tous les alliés à 9 mètres de distance gagnent un bonus de 2 à la classe d'armure, 10 % de résistance aux dégâts tranchants, perforants, contondants et projectiles, ainsi qu'une capacité de régénération de 2 points de vie par round.~ - @5020 = ~BARDE : Le barde est également un roublard, mais il est très différent du voleur. Il tire sa force de sa personnalité agréable et charmante. Grâce à elle et à son intelligence, il fait son chemin dans le monde. Le barde est un musicien talentueux et un magasin ambulant de commérages, de contes à dormir debout et de légendes. De toute situation il sait tirer une leçon ; c'est un touche-à-tout qui ne maîtrise rien parfaitement. Alors que la plupart des bardes sont des fripouilles, leurs histoires et leurs chansons sont bien accueillies presque partout. - -CAPACITÉS : - -- Ne peut porter d'armure plus lourde que la cotte de mailles (les sorts ne peuvent être lancés en armure). -- Ne peut utiliser de bouclier plus lourd que la targe. -- Ne peut être que compétent (une étoile) dans le maniement des armes. -- Ne peut être que compétent (une étoile) dans les styles de combat. -- Peut avoir recours au talent de voleur de Vol à la tire. -- Score de connaissance accru. -- Peut lancer des sorts profanes à partir du niveau 2. -- Peut utiliser la capacité de « Chanson du barde » pour jouer un chant de son répertoire. -- Peut jouer la Ballade des Trois Héros au niveau 1 (tous les alliés à 9 mètres de distance gagnent un bonus de 1 à l'attaque, aux dégâts et aux jets de sauvegarde). -- Peut jouer le Ballade de Curran Cœurvaillant au niveau 3 (tous les alliés à 9 mètres de distance sont immunisés à la terreur aussi longtemps que dure la musique, et tout effet de terreur est dissipé instantanément). -- Peut jouer la Mélodie de Tymora au niveau 5 (tous les alliés à 9 mètres de distance gagnent un bonus de 1 à la chance, 3 aux jets de sauvegarde, +10 au score de connaissance et +10 % aux talents de voleur). -- Peut jouer le Chant de Kaudiès au niveau 7 (tous les alliés à 9 mètres de distance ont 50 % de chances de résister aux effets des sorts de Silence, Cri, Grand Cri, Injonction, Injonction majeure et tout autre attaque à base de son). -- Peut jouer le Chant des Sirènes au niveau 9 (tous les adversaires à 7,5 mètres de distance doivent réussir un jet de sauvegarde contre les sorts ou perdre leur action pendant un round, ou jusqu'à ce qu'ils subissent des dégâts). -- Peut jouer le Chant de Guerre de Sith au niveau 11 (tous les alliés à 9 mètres de distance gagnent un bonus de 2 à la classe d'armure, 10 % de résistance aux dégâts tranchants, perforants, contondants et projectiles, ainsi qu'une capacité de régénération de 2 points de vie par round). -- Doit être d'alignement partiellement neutre. -- Dés de vie : d6.~ - @6001 = ~Hache à deux mains~ - @6002 = ~Cette arme puissante consiste en un manche de 1,20 mètre à 1,50 mètre de long, au bout duquel a été fixée une lourde lame, laquelle peut être simple ou double (une lame de chaque côté du manche). C'est une arme difficile à manier, mais un combattant aguerri peut s'en servir pour assener de terribles coups. - -PARAMÈTRES : - -Dégâts : 1d10 -Type de dégâts : tranchant -Poids : 10 -Facteur de vitesse : 9 -Type de compétence : hache -Type : arme à 2 mains -Nécessite : 10 en Force -Non utilisable par : - Druide - Clerc - Mage - Voleur - Moine - Belluaire~ - @6003 = ~Hache à deux mains +1~ - @6004 = ~Cette arme puissante consiste en un manche de 1,20 mètre à 1,50 mètre de long, au bout duquel a été fixée une lourde lame, laquelle peut être simple ou double (une lame de chaque côté du manche). Cette hache a également été dotée de plusieurs propriétés magiques, ce qui la rend plus efficace au combat. Sa lame acérée, par exemple, cisaillera la chair de votre adversaire pour trouver l'os tandis que sa pointe barbelée cherchera des trous dans son armure. - -PARAMÈTRES : - -TAC0 : +1 -Dégâts : 1d10 +1 -Type de dégâts : tranchant -Poids : 9 -Facteur de vitesse : 8 -Type de compétence : hache -Type : arme à 2 mains -Nécessite : 10 en Force -Non utilisable par : - Druide - Clerc - Mage - Voleur - Moine - Belluaire~ - @6005 = ~Hache à deux mains +2 : Culbuteuse de Tremain~ - @6006 = ~Tremain Hachelongue était un aventurier des Dix-Cités qui avait un penchant pour les haches. Alors que les haches à deux mains sont généralement lentes et difficiles à manier, Tremain avait conçu spécialement celle-ci pour faire trébucher ses adversaires, lui permettant de vaincre des ennemis équipés d'armes plus rapides et plus légères. - -PARAMÈTRES : - -Capacité de combat : -- 10 % de chance de renverser l'adversaire pendant un round, à chaque coup réussi. - -TAC0 : +2 -Dégâts : 1d10 +2 -Type de dégâts : tranchant -Poids : 8 -Facteur de vitesse : 7 -Type de compétence : hache -Type : arme à 2 mains -Nécessite : 10 en Force -Non utilisable par : - Druide - Clerc - Mage - Voleur - Moine - Belluaire~ - @6007 = ~Hache à deux mains +3~ - @6008 = ~Cette arme puissante consiste en un manche de 1,20 mètre à 1,50 mètre de long, au bout duquel a été fixée une lourde lame, laquelle peut être simple ou double (une lame de chaque côté du manche). Cette hache a été imprégnée de plusieurs enchantements, ce qui la rend plus efficace au combat. - -PARAMÈTRES : - -TAC0 : +3 -Dégâts : 1d10 +3 -Type de dégâts : tranchant -Poids : 7 -Facteur de vitesse : 6 -Type de compétence : hache -Type : arme à 2 mains -Nécessite : 10 en Force -Non utilisable par : - Druide - Clerc - Mage - Voleur - Moine - Belluaire~ - @6009 = ~Hache à deux mains +4 : Étendard de bataille~ - @6010 = ~Murzul Dul était un chef de guerre du roi Greneire, qui avait gagné sa renommée en tant que tacticien habile. Cette immense hache lui servait aussi d'étendard sur le champ de bataille, et pouvait à la fois terrasser ses ennemis et rallier sa horde. Comme le roi Greneire et la majeure partie de sa horde, Dul fut tué pendant le siège de la Citadelle des Mille et Une Flèches lorsque Emerus Couronne-de-Guerre les balaya, et sa hache fut revendiquée comme butin de guerre. Elle a conservé ses capacités que l'on peut activer en plantant son manche dans le sol. - -PARAMÈTRES : - -Capacité de charge : -- Étendard de bataille deux fois par jour : en plantant le manche de la hache dans le sol, le porteur peut repousser ses ennemis situés à proximité, et accorder à ses alliés un bonus de 1 à leur TAC0 et à leurs dégâts, pour deux rounds. - -TAC0 : +4 -Dégâts : 1d10 +4 -Type de dégâts : tranchant -Poids : 6 -Facteur de vitesse : 5 -Type de compétence : hache -Type : arme à deux mains -Nécessite : 10 en Force -Non utilisable par : - Druide - Clerc - Mage - Voleur - Moine - Belluaire~ - @6011 = ~Hache à deux mains +5 : Étendard de bataille~ - @6012 = ~Murzul Dul était un chef de guerre du roi Greneire, qui avait gagné sa renommée en tant que tacticien habile. Cette immense hache lui servait aussi d'étendard sur le champ de bataille, et pouvait à la fois terrasser ses ennemis et rallier sa horde. Comme le roi Greneire et la majeure partie de sa horde, Dul fut tué pendant le siège de la Citadelle des Mille et Une Flèches lorsque Emerus Couronne-de-Guerre les balaya, et sa hache fut revendiquée comme butin de guerre. Elle a conservé ses capacités que l'on peut activer en plantant son manche dans le sol. Cespenar l'a encore améliorée. - -PARAMÈTRES : - -Capacité de charge : -- Étendard de bataille amélioré deux fois par jour : en plantant le manche de la hache dans le sol, le porteur peut repousser ses ennemis situés à proximité, et accorder à ses alliés un bonus de 2 à leurs jets de sauvegarde, leur TAC0 et leurs dégâts, pour deux rounds. - -TAC0 : +5 -Dégâts : 1d10 +5 -Type de dégâts : tranchant -Poids : 5 -Facteur de vitesse : 4 -Type de compétence : hache -Type : arme à deux mains -Nécessite : 10 en Force -Non utilisable par : - Druide - Clerc - Mage - Voleur - Moine - Belluaire~ - @6013 = ~Étendard de bataille~ - @6014 = ~Étendard de bataille amélioré~ - @6015 = ~Ooh, une grosse hache ! T'as du petit bois à couper ? Brillante, brillante !~ - @6016 = ~J'ai une recette qui peut rendre Étendard de bataille encore plus batailleur. 5 000 pièces d'or et il est à toi.~ - @6017 = ~Alors, voyons voir ce que tu as d'autre.~ \ No newline at end of file diff --git a/iwdification/languages/french/setup.tra b/iwdification/languages/french/setup.tra deleted file mode 100644 index 620ebf5..0000000 --- a/iwdification/languages/french/setup.tra +++ /dev/null @@ -1,111 +0,0 @@ -// this file contains strings only used by the WeiDU installer and does not get converted to UTF-8 for EE games. - -@0 = ~Les fonctionnalites de ce composant sont deja installees par un autre mod.~ -@1 = ~Il est necessaire d'utiliser Modmerge avant d'installer des mods pour ce jeu. Consultez le readme pour plus d'informations et pour trouver un lien pour telecharger Modmerge.~ - -@1000 = ~Incantation des sorts style Icewind Dale (Andyr)~ - -@2000 = ~Couleurs ternes pour les habits des roturiers~ - -@3000 = ~Pack de sortileges profanes d'IWD~ - -@4000 = ~Pack de sortileges divins d'IWD~ - -@5000 = ~Chanson du barde d'IWD~ - -@6000 = ~Pack de haches a deux mains~ - - -// WeiDU prompts -@-1000= "Le mod %TP2_FILE_NAME% contient" -@-1001= "composants optionnels distincts. -Pour gagner du temps, vous pouvez choisir ce que vous souhaitez faire d'eux -au niveau general plutot que de repondre aux questions pour chacun. -" -@-1002= "Que faut-il faire de tous les composants qui NE sont PAS ENCORE installes ? -Les [I]nstaller, les [S]auter, dem[A]nder pour chacun ? " -@-1003= "Que faut-il faire de tous les composants qui sont DEJA installes ? -Les [R]einstaller, les s[U]pprimer, les [S]auter, dem[A]nder pour chacun ? " - -@-1004= "S'IL VOUS PLAIT, envoyez par e-mail le fichier" -@-1005= "a" - -@-1006= "Installer le composant [" -@-1007= "] ? -[R]einstaller, co[N]server, s[U]pprimer ou [Q]uitter ? " -@-1008= "] ? -[I]nstaller, [N]e pas installer ou [Q]uitter ? " - -@-1009= "Entrez une partie du nom du module : " - -@-1010= "Reinstallation du composant [" -@-1011= "] " -@-1012= "Reinstallation dans la langue" - -@-1013= "Suppression de l'ancienne installation de [" -@-1014= "] au prealable..." -@-1015= "SUPPRESSION REUSSIE DE L'ANCIEN" - -@-1016= "Installation en cours" -@-1017= "ERREUR pendant l'installation de [" -@-1018= "], retour a l'etat anterieur" -@-1019= "INSTALLATION REUSSIE" -@-1020= "Saute" -@-1021= "Suppression de [" -@-1022= "] (composant #" -@-1023= ")" -@-1024= "SUPPRESSION REUSSIE DE [" - -@-1025= "] ? -[R]einstaller, co[N]server, s[U]pprimer, [Q]uitter ou choisir un parmi :" -@-1026= "] ? -[N]e pas installer, [Q]uitter ou choisir un parmi :" -@-1027= " (installe actuellement)" - -@-1028= "Souhaitez-vous afficher les composants de [" -@-1029= "] ? -[Y]Oui, [N]on ? " - -@-1030= "] ? -choisir un parmi :" -@-1031= "] ? -[R]einstaller, co[N]server, [Q]uitter ou choisir un parmi :" -@-1032= "INSTALLATION ECHOUEE A CAUSE D'ERREURS" -@-1033= "INSTALLATION AVEC DES ALERTES" -@-1034= "Souhaitez-vous afficher les instructions (ReadMe) ? [Y]Oui [N]on" -@-1035= "Dans la langue" - -@-1036= "Saute le GROUPE [" -@-1037= "] pour cause d'absence des pre-requis." - -@-1038= "dem[A]nder pour chaque composant, tout [S]auter, ou choisir une selection pre-definie :" -@-1039= "dem[A]nder pour chaque composant, [R]einstaller la configuration courante, tout s[U]pprimer, tout [S]auter, ou choisir une selection pre-definie :" - -@-1040= " -Veuillez choisir la langue dans laquelle vous souhaitez jouer au jeu. -Si par la suite vous desirez jouer au jeu dans une langue differente, il vous -faudra editer le fichier weidu.conf et reinstaller vos mods. -" -@-1041= "Tcheque" -@-1042= "Allemand" -@-1043= "Anglais" -@-1044= "Espagnol" -@-1045= "Francais" -@-1046= "Italien" -@-1047= "Polonais" -@-1048= "Portugais" -@-1049= "Turc" -@-1050= "Japonais" -@-1051= "Coreen" -@-1052= "Chinois simplifie" -@-1053= "Russe" -@-1054= "Ukrainien" - -@-1060= " -Ce jeu est disponible en plusieurs langues mais WeiDU ne sait pas laquelle a ete choisie quand ce mod a ete installe. - -Veuillez indiquer quelle langue du jeu a ete utilisee quand vous avez installe ce mod. Votre choix servira jusqu'a ce que WeiDU s'arrete mais ne sera pas memorise. -" -@-1061= " -Utilisation de" -@-1062= " et " diff --git a/iwdification/lib/always.tph b/iwdification/lib/always.tph new file mode 100644 index 0000000..343f049 --- /dev/null +++ b/iwdification/lib/always.tph @@ -0,0 +1,61 @@ +//ACTION_IF !GAME_IS "eet bgee bg2ee iwdee" BEGIN // enforce enhanced-edition +// FAIL "Requires enhanced edition" +//END + +//////////////////////////////////////////////////////// +//////////////////////////////////////////////////////// +//// Things to do only once +//////////////////////////////////////////////////////// +//////////////////////////////////////////////////////// + +ACTION_IF !VARIABLE_IS_SET ~initialise~ BEGIN + OUTER_SET initialise=1 + + +//////////////////////////////////////////////////////// +//// set up the ini +//////////////////////////////////////////////////////// + + INCLUDE "%MOD_FOLDER%/lib/lib_ini.tpa" +// OUTER_SPRINT ini_to_read "%MOD_FOLDER%/%MOD_FOLDER%.ini" + LAF SFO_read_ini_file STR_VAR ini_to_read = EVAL ~%MOD_FOLDER%/%inifile%~ RET_ARRAY SFO_reserved_ini_hash END + +//////////////////////////////////////////////////////// +//// general variables, macros and functions +//////////////////////////////////////////////////////// + + ACTION_IF !VARIABLE_IS_SET do_not_biff BEGIN + OUTER_SET do_not_biff=0 + END + + ACTION_IF !VARIABLE_IS_SET sfo_loc BEGIN + OUTER_SPRINT sfo_loc "sfo" + END + ACTION_IF !VARIABLE_IS_SET sfo_loc BEGIN + OUTER_SPRINT ssl_loc "ssl" + END + INCLUDE ~%MOD_FOLDER%/%sfo_loc%/install_sfo.tpa~ + + OUTER_SPRINT ssllibrary "%MOD_FOLDER%/%ssl_loc%/library.slb" + + //////////////////////////////////////////////////////////////////////////////// + // third-party content check + //////////////////////////////////////////////////////////////////////////////// + + // Detect Spell Revisions + + ACTION_IF FILE_EXISTS_IN_GAME ~dvimhere.mrk~ THEN BEGIN + OUTER_SET demivrgvs=1 + END ELSE BEGIN + OUTER_SET ~demivrgvs~=0 + END + +//////////////////////////////////////////////////////// +//// On BG2EE, include DS +//////////////////////////////////////////////////////// + +// ACTION_IF GAME_IS "bgee bg2ee eet" BEGIN + LAF include STR_VAR file="ds.tph" location="%iwdspells_lib%" END +// END + +END diff --git a/iwdification/lib/arcane_spells_postproduction.tpa b/iwdification/lib/arcane_spells_postproduction.tpa new file mode 100644 index 0000000..87914a1 --- /dev/null +++ b/iwdification/lib/arcane_spells_postproduction.tpa @@ -0,0 +1,160 @@ +DEFINE_ACTION_FUNCTION arcane_spells_postproduction STR_VAR tra="" BEGIN + + ACTION_IF is_iwd BEGIN + WITH_TRA "%tra%" BEGIN + LAF force_blade END + END + END ELSE BEGIN + LAF include STR_VAR file=summoned_monsters.tpa location="%iwdspells_lib%" END + LAF level_immunity_mage END + LAF expeditious_retreat_icon END + LAF monster_summoning_arcane_cosmetic END + ACTION_IF "%tra%" STRING_EQUAL_CASE "" BEGIN + ACTION_IF !demivrgvs BEGIN + LAF summoned_monsters_arcane END + LAF include STR_VAR file=elemental_summoning.tpa location="%iwdspells_lib%" END + LAF elemental_summoning RET WIZARD_CONJURE_WATER_ELEMENTAL_SCROLL=scroll_new END + END + LAF force_blade END + END ELSE BEGIN + WITH_TRA "%tra%" BEGIN + ACTION_IF !demivrgvs BEGIN + LAF summoned_monsters_arcane END + LAF include STR_VAR file=elemental_summoning.tpa location="%iwdspells_lib%" END + LAF elemental_summoning RET WIZARD_CONJURE_WATER_ELEMENTAL_SCROLL=scroll_new END + LAF truncate_force_missile_description END + END + LAF force_blade END + END + END + INCLUDE ~%obg2_res_path%/functions.tpa~ + INCLUDE ~%obg2_res_path%/cd_arcane_post.tpa~ + INCLUDE ~%obg2_res_path%/cross_patch_both.tpa~ + INCLUDE ~%obg2_res_path%/cross_patch_bard.tpa~ + END + +END + +DEFINE_ACTION_FUNCTION force_blade BEGIN + + ACTION_IF VARIABLE_IS_SET $IWD_spell_installed("WIZARD_MORDENKAINENS_SWORD_IWD") || VARIABLE_IS_SET $IWD_spell_installed("WIZARD_MORDENKAINENS_SWORD") BEGIN + + // + // rename the spell + COPY_EXISTING "%WIZARD_MORDENKAINENS_SWORD_IWD%.SPL" override + READ_STRREF NAME1 old_name + SPRINT new_name @10 + SAY NAME1 "%new_name%" + READ_STRREF 0x50 old_desc + INNER_PATCH_SAVE new_desc "%old_desc%" BEGIN + REPLACE_TEXTUALLY "%old_name%" "%new_name%" + END + SAY 0x50 "%new_desc%" + BUT_ONLY + + // rename the scroll + COPY_EXISTING "%WIZARD_MORDENKAINENS_SWORD_IWD_SCROLL%.ITM" override + SAY NAME2 "%new_name%" + SAY DESC "%new_desc%" + BUT_ONLY + + // Reverse the icons, since the green one (attached to SWORD_IWD) ought to be associated with the summons effect + + ACTION_FOR_EACH letter IN a b c BEGIN + COPY_EXISTING "%WIZARD_MORDENKAINENS_SWORD_IWD%%letter%.bam" "%workspace%" + COPY_EXISTING "%WIZARD_MORDENKAINENS_SWORD%%letter%.bam" "override/%WIZARD_MORDENKAINENS_SWORD_IWD%%letter%.bam" + COPY "%workspace%/%WIZARD_MORDENKAINENS_SWORD_IWD%%letter%.bam" "override/%WIZARD_MORDENKAINENS_SWORD%%letter%.bam" + END + + ACTION_IF is_iwd BEGIN + // on IWD, manually make a scroll and add it to the store + LAF make_scroll_of_spell + STR_VAR resref="%WIZARD_MORDENKAINENS_SWORD%" + name_func=cd_scroll_name + RET scrollname + END + COPY_EXISTING edion.sto override + ADD_STORE_ITEM "%scrollname%" AFTER "%WIZARD_MORDENKAINENS_SWORD_IWD_SCROLL%" #1 #0 #0 IDENTIFIED #1 + BUT_ONLY + END + + // also on IWD, extend the level blocks for the BG2 version to 30th level + + MAKE_PATCH + clone_ability_inline=>"number_to_add=>10 match=>~ability_min_level=20~ ability_min_level=>~21+entry_index~" + patch_effect_inline=>"match=>~ability_min_level>20 and duration>0~ duration=>~ability_min_level*6~" + END + LAF edit_spell STR_VAR spell="%WIZARD_MORDENKAINENS_SWORD%" edits=patch_data END + + END + +END + +DEFINE_ACTION_FUNCTION level_immunity_mage BEGIN + + ACTION_IF VARIABLE_IS_SET $IWD_spell_installed("WIZARD_SNILLOCS_SNOWBALL_SWARM") BEGIN + ACTION_FOR_EACH resource IN "%WIZARD_MINOR_GLOBE_OF_INVULNERABILITY%.spl" "%WIZARD_GLOBE_OF_INVULNERABILITY%.spl" "SPWM126.spl" "JWGLOBE.spl" "lich.itm" "rakring.itm" "demilich.itm" BEGIN + ACTION_IF FILE_EXISTS_IN_GAME "%resource%" BEGIN + COPY_EXISTING "%resource%" override + LPF CLONE_EFFECT INT_VAR multi_match=1 match_opcode=206 STR_VAR resource="%WIZARD_SNILLOCS_SNOWBALL_SWARM%" END + BUT_ONLY + END + END + END + +END + + +DEFINE_ACTION_FUNCTION expeditious_retreat_icon BEGIN + + ACTION_IF VARIABLE_IS_SET $IWD_spell_installed("WIZARD_EXPEDITIOUS_RETREAT") BEGIN + COPY_EXISTING "%WIZARD_EXPEDITIOUS_RETREAT%.spl" override + LPF ALTER_EFFECT INT_VAR match_opcode=142 parameter2=195 END + END + +END + +DEFINE_ACTION_FUNCTION monster_summoning_arcane_cosmetic BEGIN + + ACTION_FOR_EACH 2da IN msummo1 msummo2 msummo3 msummo4 msummo5 msummo6 msummo7 BEGIN + ACTION_IF FILE_EXISTS_IN_GAME "%2da%.2da" BEGIN + COPY_EXISTING "%2da%.2da" override + REPLACE_TEXTUALLY "msumm1h.*" "spmonsum none" + BUT_ONLY + END + END + ACTION_IF FILE_EXISTS_IN_GAME "sshadow.2da" BEGIN + COPY_EXISTING "sshadow.2da" override + REPLACE_TEXTUALLY "msumm1h.*" "spraised none" + BUT_ONLY + END + ACTION_FOR_EACH 2da IN caelemw cfelemw ceelemw cwelemw BEGIN + ACTION_IF FILE_EXISTS_IN_GAME "%2da%.2da" BEGIN + COPY_EXISTING "%2da%.2da" override + REPLACE_TEXTUALLY "msumm1h.*" "spportal none" + BUT_ONLY + END + END + + + +END + +DEFINE_ACTION_FUNCTION truncate_force_missile_description BEGIN + + ACTION_IF VARIABLE_IS_SET $IWD_spell_installed("WIZARD_MORDENKAINENS_FORCE_MISSILES") BEGIN + COPY_EXISTING "%WIZARD_MORDENKAINENS_FORCE_MISSILES%.spl" override + READ_LONG 0x50 desc_strref + GET_STRREF desc_strref desc + SPRINT old @18 + SPRINT new @19 + INNER_PATCH_SAVE desc "%desc%" BEGIN + REPLACE_TEXTUALLY "%old%" "%new%" + END + BUT_ONLY + STRING_SET_EVALUATE desc_strref "%desc%" + END + + + +END \ No newline at end of file diff --git a/iwdification/lib/audit_animations.tpa b/iwdification/lib/audit_animations.tpa new file mode 100644 index 0000000..dce55f6 --- /dev/null +++ b/iwdification/lib/audit_animations.tpa @@ -0,0 +1,69 @@ +////////////////////////////////////////////////////////// +/// Go through the INI and BAM files +/// for BG2EE and see which (IWD) animations are missing +////////////////////////////////////////////////////////// + + + +DEFINE_ACTION_FUNCTION audit_animations + +BEGIN + COPY_EXISTING_REGEXP ".*\.ini" "%workspace%" + LPF extract_ini_anim_data RET anim_id resref is_iwd_anim END + PATCH_IF is_iwd_anim BEGIN + INNER_ACTION BEGIN + LAF look_for_animation STR_VAR resref RET value END + ACTION_IF !value BEGIN + OUTER_INNER_PATCH "" BEGIN + LOOKUP_IDS_SYMBOL_OF_INT anim_name animate anim_id + END + LAF log_this STR_VAR file=missing_animations.2da input= ~%anim_id% %anim_name%~ END + END + END + END + BUT_ONLY +END + +DEFINE_PATCH_FUNCTION extract_ini_anim_data + RET anim_id resref is_iwd_anim +BEGIN + SET anim_id=0 + SPRINT resref "" + SPRINT anim_type "" + REPLACE_TEXTUALLY "=" " " + READ_2DA_ENTRIES_NOW entry_array 2 + FOR (i=0;i=0 BEGIN + SET is_iwd_anim=1 + END ELSE BEGIN + SET is_iwd_anim=0 + END + END +END + +DEFINE_ACTION_FUNCTION look_for_animation + STR_VAR resref="" + RET value +BEGIN + OUTER_SPRINT resref "%resref%GH" + ACTION_IF FILE_EXISTS_IN_GAME "%resref%.bam" BEGIN + OUTER_SET value=1 + END ELSE BEGIN + OUTER_SET value=0 + END +END \ No newline at end of file diff --git a/iwdification/lib/bardsong_postproduction.tpa b/iwdification/lib/bardsong_postproduction.tpa new file mode 100644 index 0000000..7ce65af --- /dev/null +++ b/iwdification/lib/bardsong_postproduction.tpa @@ -0,0 +1,86 @@ +DEFINE_ACTION_FUNCTION bardsong_postproduction STR_VAR tra="" BEGIN + + + // change the default "FJBARD" to point at the Ballad of Three Heroes + + ACTION_IF FILE_EXISTS_IN_GAME ~fjbard.spl~ BEGIN + LAF edit_spell STR_VAR spell=FJBARD editstring="patch_effect_inline=>~resource=>%BARD_SONG_BALLAD%~" END + END + + // add the new powers in the CLAB + + MAKE_PATCH + grant_power'1=>"#BARD1 1" + grant_power'2=>"#BARD2 3" + grant_power'3=>"#BARD3 5" + grant_power'4=>"#BARD4 7" + grant_power'5=>"#BARD5 9" + grant_power'6=>"#BARD6 11" + remove_hla=>spcl920 + END + LAF edit_kit STR_VAR kit=bard edits=patch_data END + + WITH_TRA "%tra%" BEGIN + + // update regular bard description + ACTION_IF enhanced_edition BEGIN + LAF read_table_entry STR_VAR file=clastext.2da row=bard column=descstr RET desc_strref=value END + END ELSE BEGIN + OUTER_SET desc_strref = 9562 // obg2 + END + ACTION_GET_STRREF desc_strref desc + ACTION_GET_STRREF desc_strref desc + OUTER_PATCH_SAVE desc "%desc%" BEGIN + SPRINT old @1 + REPLACE_TEXTUALLY "\(.*\)%old%.*" "\1DW_PLACEHOLDER" + PATCH_FOR_EACH tra_ref IN 2 3 4 BEGIN + SPRINT old (AT tra_ref) + REPLACE_TEXTUALLY "[%WNL%%LNL%%MNL%].*%old%" "" + END + + PATCH_FOR_EACH tra_ref IN 16 15 14 13 12 11 10 BEGIN + SPRINT new (AT tra_ref) + REPLACE_TEXTUALLY "\(.*\)DW_PLACEHOLDER.*\([%WNL%%LNL%%MNL%]\)" "\1DW_PLACEHOLDER\2\1%new%\2" + END + REPLACE_TEXTUALLY "\(.*\)DW_PLACEHOLDER.*\([%WNL%%LNL%%MNL%]\)" "" + + END + STRING_SET_EVALUATE desc_strref "%desc%" + + // update bard kit descriptions + COPY_EXISTING "kitlist.2da" override + COUNT_2DA_COLS colcount + COUNT_2DA_ROWS colcount rowcount + FOR (row=0;row 0) AND (NUM_d716 > 0)) BEGIN - - COPY_EXISTING ~spwi%NUM_a429%.spl~ ~override~ - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdid716 resource = EVAL ~sppr%NUM_d716%~ END - BUT_ONLY - -END - -ACTION_IF NUM_a610 > 0 BEGIN - - COPY_EXISTING ~spwi%NUM_a610%.spl~ ~override~ - PATCH_IF NUM_d738 > 0 BEGIN - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdid738 resource = EVAL ~sppr%NUM_d738%~ END - END - PATCH_IF NUM_d736 > 0 BEGIN - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdid736 resource = EVAL ~sppr%NUM_d736%~ END - END - PATCH_IF NUM_d617 > 0 BEGIN - PATCH_IF !ee_game BEGIN - LPF CLONE_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdid617 resource = cdid617b END - END - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdid617 resource = EVAL ~sppr%NUM_d617%~ END - END - PATCH_IF NUM_d519 > 0 AND ee_game BEGIN - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdid519 resource = EVAL ~sppr%NUM_d519%~ END - END - PATCH_IF NUM_d428 > 0 BEGIN - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdid428 resource = EVAL ~sppr%NUM_d428%~ END - END - PATCH_IF NUM_d427 > 0 BEGIN - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdid427 resource = EVAL ~sppr%NUM_d427%~ END - END - PATCH_IF NUM_d426 > 0 BEGIN - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdid426 resource = EVAL ~sppr%NUM_d426%~ END - END - PATCH_IF NUM_d423 > 0 BEGIN - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdid423 resource = EVAL ~sppr%NUM_d423%~ END - END - PATCH_IF NUM_d420 > 0 BEGIN - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdid420 resource = EVAL ~sppr%NUM_d420%~ END - END - PATCH_IF NUM_d419 > 0 BEGIN - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdid419 resource = EVAL ~sppr%NUM_d419%~ END - END - PATCH_IF NUM_d326 > 0 BEGIN - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdid326 resource = EVAL ~sppr%NUM_d326%~ END - END - PATCH_IF NUM_d324 > 0 BEGIN - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdid324 resource = EVAL ~sppr%NUM_d324%~ END - END - BUT_ONLY - -END - -ACTION_IF NUM_a802 > 0 BEGIN - - COPY_EXISTING ~spwi%NUM_a610%.spl~ ~override~ - PATCH_IF NUM_d422 > 0 BEGIN - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdid422 resource = EVAL ~sppr%NUM_d422%~ END - END - PATCH_IF NUM_d716 > 0 BEGIN - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdid716 resource = EVAL ~sppr%NUM_d716%~ END - END - BUT_ONLY - -END - -ACTION_IF NUM_a814 > 0 BEGIN - - COPY_EXISTING ~spwi%NUM_a610%.spl~ ~override~ - PATCH_IF NUM_d736 > 0 AND ee_game BEGIN - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdid736 resource = EVAL ~sppr%NUM_d736%~ END - END - PATCH_IF NUM_d424 > 0 BEGIN - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdid424 resource = EVAL ~sppr%NUM_d424%~ END - END - PATCH_IF NUM_d423 > 0 AND ee_game BEGIN - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdid423 resource = EVAL ~sppr%NUM_d423%~ END - END - PATCH_IF NUM_d326 > 0 BEGIN - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdid326 resource = EVAL ~sppr%NUM_d326%~ END - END - -END - -ACTION_IF NUM_d422 > 0 BEGIN - - COPY_EXISTING ~sppr%NUM_d422%.spl~ ~override~ - PATCH_IF NUM_a411 > 0 BEGIN - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdia411 resource = EVAL ~spwi%NUM_a411%~ END - END - PATCH_IF NUM_a427 > 0 BEGIN - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdia427 resource = EVAL ~spwi%NUM_a437%~ END - END - PATCH_IF NUM_a428 > 0 BEGIN - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdia428 resource = EVAL ~spwi%NUM_a428%~ END - END - PATCH_IF NUM_a429 > 0 BEGIN - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdia429 resource = EVAL ~spwi%NUM_a429%~ END - END - BUT_ONLY - -END - -ACTION_IF ((NUM_a524 > 0) AND (NUM_d325 > 0)) BEGIN - - COPY_EXISTING ~sppr%NUM_d325%.spl~ ~override~ - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdia524 resource = EVAL ~spwi%NUM_a524%~ END - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdia524b resource = EVAL ~spwi%NUM_a524%b~ END - BUT_ONLY - -END - -ACTION_IF ((NUM_a327 > 0) AND (NUM_d615 > 0)) BEGIN - - COPY_EXISTING ~sppr%NUM_d615%.spl~ ~override~ - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdia327 resource = EVAL ~spwi%NUM_a327%~ END - BUT_ONLY - -END - -ACTION_IF ((NUM_a411 > 0) AND (NUM_d733 > 0)) BEGIN - - COPY_EXISTING ~sppr%NUM_d733%.spl~ ~override~ - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdia411 resource = EVAL ~spwi%NUM_a411%~ END - BUT_ONLY - -END \ No newline at end of file diff --git a/iwdification/lib/dealign_cleric_spells.tpa b/iwdification/lib/dealign_cleric_spells.tpa new file mode 100644 index 0000000..aa21557 --- /dev/null +++ b/iwdification/lib/dealign_cleric_spells.tpa @@ -0,0 +1,61 @@ +// removes good/evil axis alignment restrictions from all cleric spells except those specifically called out +// description adjustment is heuristic, based on the presence of a set of strings (10001-10020 in the tra file, +// by default dw_iwdspells_divine.tra) + +DEFINE_ACTION_FUNCTION dealign_cleric_spells STR_VAR version=1 BEGIN + + // load dialog strings + + ACTION_IF version=1 BEGIN + ACTION_CLEAR_ARRAY dealign_dialog_array + OUTER_FOR (line=1;line<=20;++line) BEGIN + OUTER_SET tra_ref=line+10000 + OUTER_SPRINT $dealign_dialog_array("%line%") (AT tra_ref) + END + END + + // load special cases + ACTION_CLEAR_ARRAY dealign_exclude + ACTION_FOR_EACH special_spell IN CLERIC_HOLY_WORD CLERIC_UNHOLY_WORD CLERIC_HOLY_SMITE CLERIC_UNHOLY_BLIGHT BEGIN + LAF RES_NUM_OF_SPELL_NAME STR_VAR spell_name="%special_spell%" RET spell_res END + ACTION_TO_UPPER spell_res + OUTER_SPRINT $dealign_exclude("%spell_res%") "" + END + + // main pass through spells + + COPY_EXISTING_REGEXP "sppr[1-7][0-9][0-9]\.spl" override + SPRINT filename "%SOURCE_RES%" + TO_UPPER filename + PATCH_IF !VARIABLE_IS_SET $dealign_exclude("%filename%") BEGIN + // the actual alignment shift (much the easiest bit!) + READ_BYTE 0x1e align_byte_old + align_byte_new= align_byte_old BAND 0b11110001 + PATCH_IF !(align_byte_new=align_byte_old) BEGIN + WRITE_BYTE 0x1e align_byte_new + PATCH_IF version=1 BEGIN + READ_LONG 0x50 desc_strref + LPF dealign_cleric_spell_description INT_VAR desc_strref END + END + END + END + BUT_ONLY + +END + +DEFINE_PATCH_FUNCTION dealign_cleric_spell_description INT_VAR desc_strref=0 BEGIN + + PATCH_IF desc_strref>0 BEGIN + GET_STRREF desc_strref desc + INNER_PATCH_SAVE desc "%desc%" BEGIN + FOR (line=1;line<=20;++line) BEGIN + SPRINT string $dealign_dialog_array("%line%") + REPLACE_TEXTUALLY "\.[^.]*%string%[^.]*\." "." + END + END + INNER_ACTION BEGIN + STRING_SET_EVALUATE desc_strref "%desc%" + END + END + +END \ No newline at end of file diff --git a/iwdification/lib/divine_spellbooks.tpa b/iwdification/lib/divine_spellbooks.tpa index aef7b66..4ea9b09 100644 --- a/iwdification/lib/divine_spellbooks.tpa +++ b/iwdification/lib/divine_spellbooks.tpa @@ -1,149 +1,149 @@ -DEFINE_PATCH_FUNCTION CD_IWDIFICATION_SPELLBOOKS BEGIN - - SET cleric = 0 - SET druid = 0 - READ_BYTE 0x273 class - PATCH_IF ((class = 3) OR (class = 6) OR (class = 8) OR (class = 14) OR (class = 15) OR (class = 17) OR (class = 18) OR (class = 204) OR (class = 207)) BEGIN SET cleric = 1 END - PATCH_IF ((class = 11) OR (class = 12) OR (class = 16) OR (class = 18) OR (class = 208) OR (class = 209)) BEGIN SET druid = 1 END - PATCH_IF cleric OR druid BEGIN // sanity check - READ_BYTE 0x27b align - SET good = 0 - SET neutral = 0 - SET lawful = 0 - PATCH_IF ((align = 17) OR (align = 18) OR (align = 19)) BEGIN SET lawful = 1 END - PATCH_IF ((align = 17) OR (align = 33) OR (align = 49)) BEGIN SET good = 1 END - PATCH_IF ((align = 18) OR (align = 34) OR (align = 50)) BEGIN SET neutral = 1 END - PATCH_IF ((align = 19) OR (align = 35) OR (align = 51)) BEGIN SET evil = 1 END - SET lev1 = 0 - SET lev2 = 0 - SET lev3 = 0 - SET lev4 = 0 - SET lev5 = 0 - SET lev6 = 0 - SET lev7 = 0 - SET evil = 0 - READ_LONG 0x2a0 known_off - READ_LONG 0x2a4 known_num - FOR (index = 0 ; index < known_num ; ++index) BEGIN - READ_ASCII (known_off + (index * 0x0c)) spell - PATCH_MATCH ~%spell%~ WITH - ~[Ss][Pp][Pp][Rr]1[0-9][0-9]~ BEGIN SET lev1 = 1 END - ~[Ss][Pp][Pp][Rr]2[0-9][0-9]~ BEGIN SET lev2 = 1 END - ~[Ss][Pp][Pp][Rr]3[0-9][0-9]~ BEGIN SET lev3 = 1 END - ~[Ss][Pp][Pp][Rr]4[0-9][0-9]~ BEGIN SET lev4 = 1 END - ~[Ss][Pp][Pp][Rr]5[0-9][0-9]~ BEGIN SET lev5 = 1 END - ~[Ss][Pp][Pp][Rr]6[0-9][0-9]~ BEGIN SET lev6 = 1 END - ~[Ss][Pp][Pp][Rr]7[0-9][0-9]~ BEGIN SET lev7 = 1 END - DEFAULT - END - END - PATCH_IF lev1 BEGIN - //NUM_d112 ADD_KNOWN_SPELL ~sppr%NUM_d112%~ #0 ~priest~ - PATCH_IF cleric BEGIN - PATCH_IF neutral OR evil BEGIN - //NUM_d114 ADD_KNOWN_SPELL ~sppr%NUM_d114%~ #0 ~priest~ // CLERIC_CAUSE_LIGHT_WOUNDS - END - END - PATCH_IF druid BEGIN - //NUM_d115 ADD_KNOWN_SPELL ~sppr%NUM_d115%~ #0 ~priest~ // CLERIC_SUNSCORCH - END - END - PATCH_IF lev2 BEGIN - //NUM_d217 ADD_KNOWN_SPELL ~sppr%NUM_d217%~ #1 ~priest~ - PATCH_IF cleric BEGIN - PATCH_IF neutral OR evil BEGIN - //NUM_d220 ADD_KNOWN_SPELL ~sppr%NUM_d220%~ #1 ~priest~ // CLERIC_CAUSE_MODERATE_WOUNDS - END - END - PATCH_IF druid BEGIN - //NUM_d218 ADD_KNOWN_SPELL ~sppr%NUM_d218%~ #1 ~priest~ // CLERIC_ALICORN_LANCE - //NUM_d219 ADD_KNOWN_SPELL ~sppr%NUM_d219%~ #1 ~priest~ // CLERIC_BEAST_CLAW - END - END - PATCH_IF lev3 BEGIN - PATCH_IF cleric BEGIN - //NUM_d316 ADD_KNOWN_SPELL ~sppr%NUM_d316%~ #2 ~priest~ - //NUM_d321 ADD_KNOWN_SPELL ~sppr%NUM_d321%~ #2 ~priest~ - PATCH_IF neutral OR evil BEGIN - //NUM_d320 ADD_KNOWN_SPELL ~sppr%NUM_d320%~ #2 ~priest~ // CLERIC_CAUSE_DISEASE - //NUM_d323 ADD_KNOWN_SPELL ~sppr%NUM_d323%~ #2 ~priest~ // CLERIC_CIRCLE_OF_BONES - //NUM_d330 ADD_KNOWN_SPELL ~sppr%NUM_d330%~ #2 ~priest~ // CLERIC_CAUSE_MEDIUM_WOUNDS - END - PATCH_IF neutral OR good BEGIN - //NUM_d331 ADD_KNOWN_SPELL ~sppr%NUM_d331%~ #2 ~priest~ // CLERIC_FAVOR_OF_ILMATER - END - END - PATCH_IF druid BEGIN - //NUM_d322 ADD_KNOWN_SPELL ~sppr%NUM_d322%~ #2 ~priest~ // CLERIC_MOONBLADE - //NUM_d324 ADD_KNOWN_SPELL ~sppr%NUM_d324%~ #2 ~priest~ // CLERIC_SPIKE_GROWTH - //NUM_d325 ADD_KNOWN_SPELL ~sppr%NUM_d325%~ #2 ~priest~ // CLERIC_CLOUDBURST - //NUM_d326 ADD_KNOWN_SPELL ~sppr%NUM_d326%~ #2 ~priest~ // CLERIC_MOLD_TOUCH - //NUM_d327 ADD_KNOWN_SPELL ~sppr%NUM_d327%~ #2 ~priest~ // CLERIC_STORM_SHELL - END - END - PATCH_IF lev4 BEGIN - PATCH_IF cleric BEGIN - //NUM_d421 ADD_KNOWN_SPELL ~sppr%NUM_d421%~ #3 ~priest~ - //NUM_d424 ADD_KNOWN_SPELL ~sppr%NUM_d424%~ #3 ~priest~ - PATCH_IF !lawful BEGIN - //NUM_d422 ADD_KNOWN_SPELL ~sppr%NUM_d422%~ #3 ~priest~ // CLERIC_BLOOD_RAGE - END - PATCH_IF evil BEGIN - //NUM_d423 ADD_KNOWN_SPELL ~sppr%NUM_d423%~ #3 ~priest~ // CLERIC_CLOUD_OF_PESTILENCE - END - END - PATCH_IF druid BEGIN - //NUM_d418 ADD_KNOWN_SPELL ~sppr%NUM_d418%~ #3 ~priest~ // CLERIC_GIANT_INSECT - //NUM_d419 ADD_KNOWN_SPELL ~sppr%NUM_d419%~ #3 ~priest~ // CLERIC_PRODUCE_FIRE - //NUM_d420 ADD_KNOWN_SPELL ~sppr%NUM_d420%~ #3 ~priest~ // CLERIC_STATIC_CHARGE - //NUM_d425 ADD_KNOWN_SPELL ~sppr%NUM_d425%~ #3 ~priest~ // CLERIC_STAR_METAL_CUDGEL - //NUM_d426 ADD_KNOWN_SPELL ~sppr%NUM_d426%~ #3 ~priest~ // CLERIC_SMASHING_WAVE - //NUM_d427 ADD_KNOWN_SPELL ~sppr%NUM_d427%~ #3 ~priest~ // CLERIC_THORN_SPRAY - //NUM_d428 ADD_KNOWN_SPELL ~sppr%NUM_d428%~ #3 ~priest~ // CLERIC_WALL_OF_MOONLIGHT - END - END - PATCH_IF lev5 BEGIN - PATCH_IF cleric BEGIN - //NUM_d518 ADD_KNOWN_SPELL ~sppr%NUM_d518%~ #4 ~priest~ - //NUM_d521 ADD_KNOWN_SPELL ~sppr%NUM_d521%~ #4 ~priest~ - PATCH_IF evil BEGIN - //NUM_d523 ADD_KNOWN_SPELL ~sppr%NUM_d523%~ #4 ~priest~ // CLERIC_MASS_CAUSE_LIGHT_WOUNDS - END ELSE BEGIN - //NUM_d520 ADD_KNOWN_SPELL ~sppr%NUM_d520%~ #4 ~priest~ // CLERIC_SHIELD_OF_LATHANDER - END - END - PATCH_IF druid BEGIN - //NUM_d519 ADD_KNOWN_SPELL ~sppr%NUM_d519%~ #4 ~priest~ // CLERIC_SPIKE_STONES - //NUM_d522 ADD_KNOWN_SPELL ~sppr%NUM_d522%~ #4 ~priest~ // CLERIC_ANIMAL_RAGE - END - END - PATCH_IF lev6 BEGIN - //NUM_d615 ADD_KNOWN_SPELL ~sppr%NUM_d615%~ #5 ~priest~ - PATCH_IF cleric BEGIN - //NUM_d618 ADD_KNOWN_SPELL ~sppr%NUM_d618%~ #5 ~priest~ - END - PATCH_IF druid BEGIN - //NUM_d617 ADD_KNOWN_SPELL ~sppr%NUM_d617%~ #5 ~priest~ // CLERIC_WHIRLWIND - END - END - PATCH_IF lev7 BEGIN - //NUM_d733 ADD_KNOWN_SPELL ~sppr%NUM_d733%~ #6 ~priest~ - PATCH_IF cleric BEGIN - //NUM_d714 ADD_KNOWN_SPELL ~sppr%NUM_d714%~ #6 ~priest~ - //NUM_d716 ADD_KNOWN_SPELL ~sppr%NUM_d716%~ #6 ~priest~ - PATCH_IF evil BEGIN - //NUM_d734 ADD_KNOWN_SPELL ~sppr%NUM_d734%~ #6 ~priest~ // CLERIC_DESTRUCTION - //NUM_d739 ADD_KNOWN_SPELL ~sppr%NUM_d739%~ #6 ~priest~ // CLERIC_ENERGY_DRAIN - END - PATCH_IF good BEGIN - //NUM_d735 ADD_KNOWN_SPELL ~sppr%NUM_d735%~ #6 ~priest~ // CLERIC_GREATER_SHIELD_OF_LATHANDER - END - END - PATCH_IF druid BEGIN - //NUM_d736 ADD_KNOWN_SPELL ~sppr%NUM_d736%~ #6 ~priest~ // CLERIC_MIST_OF_ELDATH - //NUM_d737 ADD_KNOWN_SPELL ~sppr%NUM_d737%~ #6 ~priest~ // CLERIC_STALKER - END - END - END - +DEFINE_PATCH_FUNCTION CD_IWDIFICATION_SPELLBOOKS BEGIN + + SET cleric = 0 + SET druid = 0 + READ_BYTE 0x273 class + PATCH_IF ((class = 3) OR (class = 6) OR (class = 8) OR (class = 14) OR (class = 15) OR (class = 17) OR (class = 18) OR (class = 204) OR (class = 207)) BEGIN SET cleric = 1 END + PATCH_IF ((class = 11) OR (class = 12) OR (class = 16) OR (class = 18) OR (class = 208) OR (class = 209)) BEGIN SET druid = 1 END + PATCH_IF cleric OR druid BEGIN // sanity check + READ_BYTE 0x27b align + SET good = 0 + SET neutral = 0 + SET lawful = 0 + PATCH_IF ((align = 17) OR (align = 18) OR (align = 19)) BEGIN SET lawful = 1 END + PATCH_IF ((align = 17) OR (align = 33) OR (align = 49)) BEGIN SET good = 1 END + PATCH_IF ((align = 18) OR (align = 34) OR (align = 50)) BEGIN SET neutral = 1 END + PATCH_IF ((align = 19) OR (align = 35) OR (align = 51)) BEGIN SET evil = 1 END + SET lev1 = 0 + SET lev2 = 0 + SET lev3 = 0 + SET lev4 = 0 + SET lev5 = 0 + SET lev6 = 0 + SET lev7 = 0 + SET evil = 0 + READ_LONG 0x2a0 known_off + READ_LONG 0x2a4 known_num + FOR (index = 0 ; index < known_num ; ++index) BEGIN + READ_ASCII (known_off + (index * 0x0c)) spell + PATCH_MATCH ~%spell%~ WITH + ~[Ss][Pp][Pp][Rr]1[0-9][0-9]~ BEGIN SET lev1 = 1 END + ~[Ss][Pp][Pp][Rr]2[0-9][0-9]~ BEGIN SET lev2 = 1 END + ~[Ss][Pp][Pp][Rr]3[0-9][0-9]~ BEGIN SET lev3 = 1 END + ~[Ss][Pp][Pp][Rr]4[0-9][0-9]~ BEGIN SET lev4 = 1 END + ~[Ss][Pp][Pp][Rr]5[0-9][0-9]~ BEGIN SET lev5 = 1 END + ~[Ss][Pp][Pp][Rr]6[0-9][0-9]~ BEGIN SET lev6 = 1 END + ~[Ss][Pp][Pp][Rr]7[0-9][0-9]~ BEGIN SET lev7 = 1 END + DEFAULT + END + END + PATCH_IF lev1 BEGIN + //NUM_d112 ADD_KNOWN_SPELL ~sppr%NUM_d112%~ #0 ~priest~ + PATCH_IF cleric BEGIN + PATCH_IF neutral OR evil BEGIN + //NUM_d114 ADD_KNOWN_SPELL ~sppr%NUM_d114%~ #0 ~priest~ // CLERIC_CAUSE_LIGHT_WOUNDS + END + END + PATCH_IF druid BEGIN + //NUM_d115 ADD_KNOWN_SPELL ~sppr%NUM_d115%~ #0 ~priest~ // CLERIC_SUNSCORCH + END + END + PATCH_IF lev2 BEGIN + //NUM_d217 ADD_KNOWN_SPELL ~sppr%NUM_d217%~ #1 ~priest~ + PATCH_IF cleric BEGIN + PATCH_IF neutral OR evil BEGIN + //NUM_d220 ADD_KNOWN_SPELL ~sppr%NUM_d220%~ #1 ~priest~ // CLERIC_CAUSE_MODERATE_WOUNDS + END + END + PATCH_IF druid BEGIN + //NUM_d218 ADD_KNOWN_SPELL ~sppr%NUM_d218%~ #1 ~priest~ // CLERIC_ALICORN_LANCE + //NUM_d219 ADD_KNOWN_SPELL ~sppr%NUM_d219%~ #1 ~priest~ // CLERIC_BEAST_CLAW + END + END + PATCH_IF lev3 BEGIN + PATCH_IF cleric BEGIN + //NUM_d316 ADD_KNOWN_SPELL ~sppr%NUM_d316%~ #2 ~priest~ + //NUM_d321 ADD_KNOWN_SPELL ~sppr%NUM_d321%~ #2 ~priest~ + PATCH_IF neutral OR evil BEGIN + //NUM_d320 ADD_KNOWN_SPELL ~sppr%NUM_d320%~ #2 ~priest~ // CLERIC_CAUSE_DISEASE + //NUM_d323 ADD_KNOWN_SPELL ~sppr%NUM_d323%~ #2 ~priest~ // CLERIC_CIRCLE_OF_BONES + //NUM_d330 ADD_KNOWN_SPELL ~sppr%NUM_d330%~ #2 ~priest~ // CLERIC_CAUSE_MEDIUM_WOUNDS + END + PATCH_IF neutral OR good BEGIN + //NUM_d331 ADD_KNOWN_SPELL ~sppr%NUM_d331%~ #2 ~priest~ // CLERIC_FAVOR_OF_ILMATER + END + END + PATCH_IF druid BEGIN + //NUM_d322 ADD_KNOWN_SPELL ~sppr%NUM_d322%~ #2 ~priest~ // CLERIC_MOONBLADE + //NUM_d324 ADD_KNOWN_SPELL ~sppr%NUM_d324%~ #2 ~priest~ // CLERIC_SPIKE_GROWTH + //NUM_d325 ADD_KNOWN_SPELL ~sppr%NUM_d325%~ #2 ~priest~ // CLERIC_CLOUDBURST + //NUM_d326 ADD_KNOWN_SPELL ~sppr%NUM_d326%~ #2 ~priest~ // CLERIC_MOLD_TOUCH + //NUM_d327 ADD_KNOWN_SPELL ~sppr%NUM_d327%~ #2 ~priest~ // CLERIC_STORM_SHELL + END + END + PATCH_IF lev4 BEGIN + PATCH_IF cleric BEGIN + //NUM_d421 ADD_KNOWN_SPELL ~sppr%NUM_d421%~ #3 ~priest~ + //NUM_d424 ADD_KNOWN_SPELL ~sppr%NUM_d424%~ #3 ~priest~ + PATCH_IF !lawful BEGIN + //NUM_d422 ADD_KNOWN_SPELL ~sppr%NUM_d422%~ #3 ~priest~ // CLERIC_BLOOD_RAGE + END + PATCH_IF evil BEGIN + //NUM_d423 ADD_KNOWN_SPELL ~sppr%NUM_d423%~ #3 ~priest~ // CLERIC_CLOUD_OF_PESTILENCE + END + END + PATCH_IF druid BEGIN + //NUM_d418 ADD_KNOWN_SPELL ~sppr%NUM_d418%~ #3 ~priest~ // CLERIC_GIANT_INSECT + //NUM_d419 ADD_KNOWN_SPELL ~sppr%NUM_d419%~ #3 ~priest~ // CLERIC_PRODUCE_FIRE + //NUM_d420 ADD_KNOWN_SPELL ~sppr%NUM_d420%~ #3 ~priest~ // CLERIC_STATIC_CHARGE + //NUM_d425 ADD_KNOWN_SPELL ~sppr%NUM_d425%~ #3 ~priest~ // CLERIC_STAR_METAL_CUDGEL + //NUM_d426 ADD_KNOWN_SPELL ~sppr%NUM_d426%~ #3 ~priest~ // CLERIC_SMASHING_WAVE + //NUM_d427 ADD_KNOWN_SPELL ~sppr%NUM_d427%~ #3 ~priest~ // CLERIC_THORN_SPRAY + //NUM_d428 ADD_KNOWN_SPELL ~sppr%NUM_d428%~ #3 ~priest~ // CLERIC_WALL_OF_MOONLIGHT + END + END + PATCH_IF lev5 BEGIN + PATCH_IF cleric BEGIN + //NUM_d518 ADD_KNOWN_SPELL ~sppr%NUM_d518%~ #4 ~priest~ + //NUM_d521 ADD_KNOWN_SPELL ~sppr%NUM_d521%~ #4 ~priest~ + PATCH_IF evil BEGIN + //NUM_d523 ADD_KNOWN_SPELL ~sppr%NUM_d523%~ #4 ~priest~ // CLERIC_MASS_CAUSE_LIGHT_WOUNDS + END ELSE BEGIN + //NUM_d520 ADD_KNOWN_SPELL ~sppr%NUM_d520%~ #4 ~priest~ // CLERIC_SHIELD_OF_LATHANDER + END + END + PATCH_IF druid BEGIN + //NUM_d519 ADD_KNOWN_SPELL ~sppr%NUM_d519%~ #4 ~priest~ // CLERIC_SPIKE_STONES + //NUM_d522 ADD_KNOWN_SPELL ~sppr%NUM_d522%~ #4 ~priest~ // CLERIC_ANIMAL_RAGE + END + END + PATCH_IF lev6 BEGIN + //NUM_d615 ADD_KNOWN_SPELL ~sppr%NUM_d615%~ #5 ~priest~ + PATCH_IF cleric BEGIN + //NUM_d618 ADD_KNOWN_SPELL ~sppr%NUM_d618%~ #5 ~priest~ + END + PATCH_IF druid BEGIN + //NUM_d617 ADD_KNOWN_SPELL ~sppr%NUM_d617%~ #5 ~priest~ // CLERIC_WHIRLWIND + END + END + PATCH_IF lev7 BEGIN + //NUM_d733 ADD_KNOWN_SPELL ~sppr%NUM_d733%~ #6 ~priest~ + PATCH_IF cleric BEGIN + //NUM_d714 ADD_KNOWN_SPELL ~sppr%NUM_d714%~ #6 ~priest~ + //NUM_d716 ADD_KNOWN_SPELL ~sppr%NUM_d716%~ #6 ~priest~ + PATCH_IF evil BEGIN + //NUM_d734 ADD_KNOWN_SPELL ~sppr%NUM_d734%~ #6 ~priest~ // CLERIC_DESTRUCTION + //NUM_d739 ADD_KNOWN_SPELL ~sppr%NUM_d739%~ #6 ~priest~ // CLERIC_ENERGY_DRAIN + END + PATCH_IF good BEGIN + //NUM_d735 ADD_KNOWN_SPELL ~sppr%NUM_d735%~ #6 ~priest~ // CLERIC_GREATER_SHIELD_OF_LATHANDER + END + END + PATCH_IF druid BEGIN + //NUM_d736 ADD_KNOWN_SPELL ~sppr%NUM_d736%~ #6 ~priest~ // CLERIC_MIST_OF_ELDATH + //NUM_d737 ADD_KNOWN_SPELL ~sppr%NUM_d737%~ #6 ~priest~ // CLERIC_STALKER + END + END + END + END \ No newline at end of file diff --git a/iwdification/lib/divine_spells_postproduction.tpa b/iwdification/lib/divine_spells_postproduction.tpa new file mode 100644 index 0000000..d2899a6 --- /dev/null +++ b/iwdification/lib/divine_spells_postproduction.tpa @@ -0,0 +1,324 @@ +DEFINE_ACTION_FUNCTION divine_spells_postproduction STR_VAR tra="" BEGIN + + ACTION_IF "%tra%" STRING_EQUAL_CASE "" BEGIN + LAF no_chant_spell_failure END + // LAF remove_cause_wounds_alignment_restrictions END + LAF run STR_VAR file=dealign_cleric_spells version=2 location="%iwdspells_lib%" END + END ELSE BEGIN + WITH_TRA "%tra%" BEGIN + LAF no_chant_spell_failure END + // LAF remove_cause_wounds_alignment_restrictions END + LAF run STR_VAR file=dealign_cleric_spells version=1 location="%iwdspells_lib%" END + END + END + + LAF include STR_VAR file=summoned_monsters.tpa location="%iwdspells_lib%" END + LAF summoned_monsters_divine END + LAF make_physical_mirror_level_5 END + LAF patch_cures_into_stores END + LAF clearair_divine END + LAF hide_old_cause_wounds END + LAF pc_spells END + ACTION_IF !demivrgvs BEGIN + LAF bg2ify_cure_moderate_wounds END + END + LAF entropy_shield_flame_strike END + LAF monster_summoning_divine_cosmetic END + + INCLUDE ~%obg2_res_path%/functions.tpa~ + INCLUDE ~%obg2_res_path%/cd_divine_post.tpa~ + INCLUDE ~%obg2_res_path%/cross_patch_both.tpa~ + +END + +////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION no_chant_spell_failure BEGIN + + ACTION_IF VARIABLE_IS_SET $IWD_spell_installed("CLERIC_CHANT") BEGIN + // remove spell-failure effect from CHANT + + MAKE_PATCH + delete_effect=>"opcode=145" + say_description=>1 + END + LAF edit_spell STR_VAR spell=CLERIC_CHANT edits=patch_data END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION remap_symbol_pain_pro BEGIN + + ACTION_IF VARIABLE_IS_SET $IWD_spell_installed("CLERIC_SYMBOL_OF_PAIN") BEGIN + LAF edit_spell STR_VAR spell=CLERIC_SYMBOL_OF_PAIN editstring="patch_ability_inline=>~projectile=>225~" END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION patch_cures_into_stores BEGIN + + // patch Cure Moderate Wounds into temples + // (while we're at it, do Cure Medium Wounds, which gets left out quite often) + + OUTER_SET desc=$strref_map(19397) + APPEND ~speldesc.2da~ ~%CLERIC_CURE_MODERATE_WOUNDS% %desc%~ + OUTER_SPRINT has_light "" + OUTER_SPRINT no_medium "" + COPY_EXISTING_REGEXP GLOB ".*\.sto" "%workspace%" + PATCH_IF INDEX_BUFFER ("%CLERIC_CURE_LIGHT_WOUNDS%")>=0 BEGIN + SPRINT has_light "%has_light% %SOURCE_RES%" + PATCH_IF INDEX_BUFFER ("%CLERIC_CURE_MEDIUM_WOUNDS%")<0 BEGIN + SPRINT no_medium "%no_medium% %SOURCE_RES%" + END + END + BUT_ONLY + + MAKE_PATCH + match=>"item_resource=SPPR103" + item_resource=>"%CLERIC_CURE_MEDIUM_WOUNDS%" + cure_price=>"3*cure_price" + END + ACTION_IF "%no_medium%" STRING_COMPARE_CASE "" BEGIN + LAF edit_store STR_VAR store="%no_medium%" editstring="clone_cure=>patch_data" END + END + + MAKE_PATCH + match=>"item_resource=SPPR103" + item_resource=>"%CLERIC_CURE_MODERATE_WOUNDS%" + cure_price=>"2*cure_price" + END + ACTION_IF "%no_medium%" STRING_COMPARE_CASE "" BEGIN + LAF edit_store STR_VAR store="%has_light%" editstring="clone_cure=>patch_data" END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////// +// update joinable characters' divine spellbooks + +DEFINE_ACTION_FUNCTION pc_spells BEGIN + + LAM read_in_PCs + LAM read_in_hidespl + + // main part + COPY_EXISTING_REGEXP GLOB ~.*\.cre~ ~override~ + PATCH_TRY + SPRINT filename ~%SOURCE_RES%~ + LPF CRE_is_PC RET value END + PATCH_IF value BEGIN + LPF CRE_add_all_priest_spells END + END + WITH DEFAULT + LPF regexp_warning STR_VAR parent=pc_spells END + END + BUT_ONLY + +END + +////////////////////////////////////////////////////////////////////////////////////////////////// +// update CLEARAIR.2DA to include Cloud of Pestilence + +DEFINE_ACTION_FUNCTION clearair_divine BEGIN + + ACTION_IF VARIABLE_IS_SET $IWD_spell_installed("CLERIC_CLOUD_OF_PESTILENCE") BEGIN + + COPY_EXISTING "%CLERIC_CLOUD_OF_PESTILENCE%.spl" "%override%" + READ_LONG 0x64 ab_off + READ_SHORT (0x26+ab_off) proj + BUT_ONLY + OUTER_SET proj -= 1 + APPEND "clearair.2da" "cloud_of_pest %proj%" + COPY_EXISTING "clearair.2da" override PRETTY_PRINT_2DA + END + +END + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// remove alignment restrictions from Cause Wounds +// (don't install if SR present) +// now obsolete + + +/* +DEFINE_ACTION_FUNCTION remove_cause_wounds_alignment_restrictions +BEGIN + LAF check_ini STR_VAR ini=keep_cause_wounds_alignment_restrictions RET value END + ACTION_IF !value && !demivrgvs BEGIN + MAKE_PATCH + CAUSE_LIGHT_WOUNDS=>2 + CAUSE_MODERATE_WOUNDS=>3 + CAUSE_MEDIUM_WOUNDS=>4 + CAUSE_SERIOUS_WOUNDS_IWD=>5 + CAUSE_CRITICAL_WOUNDS_IWD=>6 + MASS_CAUSE_LIGHT_WOUNDS=>7 + END + ACTION_PHP_EACH patch_data AS spell=>strref BEGIN + OUTER_SPRINT spellname EVAL "%CLERIC_%spell%%" + OUTER_SPRINT scrollname EVAL "%CLERIC_%spell%_SCROLL%" + OUTER_SPRINT oldstring (AT strref) + COPY_EXISTING "%spellname%.spl" override + LPF patch_text_entry INT_VAR loc=0x50 STR_VAR function=substitute_string arguments="~%oldstring%~=>null" END + LPF SPL_unusable_good_priest STR_VAR arguments=0 END + LPF SPL_unusable_GEneutral_priest STR_VAR arguments=0 END + BUT_ONLY + ACTION_IF FILE_EXISTS_IN_GAME "%scrollname%.itm" BEGIN + COPY_EXISTING "%scrollname%.itm" override + LPF patch_text_entry INT_VAR loc=0x54 STR_VAR function=substitute_string arguments="~%oldstring%~=>null" END + LPF ITM_unusable_good_priest STR_VAR arguments=0 END + LPF ITM_unusable_GEneutral_priest STR_VAR arguments=0 END + BUT_ONLY + END + END + END +END +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// make Physical Mirror 5th level + +DEFINE_ACTION_FUNCTION make_physical_mirror_level_5 BEGIN + + // we leave the old one in to aid mod compatibility + + // disable original version from spell.ids and from the selection screen (no need to remove it from spellbooks since we redo them globally for IWD anyway) + + COPY_EXISTING spell.ids override + REPLACE_TEXTUALLY CLERIC_PHYSICAL_MIRROR CLERIC_MIRROR_OLD // avoid 'CLERIC_PHYSICAL_MIRROR' because it's better not to have an ids entry that's a substring of another one + BUT_ONLY + ACTION_IF enhanced_edition BEGIN + APPEND "hidespl.2da" "%CLERIC_PHYSICAL_MIRROR% 1 0 0" + END + + // put new version into place + + COPY_EXISTING "%CLERIC_PHYSICAL_MIRROR%.spl" override + ADD_SPELL "override/%CLERIC_PHYSICAL_MIRROR%.spl" 1 5 CLERIC_PHYSICAL_MIRROR + OUTER_INNER_PATCH_SAVE CLERIC_PHYSICAL_MIRROR "%CLERIC_PHYSICAL_MIRROR%" BEGIN + INSERT_BYTES 0x0 3 + WRITE_ASCII 0x0 "SPPR" + END + + // patch new version + + MAKE_PATCH + level=>5 + patch_ability_inline=>"casting_time=>5" + patch_effect_inline=>"power=>5" + substitute_description=>"6=>5" + END + LAF edit_spell STR_VAR spell="%CLERIC_PHYSICAL_MIRROR%" edits=patch_data END + + +END + + +////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION bg2ify_cure_moderate_wounds BEGIN + + COPY_EXISTING "%CLERIC_CURE_MODERATE_WOUNDS%.spl" "override" + READ_LONG 0x8 name_new_strref + READ_STRREF 0x8 name_new + BUT_ONLY + COPY_EXISTING "%CLERIC_CURE_MEDIUM_WOUNDS%.spl" "override/%CLERIC_CURE_MODERATE_WOUNDS%.spl" + READ_STRREF 0x8 name_old + WRITE_LONG 0x8 name_new_strref + WRITE_LONG 0x34 2 + READ_STRREF 0x50 desc + INNER_PATCH_SAVE desc "%desc%" BEGIN + REPLACE_TEXTUALLY 14 11 + REPLACE_TEXTUALLY 3 2 + REPLACE_TEXTUALLY "%name_old%" "%name_new%" + END + SAY_EVALUATED 0x50 "%desc%" + WRITE_ASCIIE 0x3a "%CLERIC_CURE_MODERATE_WOUNDS%C" (8) + WRITE_ASCIIE 0x76 "%CLERIC_CURE_MODERATE_WOUNDS%B" (8) + LPF ALTER_EFFECT INT_VAR power=2 END + LPF ALTER_EFFECT INT_VAR match_opcode=17 parameter1=11 END + BUT_ONLY + + +END + + + +////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION hide_old_cause_wounds BEGIN + + ACTION_IF !demivrgvs BEGIN + // hide BG2 versions of Cause Serious/Critical Wounds (we leave them in just to avoid AI confusions in other mods) + + ACTION_IF enhanced_edition BEGIN + APPEND "hidespl.2da" "%CLERIC_CAUSE_SERIOUS_WOUNDS% 1 0 0" + APPEND "hidespl.2da" "%CLERIC_CAUSE_CRITICAL_WOUNDS% 1 0 0" + END + END + +END + +////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION entropy_shield_flame_strike BEGIN + + ACTION_DEFINE_ASSOCIATIVE_ARRAY flame_strike_map BEGIN + sppr503=>sppr503d + sppr985=>sppr985d + spin799=>spin799d + ohbeflam=>"dw#ohbef" + spimix01=>"dw#spimi" + END + ACTION_PHP_EACH flame_strike_map AS spell=>helper BEGIN + LAF externalise_flame_strike_damage STR_VAR spell helper END + END + + + + + +END + +DEFINE_ACTION_FUNCTION externalise_flame_strike_damage + STR_VAR spell="" + helper="" +BEGIN + ACTION_IF FILE_EXISTS_IN_GAME "%spell%.spl" BEGIN + // make duplicate of spell that only does damage + ACTION_IF !FILE_EXISTS_IN_GAME "%helper%.spl" BEGIN + COPY_EXISTING "%spell%.spl" "override/%helper%.spl" + LPF DELETE_EFFECT STR_VAR match_function=opcode_is_not_damage END + LPF ALTER_SPELL_HEADER INT_VAR projectile=0 END + WRITE_LONG 0x8 "-1" + // replace damage effects in spell with casting of new spell + COPY_EXISTING "%spell%.spl" override + LPF ALTER_EFFECT INT_VAR match_opcode=12 dicenumber=0 dicesize=0 opcode=146 savingthrow=0 savebonus=0 parameter1=0 parameter2=2 STR_VAR resource="%helper%" END + BUT_ONLY + END + // alter protection from Entropy Shield to protect against helper + COPY_EXISTING "%CLERIC_ENTROPY_SHIELD%.spl" override + REPLACE_TEXTUALLY "%spell%" "%helper%" (8) + END +END + +DEFINE_PATCH_FUNCTION opcode_is_not_damage +STR_VAR arguments="" +RET value +BEGIN + READ_SHORT 0x0 opcode + value= (opcode=12)? 0: 1 +END + +DEFINE_ACTION_FUNCTION monster_summoning_divine_cosmetic BEGIN + + ACTION_FOR_EACH 2da IN ginsect sshamb BEGIN + ACTION_IF FILE_EXISTS_IN_GAME "%2da%.2da" BEGIN + COPY_EXISTING "%2da%.2da" override + REPLACE_TEXTUALLY "msumm1h.*" "spanisum none" + BUT_ONLY + END + END + +END + diff --git a/iwdification/lib/ds.tph b/iwdification/lib/ds.tph new file mode 100644 index 0000000..3354d03 --- /dev/null +++ b/iwdification/lib/ds.tph @@ -0,0 +1,1207 @@ +// Detectable Spells v 4.01 +// August 2020 - DavidW +// +// Changes: +// - we now keep our own local copy of stats.ids and splstate.ids data, to avoid having to run CLEAR_IDS_MAP a bazillion times +// - removed the need for AUTO_EVAL_STRINGS +// - restored this text! +// - rather belatedly started a v4.xx chain (really 3.96 ought to have been 4.0, since it was rewritten pretty much from scratch, but I don't want to rewrite history by changing it now) + +// Detectable Spells v3.96 +// January 2019 - David Wallace ('DavidW') +// +// Changes: +// - Now incorporate flexible handling of TOBEX stats using BGEE splstate baseline +// - if filename has no .spl suffix, try looking it up in SPELL.ids (and skip if not found) +// - general revamp of the interface to apply detection +// - added function to apply it directly to an individual spell +// - use new 'ds_sort_ids' (exported from SCS's function library 'sort_ids') to sort stats.ids, rather than native ds_sort_stats_ids. +// (sort_ids preserves duplicates, inter alia helpful with CDTweaks proficiencies) + +// Detectable Spells v3.95 +// February 3rd, 2016 - Yaroslav "Ardanis/GeN1e" Kalyuzhnyy + + +////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////// +//// The main function +////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION detectable_spells + INT_VAR fix_khelben=1 +BEGIN + // make sure stats.ids is properly set + LAF ds_stat_entries END + // load current contents of stats.ids and splstate.ids + LAF ds_load_ids STR_VAR ids=stats RET_ARRAY ds_ids_map_stats=ids_map END + LAF ds_load_ids STR_VAR ids=splstate RET_ARRAY ds_ids_map_splstate=ids_map END + // process main tables + ACTION_FOR_EACH table_name IN ds_simple ds_142_variable ds_other_clone buff_misc special BEGIN + LAF ds_process_table INT_VAR complain=0 STR_VAR table=EVAL ".../ds-inline/%table_name%.2da" RET_ARRAY ds_ids_map_stats ds_ids_map_splstate END + END + ACTION_FOR_EACH table_name IN BUFF_PRO_WEAPONS BUFF_PRO_DAMAGE BUFF_PRO_SPELLS BUFF_PRO_EFFECTS BUFF_ENHANCEMENT STATE_ENRAGED BEGIN + LAF ds_process_table INT_VAR complain=0 STR_VAR table=EVAL ".../ds-inline/%table_name%.2da" default_stat=EVAL "%table_name%" RET_ARRAY ds_ids_map_stats ds_ids_map_splstate END + END + ACTION_IF fix_khelben BEGIN + LAF ds_fix_khelben END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////// +//// The data +////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +////////////////////////////////////////////////////////////////////////////////////////////////////////// +//// The bulk of entries are simple 142-clones +////////////////////////////////////////////////////////////////////////////////////////////////////////// + +<<<<<<<< .../ds-inline/ds_simple.2da +resource stat +CLERIC_ARMOR_OF_FAITH ARMOR_OF_FAITH +CLERIC_CHAOTIC_COMMANDS CHAOTIC_COMMANDS +CLERIC_CHAOTIC_COMMANDS CLERIC_CHAOTIC_COMMANDS +BARBARIAN_RAGE BARBARIAN_RAGE +BERSERKER_RAGE BERSERKER_RAGE +MINSC_BERSERK MINSC_BERSERK +ASSASSIN_POISON POISON_WEAPON +KENSAI_KIA KENSAI_KIA +SPDWD02 DEFENSIVE_STANCE +ARCHER_CALL_SHOT ARCHER_CALL_SHOT +WIZARD_CHAOS_SHIELD SPLSTATE:CHAOS_SHIELD +WIZARD_IMPROVED_CHAOS_SHIELD IMPROVED_CHAOS_SHIELD +SPCL542A SKALD_SONG +SPCL751A JESTER_SONG +POTN21 POTION_OF_CLARITY +POTN33 POTION_OF_MAGIC_BLOCKING +SCRL07 SCROLL_OF_PROTECTION_FROM_MAGIC +SCRL09 SCROLL_OF_PROTECTION_FROM_UNDEAD +WIZARD_PROTECTION_FROM_PETRIFICATION PROTECTION_FROM_PETRIFICATION +POTN38 PROTECTION_FROM_PETRIFICATION +CAVALIER_REMOVE_FEAR RESIST_FEAR +CLERIC_REMOVE_FEAR RESIST_FEAR +WIZARD_RESIST_FEAR RESIST_FEAR +SPRA303 PROTECTION_FROM_NORMAL_MISSILES +WIZARD_PROTECTION_FROM_NORMAL_MISSILES PROTECTION_FROM_NORMAL_MISSILES +WIZARD_PROTECTION_FROM_NORMAL_WEAPONS PROTECTION_FROM_NORMAL_WEAPONS +WIZARD_TENSERS_TRANSFORMATION TENSERS_TRANSFORMATION +SUN_SOUL_GREATER_SUN RED_FIRESHIELD +TALOS_STORMSHIELD STORM_SHELL +CLERIC_DOOM DOOM +CLERIC_FAERIE_FIRE FAERIE_FIRE +CLERIC_BARKSKIN BARKSKIN +CLERIC_MISCAST_MAGIC MISCAST_MAGIC +CLERIC_DEATH_WARD DEATH_WARD +CLERIC_DEATH_WARD SPLSTATE:DEATH_WARD +CLERIC_HOLY_POWER HOLY_POWER +WIZARD_GLITTERDUST GLITTERDUST +WIZARD_FIRE_SHIELD_BLUE BLUE_FIRESHIELD +WIZARD_EMOTION_HOPELESSNESS HOPELESSNESS +WIZARD_GREATER_MALISON MALISON +SPWI413A OTILUKES_RESILIENT_SPHERE +WIZARD_FIRE_SHIELD_RED RED_FIRESHIELD +WIZARD_PROTECTION_FROM_THE_ELEMENTS WIZARD_PROTECTION_FROM_THE_ELEMENTS +WARRIOR_HARDINESS HARDINESS +WIZARD_PROTECTION_FROM_MAGIC_ENERGY WIZARD_PROTECTION_FROM_MAGIC_ENERGY +WIZARD_SPELL_IMMUNITY_ABJURATION SI_ABJURATION +WIZARD_SPELL_IMMUNITY_CONJURATION SI_CONJURATION +WIZARD_SPELL_IMMUNITY_DIVINATION SI_DIVINATION +WIZARD_SPELL_IMMUNITY_ENCHANTMENT SI_ENCHANTMENT +WIZARD_SPELL_IMMUNITY_ILLUSIONIST SI_ILLUSION +WIZARD_SPELL_IMMUNITY_INVOCATION SI_EVOCATION +WIZARD_SPELL_IMMUNITY_NECROMANCY SI_NECROMANCY +WIZARD_SPELL_IMMUNITY_ALTERATION SI_TRANSMUTATION +CLERIC_FREE_ACTION CLERIC_FREE_ACTION +POTN45 CLERIC_FREE_ACTION +CLERIC_DEFENSIVE_HARMONY CLERIC_DEFENSIVE_HARMONY +CLERIC_PROTECTION_FROM_EVIL_10_FOOT PROTECTION_FROM_EVIL +CLERIC_PROTECT_FROM_EVIL PROTECTION_FROM_EVIL +WIZARD_PROTECTION_FROM_EVIL PROTECTION_FROM_EVIL +PALADIN_PROTECTION_FROM_EVIL PROTECTION_FROM_EVIL +SPCL233 PROTECTION_FROM_EVIL +CLERIC_REGENERATE CLERIC_REGENERATION +BHAAL1B CLERIC_REGENERATION +CLERIC_TRUE_SIGHT TRUE_SIGHT +WIZARD_TRUE_SIGHT TRUE_SIGHT +KOA_TRUE_SIGHT_NO_VIS TRUE_SIGHT +INQUIS_TRUE_SIGHT TRUE_SIGHT +HELM_TRUE_SIGHT TRUE_SIGHT +LATHANDER_BOON LEVEL_DRAIN_IMMUNITY +WIZARD_PROTECTION_FROM_ENERGY WIZARD_PROTECTION_FROM_ENERGY +WIZARD_IMPROVED_ALUCRITY WIZARD_IMPROVED_ALACRITY +SPWISH17 WIZARD_IMPROVED_ALACRITY +WIZARD_GLITTERDUST CANNOT_TURN_INVISIBLE +WIZARD_SHIELD WIZARD_SHIELD +>>>>>>>> + + +////////////////////////////////////////////////////////////////////////////////////////////////////////// +//// These all use opcode 142, but have variable values. Most are legacy. +//// +//// The protection_from_weapons spells, being mutually incompatible, can share slots +//// The Fire Shield effects have a legacy detection that shares WIZARD_FIRE_SHIELD +//// The SI spells have a legacy detection that shares WIZARD_SPELL_IMMUNITY +//// Many offensive powers share a (partly legacy) opcode; so do many strength powers; so do many defensive +//// powers +////////////////////////////////////////////////////////////////////////////////////////////////////////// + +<<<<<<<< .../ds-inline/ds_142_variable.2da +resource stat stat_value +WIZARD_MANTLE WIZARD_PROTECTION_FROM_MAGIC_WEAPONS 1 +WIZARD_IMPROVED_MANTLE WIZARD_PROTECTION_FROM_MAGIC_WEAPONS 2 +WIZARD_ABSOLUTE_IMMUNITY WIZARD_PROTECTION_FROM_MAGIC_WEAPONS 3 +WIZARD_PROTECTION_FROM_MAGIC_WEAPONS WIZARD_PROTECTION_FROM_MAGIC_WEAPONS 4 +PROTECTION_MAGIC_WEAPON_NOEFF WIZARD_PROTECTION_FROM_MAGIC_WEAPONS 4 +WIZARD_FIRE_SHIELD_RED WIZARD_FIRE_SHIELD 1 +WIZARD_FIRE_SHIELD_BLUE WIZARD_FIRE_SHIELD 2 +CLERIC_AURA_OF_FLAMING_DEATH WIZARD_FIRE_SHIELD 1 +SUN_SOUL_GREATER_SUN WIZARD_FIRE_SHIELD 1 +WIZARD_SPELL_IMMUNITY_ABJURATION WIZARD_SPELL_IMMUNITY 1 +WIZARD_SPELL_IMMUNITY_CONJURATION WIZARD_SPELL_IMMUNITY 2 +WIZARD_SPELL_IMMUNITY_DIVINATION WIZARD_SPELL_IMMUNITY 3 +WIZARD_SPELL_IMMUNITY_ENCHANTMENT WIZARD_SPELL_IMMUNITY 4 +WIZARD_SPELL_IMMUNITY_ILLUSIONIST WIZARD_SPELL_IMMUNITY 5 +WIZARD_SPELL_IMMUNITY_INVOCATION WIZARD_SPELL_IMMUNITY 6 +WIZARD_SPELL_IMMUNITY_NECROMANCY WIZARD_SPELL_IMMUNITY 7 +WIZARD_SPELL_IMMUNITY_ALTERATION WIZARD_SPELL_IMMUNITY 8 +WIZARD_TENSERS_TRANSFORMATION OFFENSIVE_MODIFIER 1 +CLERIC_CHAMPIONS_STRENGTH OFFENSIVE_MODIFIER 1 +BARBARIAN_RAGE OFFENSIVE_MODIFIER 1 +BERSERKER_RAGE OFFENSIVE_MODIFIER 1 +MINSC_BERSERK OFFENSIVE_MODIFIER 1 +LATHANDER_BOON OFFENSIVE_MODIFIER 1 +MONK_STUNNING_BLOW OFFENSIVE_MODIFIER 2 +WARRIOR_DEATHBLOW OFFENSIVE_MODIFIER 2 +WARRIOR_POWER_ATTACK OFFENSIVE_MODIFIER 2 +BLADE_OFFENSIVE_SPIN OFFENSIVE_MODIFIER 2 +BLADE_DEFENSIVE_SPIN OFFENSIVE_MODIFIER 2 +KENSAI_KIA OFFENSIVE_MODIFIER 2 +INVOKE_COURAGE OFFENSIVE_MODIFIER 3 +WARRIOR_GREATER_DEATHBLOW OFFENSIVE_MODIFIER 3 +WARRIOR_CRITICAL_STRIKE OFFENSIVE_MODIFIER 3 +ROGUE_ASSASINATION OFFENSIVE_MODIFIER 4 +ASSASSIN_POISON OFFENSIVE_MODIFIER 4 +WARRIOR_WHIRLWIND OFFENSIVE_MODIFIER 4 +WARRIOR_GREATER_WHIRLWIND OFFENSIVE_MODIFIER 5 +WARRIOR_SMITE OFFENSIVE_MODIFIER 5 +MONK_QUIVERING_PALM OFFENSIVE_MODIFIER 5 +WIZARD_TENSERS_TRANSFORMATION OFFENSIVE_MODIFIER 1 +WIZARD_STRENGTH STRENGTH_MODIFIER 2 +CLERIC_STRENGTH_OF_ONE STRENGTH_MODIFIER 2 +CLERIC_HOLY_POWER STRENGTH_MODIFIER 3 +CLERIC_CHAMPIONS_STRENGTH STRENGTH_MODIFIER 3 +CLERIC_DRAW_UPON_HOLY_MIGHT STRENGTH_MODIFIER 4 +INNATE_DRAW_UPON_HOLY_MIGHT STRENGTH_MODIFIER 4 +CLERIC_RIGHTEOUS_MAGIC STRENGTH_MODIFIER 6 +BHAAL2A STRENGTH_MODIFIER 4 +DGRIGHT STRENGTH_MODIFIER 6 +CLERIC_BARKSKIN DEFENSIVE_MODIFIER 1 +WIZARD_ARMOR DEFENSIVE_MODIFIER 3 +WIZARD_SHIELD DEFENSIVE_MODIFIER 2 +WIZARD_GHOST_ARMOR DEFENSIVE_MODIFIER 4 +WIZARD_SPIRIT_ARMOR DEFENSIVE_MODIFIER 5 +CLERIC_GLOBE_OF_BLADES CLERIC_BLADE_BARRIER 1 +NPC_BLADE_BARRIER CLERIC_BLADE_BARRIER 1 +CLERIC_BLADE_BARRIER CLERIC_BLADE_BARRIER 2 +MELIS02 CLERIC_BLADE_BARRIER 2 +>>>>>>>> + +////////////////////////////////////////////////////////////////////////////////////////////////////////// +//// These work better associated to other opcodes +//// +//// Insect plague is better attached to the insect overlay +//// Spell Deflection/Turning/Trap/SpellShield and Physical Mirror are best indexed to the actual effects +//// Also true for Mislead etc - though these are dangerous to detect this way and maintained only on +//// legacy grounds +//// Some NPC fire shield effects also need detection directly on the condition +////////////////////////////////////////////////////////////////////////////////////////////////////////// + +<<<<<<<< .../ds-inline/ds_other_clone.2da +resource stat stat_value match_opcode +BALSHLD RED_FIRESHIELD 1 232 +BALSHLD WIZARD_FIRE_SHIELD 1 232 +CLERIC_SUMMON_INSECTS CLERIC_INSECT_PLAGUE 1 215 +CLERIC_INSECT_PLAGUE CLERIC_INSECT_PLAGUE 2 215 +CLERIC_CREEPING_DOOM CLERIC_INSECT_PLAGUE 3 215 +WIZARD_MINOR_SPELL_DEFLECTION WIZARD_SPELL_DEFLECTION 1 201 +SPRA302 WIZARD_SPELL_DEFLECTION 1 201 +SPELL_DEFLECTION_NO_VISUAL WIZARD_SPELL_DEFLECTION 2 201 +WIZARD_SPELL_DEFLECTION WIZARD_SPELL_DEFLECTION 2 201 +CLERIC_SHIELD_OF_THE_ARCHONS CLERIC_SHIELD_OF_THE_ARCHONS 1 201 +DGARCHON CLERIC_SHIELD_OF_THE_ARCHONS 1 201 +WIZARD_SPELL_TURNING WIZARD_SPELL_TURNING 2 200 +BEHOLDER_SPELL_TURNING WIZARD_SPELL_TURNING 1 200 +WIZARD_MINOR_SPELL_TURNING WIZARD_SPELL_TURNING 1 200 +WIZARD_SPELL_TRAP WIZARD_SPELL_TRAP 1 259 +WIZARD_SPELL_SHIELD SPELL_SHIELD 1 226 +CLERIC_PHYSICAL_MIRROR CLERIC_PHYSICAL_MIRROR 1 197 +WIZARD_MISLEAD WIZARD_MISLEAD 1 236 +WIZARD_PROJECT_IMAGE WIZARD_MISLEAD 2 236 +WIZARD_SIMULACRUM WIZARD_MISLEAD 3 236 +>>>>>>>> + +////////////////////////////////////////////////////////////////////////////////////////////////////////// +//// These are standard markups (from SoD, with DW amendments for IWD) of combat buffs +//// +//// Most are just straightforward 142s +////////////////////////////////////////////////////////////////////////////////////////////////////////// + +<<<<<<<< .../ds-inline/BUFF_PRO_DAMAGE.2da +resource +SUN_SOUL_GREATER_SUN +TALOS_STORMSHIELD +CLERIC_AURA_OF_FLAMING_DEATH +CLERIC_RESIST_FIRE +CLERIC_PROTECTION_FROM_FIRE +CLERIC_PROTECTION_FROM_LIGHTNING +WIZARD_PROTECTION_FROM_FIRE +WIZARD_PROTECTION_FROM_COLD +WIZARD_FIRE_SHIELD_BLUE +WIZARD_FIRE_SHIELD_RED +WIZARD_PROTECTION_FROM_ELECTRICITY +WIZARD_PROTECTION_FROM_ACID +WIZARD_PROTECTION_FROM_MAGIC_ENERGY +WIZARD_PROTECTION_FROM_THE_ELEMENTS +WIZARD_PROTECTION_FROM_ENERGY +POTN02 +POTN18 +POTN22 +POTN31 +POTN35 +>>>>>>>> + +<<<<<<<< .../ds-inline/BUFF_PRO_WEAPONS.2da +resource +SPRA303 +WIZARD_PROTECTION_FROM_NORMAL_MISSILES +WIZARD_PROTECTION_FROM_NORMAL_WEAPONS +WIZARD_PROTECTION_FROM_MAGIC_WEAPONS +WIZARD_MANTLE +WIZARD_IMPROVED_MANTLE +WIZARD_ABSOLUTE_IMMUNITY +>>>>>>>> + +<<<<<<<< .../ds-inline/BUFF_PRO_SPELLS.2da +resource +WIZARD_SPELL_IMMUNITY_ABJURATION +WIZARD_SPELL_IMMUNITY_CONJURATION +WIZARD_SPELL_IMMUNITY_DIVINATION +WIZARD_SPELL_IMMUNITY_ENCHANTMENT +WIZARD_SPELL_IMMUNITY_ILLUSIONIST +WIZARD_SPELL_IMMUNITY_INVOCATION +WIZARD_SPELL_IMMUNITY_NECROMANCY +WIZARD_SPELL_IMMUNITY_ALTERATION +WIZARD_GLOBE_OF_INVULNERABILITY +WIZARD_MINOR_GLOBE_OF_INVULNERABILITY +>>>>>>>> + +<<<<<<<< .../ds-inline/BUFF_PRO_EFFECTS.2da +resource +CLERIC_REMOVE_FEAR +CLERIC_FREE_ACTION +CLERIC_DEATH_WARD +CLERIC_CHAOTIC_COMMANDS +WIZARD_RESIST_FEAR +POTN21 +POTN45 +>>>>>>>> + +<<<<<<<< .../ds-inline/BUFF_ENHANCEMENT.2da +resource +BHAAL2A +CLERIC_DRAW_UPON_HOLY_MIGHT +CLERIC_STRENGTH_OF_ONE +CLERIC_HOLY_POWER +CLERIC_CHAMPIONS_STRENGTH +CLERIC_CHAOTIC_COMMANDS +CLERIC_RIGHTEOUS_MAGIC +CLERIC_BLADE_BARRIER +NPC_BLADE_BARRIER +CLERIC_AURA_OF_FLAMING_DEATH +WIZARD_STRENGTH +WIZARD_FIRE_SHIELD_BLUE +WIZARD_FIRE_SHIELD_RED +WIZARD_TENSERS_TRANSFORMATION +POTN03 +POTN04 +POTN05 +POTN06 +POTN07 +POTN09 +POTN12 +POTN41 +>>>>>>>> + +<<<<<<<< .../ds-inline/STATE_ENRAGED.2da +resource +BARBARIAN_RAGE +BERSERKER_RAGE +MINSC_BERSERK +OHRRAGE +>>>>>>>> + +<<<<<<<< .../ds-inline/buff_misc.2da +resource stat match_opcode +CLERIC_SHIELD_OF_THE_ARCHONS BUFF_PRO_SPELLS 201 +SPRA302 BUFF_PRO_SPELLS 201 +WIZARD_MINOR_SPELL_DEFLECTION BUFF_PRO_SPELLS 201 +WIZARD_SPELL_DEFLECTION BUFF_PRO_SPELLS 201 +WIZARD_SPELL_SHIELD BUFF_PRO_SPELLS 226 +WIZARD_MINOR_SPELL_TURNING BUFF_PRO_SPELLS 200 +WIZARD_SPELL_TURNING BUFF_PRO_SPELLS 200 +WIZARD_SPELL_TRAP BUFF_PRO_SPELLS 259 +WIZARD_MINOR_SPELL_TURNING BUFF_PRO_SPELLS 201 // these are for SR +WIZARD_SPELL_TURNING BUFF_PRO_SPELLS 201 // +WIZARD_SPELL_TRAP BUFF_PRO_SPELLS 201 // +POTN33 BUFF_PRO_SPELLS 102 +CLERIC_PHYSICAL_MIRROR BUFF_PRO_WEAPONS 197 +WIZARD_DETECT_INVISIBILITY DETECT_INVISIBILITY 193 // SR only +>>>>>>>> + +////////////////////////////////////////////////////////////////////////////////////////////////////////// +//// These are special cases where the duration needs to override the clone +////////////////////////////////////////////////////////////////////////////////////////////////////////// + +<<<<<<<< .../ds-inline/special.2da +resource stat match_opcode duration +WIZARD_WARDING_WHIP WIZARD_KHELBENS_WARDING_WHIP 215 7 +INQUIS_TRUE_SIGHT CANNOT_TURN_INVISIBLE 221 7 +SPCL232D CANNOT_TURN_INVISIBLE 221 7 +CLERIC_TRUE_SIGHT CANNOT_TURN_INVISIBLE 221 7 +SPPR505D CANNOT_TURN_INVISIBLE 221 7 +SPPR950 CANNOT_TURN_INVISIBLE 221 7 +WIZARD_TRUE_SIGHT CANNOT_TURN_INVISIBLE 221 7 +SPWI609D CANNOT_TURN_INVISIBLE 221 7 +>>>>>>>> + +////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////// +//// The functions +////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////// + +////////////////////////////////////////////////////////////////////////////////////////////////////////// +//// Process a table of DS instructions +//// possible columns are: +//// - resource (the thing being patched; compulsory; can be a spell.ids ref, a full resource name, or the +//// resref of a spell or item. If the latter, and if both resref.spl and resref.itm exist, spl is default) +//// - stat (the stat being assigned; defaults to the default_stat variable) +//// - stat_value (the value assigned to the stat; defaults to 1) +//// - match_opcode (the opcode to clone; defaults to 142) +//// - match_parameter2 (a restriction on which opcode is cloned; defaults to -1, clone all) +//// - match_resource (a restriction on which opcode is cloned; defaults to SAME, clone all) +//// columns can be in any order, but first row must be column headers. Other columns are ignored +////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION ds_process_table + INT_VAR complain=0 + default_opcode=142 + STR_VAR table="" + default_stat="" + RET_ARRAY ds_ids_map_stats ds_ids_map_splstate +BEGIN + // load IDS, if not already done + ACTION_IF !VARIABLE_IS_SET $ds_ids_map_stats("DS_IDS_MAP_LOADED") BEGIN + LAF ds_load_ids STR_VAR ids=stats RET_ARRAY ds_ids_map_stats=ids_map END + END + ACTION_IF !VARIABLE_IS_SET $ds_ids_map_splstate("DS_IDS_MAP_LOADED") BEGIN + LAF ds_load_ids STR_VAR ids=splstate RET_ARRAY ds_ids_map_splstate=ids_map END + END + + COPY - "%table%" override + // remove comments + REPLACE_TEXTUALLY "//.*" "" + // read in the data + PATCH_FOR_EACH column IN resource stat stat_value match_opcode match_parameter2 match_resource duration BEGIN + SET EVAL "%column%_col"=0 - 1 + END + COUNT_2DA_COLS colcount + READ_2DA_ENTRIES_NOW ds_table_data colcount + // get the column entries + FOR (this_col=0;this_col=0) BEGIN + // go through the table + FOR (this_row=1;this_row=0 BEGIN + READ_2DA_ENTRY_FORMER ds_table_data this_row EVAL "%entry%_col" temp + SPRINT EVAL "%entry%" "%temp%" + END + END + INNER_ACTION BEGIN + LAF ds_make_detectable INT_VAR complain match_opcode match_parameter2 stat_value STR_VAR id=EVAL "%stat%" resource match_resource RET_ARRAY ds_ids_map_stats ds_ids_map_splstate END + END + END + END ELSE BEGIN + PATCH_WARN "DS warning: %table% lacks a 'resource' column" + END + BUT_ONLY +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////// +/// The core function +////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION ds_make_detectable + INT_VAR match_opcode="142" + match_parameter2="-1" + stat_value=1 + complain=1 + STR_VAR id="" + resource="" + match_resource="SAME" + RET_ARRAY ds_ids_map_stats + ds_ids_map_splstate +BEGIN + // load IDS, if not already done + ACTION_IF !VARIABLE_IS_SET $ds_ids_map_stats("DS_IDS_MAP_LOADED") BEGIN + LAF ds_load_ids STR_VAR ids=stats RET_ARRAY ds_ids_map_stats=ids_map END + END + ACTION_IF !VARIABLE_IS_SET $ds_ids_map_splstate("DS_IDS_MAP_LOADED") BEGIN + LAF ds_load_ids STR_VAR ids=splstate RET_ARRAY ds_ids_map_splstate=ids_map END + END + + + // identify the resource + ACTION_IF !"%resource%" STRING_CONTAINS_REGEXP "\." BEGIN // it's a full resource + OUTER_SPRINT filespec "%resource%" + END ELSE BEGIN + // check for a suffix + OUTER_SPRINT suffix "" + OUTER_INNER_PATCH_SAVE resource "%resource%" BEGIN + REPLACE_EVALUATE "^\(.*\):\(.*\)$" BEGIN + SPRINT suffix "%MATCH2%" + END + "%MATCH1%" + END + OUTER_SET spell_num=IDS_OF_SYMBOL (spell "%resource%") + ACTION_IF spell_num>=0 BEGIN + LAF RES_NAME_OF_SPELL_NUM INT_VAR spell_num RET spell_res END + ACTION_IF FILE_EXISTS_IN_GAME "%spell_res%%suffix%.spl" BEGIN + OUTER_SPRINT filespec "%spell_res%%suffix%.spl" + END + END ELSE BEGIN + ACTION_IF FILE_EXISTS_IN_GAME "%resource%%suffix%.spl" BEGIN + OUTER_SPRINT filespec "%resource%%suffix%.spl" + END ELSE + ACTION_IF FILE_EXISTS_IN_GAME "%resource%%suffix%.itm" BEGIN + OUTER_SPRINT filespec "%resource%%suffix%.itm" + END + END + END + // if we succeeded in finding filespec... + ACTION_IF VARIABLE_IS_SET filespec BEGIN + // get the data for the stat + LAF ds_resolve_stat STR_VAR id RET stat_param stat_opcode RET_ARRAY ds_ids_map_stats ds_ids_map_splstate END + // patch + ACTION_IF stat_opcode>=0 BEGIN // return value of -1 means we can't patch this (probably because TOBEX is missing) + COPY_EXISTING "%filespec%" override + LPF DELETE_EFFECT INT_VAR match_opcode=stat_opcode match_parameter2=stat_param END // clear out any previous version + LPF CLONE_EFFECT INT_VAR silent=!complain multi_match=1 match_opcode match_parameter2 opcode=stat_opcode parameter1=stat_value parameter2=stat_param special=(opcode=328) STR_VAR match_resource END + BUT_ONLY + END + + END ELSE BEGIN + ACTION_IF complain BEGIN + WARN "DS tried to add detectable data to %resource%%suffix%, but there is no such resource" + END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION ds_set_vars RET is_tobex enhanced_edition BEGIN + OUTER_SET is_tobex=FILE_EXISTS "tobex.dll" + OUTER_SET enhanced_edition=GAME_IS "BGEE BG2EE EET IWDEE" +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////// +// having already checked it's not, add an entry to a 2da + +DEFINE_ACTION_FUNCTION ds_add_entry + INT_VAR min=0 + STR_VAR id="" file="" + RET stat_ind +BEGIN + ACTION_CLEAR_ARRAY ds_2da_array + COPY_EXISTING "%file%.ids" override + READ_2DA_ENTRIES_NOW ds_2da_array 2 + FOR (i=0;i=89 && (check_stats<=134 || check_stats>=156) && ( check_stats<256 || is_tobex ) )) BEGIN + SET stat_ind=check_stats + SPRINT stat_type stats + PATCH_IF stat_ind>387 BEGIN + SET stat_opcode=318 + SET stat_param=stat_ind + 0x10000 + END ELSE + PATCH_IF stat_ind<=134 && stat_ind>=89 BEGIN + SET stat_opcode=233 + SET stat_param=stat_ind + END ELSE + PATCH_IF stat_ind>=156 BEGIN + SET stat_opcode=282 + SET stat_param=stat_ind - 156 + END ELSE BEGIN // you shouldn't be able to get here + SET stat_opcode=0 - 1 + SET stat_param = 0 - 1 + END + END ELSE BEGIN + // if it's not in stats.ids, check if we're EE or not + PATCH_IF enhanced_edition BEGIN + // is it in SPLSTATE? + PATCH_IF VARIABLE_IS_SET $ds_ids_map_splstate("%id%") BEGIN + // if it's there already, just use it + SET stat_ind = $ds_ids_map_splstate("%id%") + END ELSE BEGIN + // get a new value + LPF ds_add_entry STR_VAR id file=splstate RET stat_ind END + SET $ds_ids_map_splstate("%id%")=stat_ind + END + SPRINT stat_type splstate + SET stat_opcode=328 + SET stat_param=stat_ind + END ELSE BEGIN + // if we're not ToBEx, quit + PATCH_IF is_tobex BEGIN + // get a new value + LPF ds_add_entry INT_VAR min=401 STR_VAR id file=stats RET stat_ind END + SET $ds_ids_map_stats("%id%")=stat_ind + SPRINT stat_type stats + SET stat_opcode=318 + SET stat_param=stat_ind + 0x10000 + END ELSE BEGIN + SPRINT stat_type null + SET stat_opcode="-1" + SET stat_param="-1" + SET stat_ind="-1" + END + END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION ds_resolve_stat STR_VAR id="" +RET stat_ind stat_param stat_opcode stat_type +RET_ARRAY ds_ids_map_stats ds_ids_map_splstate +BEGIN + OUTER_INNER_PATCH "" BEGIN + LPF ds_resolve_stat STR_VAR id RET stat_ind stat_param stat_opcode stat_type RET_ARRAY ds_ids_map_stats ds_ids_map_splstate END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////// +//// make sure the required entries in stats.ids are present +////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION ds_stat_entries BEGIN + +LAF ds_set_vars RET is_tobex enhanced_edition END +// first, fix issue with Paladin_protection_from_evil + +COPY_EXISTING spell.ids override +ACTION_IF !FILE_CONTAINS_EVALUATED ("override/spell.ids" "4213[ %TAB%]+PALADIN_PROTECTION_FROM_EVIL") BEGIN + APPEND "spell.ids" "4213 PALADIN_PROTECTION_FROM_EVIL" + END + +ACTION_CLEAR_ARRAY stats_array +ACTION_DEFINE_ASSOCIATIVE_ARRAY stats_array BEGIN +WEAPON_ENCHANTMENT => 109 +CLERIC_ARMOR_OF_FAITH => 110 +WIZARD_SPELL_DEFLECTION => 116 +PROTECTION_FROM_EVIL => 117 +TRUE_SIGHT => 118 +CLERIC_CHAOTIC_COMMANDS => 119 +CLERIC_INSECT_PLAGUE => 120 +CLERIC_BLADE_BARRIER => 121 +CLERIC_PHYSICAL_MIRROR => 122 +CLERIC_SHIELD_OF_THE_ARCHONS => 123 +CLERIC_REGENERATION => 124 +WIZARD_FIRE_SHIELD => 125 +WIZARD_PROTECTION_FROM_MAGIC_ENERGY => 126 +WIZARD_MISLEAD => 127 +WIZARD_PROTECTION_FROM_MAGIC_WEAPONS => 128 +WIZARD_SPELL_TURNING => 129 +WIZARD_PROTECTION_FROM_THE_ELEMENTS => 130 +CLERIC_FREE_ACTION => 131 +WIZARD_KHELBENS_WARDING_WHIP => 132 +CLERIC_DEFENSIVE_HARMONY => 133 +EXTRAPROFICIENCY20 => 134 +SCRIPTINGSTATE1 => 156 +WING_BUFFET => 156 +SCRIPTINGSTATE2 => 157 +DEATH_WARD => 157 +SCRIPTINGSTATE3 => 158 +LEVEL_DRAIN_IMMUNITY =>158 +SCRIPTINGSTATE4 => 159 +OFFENSIVE_MODIFIER => 159 +SCRIPTINGSTATE5 => 160 +DEFENSIVE_MODIFIER => 160 +SCRIPTINGSTATE6 => 161 +STRENGTH_MODIFIER => 161 +WIZARD_SPELL_IMMUNITY => 162 +WIZARD_PROTECTION_FROM_ENERGY => 163 +WIZARD_SPELL_TRAP => 164 +WIZARD_IMPROVED_ALACRITY => 165 +MELEE_THACO_BONUS => 166 +MELEE_DAMAGE_BONUS => 167 +MISSILE_DAMAGE_BONUS => 168 +DISABLE_CIRCLE => 169 +FIST_THACO_BONUS => 170 +FIST_DAMAGE_BONUS => 171 +CLASS_STRING_OVERRIDE_MIXED => 172 +CLASS_STRING_OVERRIDE_LOWER => 173 +PREVENT_SPELL_PROTECTION_EFFECTS => 174 +IMMUNITY_TO_BACKSTAB => 175 +LOCKPICKINGMTPBONUS => 176 +MOVESILENTLYMTPBONUS => 177 +TRAPSMTPBONUS => 178 +PICKPOCKETMTPBONUS => 179 +HIDEINSHADOWSMTPBONUS => 180 +DETECTILLUSIONSMTPBONUS => 181 +SETTRAPSMTPBONUS => 182 +PREVENT_AI_SLOWDOWN => 183 +EXISTANCE_DELAY_OVERRIDE => 184 +ANIMATION_ONLY_HASTE => 185 +NO_PERMANENT_DEATH => 186 +IMMUNE_TO_TURN_UNDEAD => 187 +LEVELDRAIN => 200 +WING_BUFFET => 156 +LEVEL_DRAIN_IMMUNITY => 158 +OFFENSIVE_MODIFIER => 159 +DEFENSIVE_MODIFIER => 160 +STRENGTH_MODIFIER => 161 +WIZARD_PROTECTION_FROM_PETRIFICATION => 176 +WIZARD_SPELL_SHIELD => 177 +WIZARD_RESIST_FEAR => 178 +WIZARD_PROTECTION_FROM_NORMAL_MISSILES => 179 +WIZARD_GREATER_MALISON => 180 +WIZARD_PROTECTION_FROM_NORMAL_WEAPONS => 181 +WIZARD_TENSERS_TRANSFORMATION => 182 +END + +// handle the problematic 176-182 stats + +ACTION_IF !enhanced_edition && !is_tobex BEGIN + // on non-ToBEx, non-EE installs, give them duplicate + // names to match EE usage (this facilitates automated + // hot-swapping of code) + ACTION_DEFINE_ASSOCIATIVE_ARRAY stats_array BEGIN + PROTECTION_FROM_PETRIFICATION => 176 + SPELL_SHIELD => 177 + RESIST_FEAR => 178 + PROTECTION_FROM_NORMAL_MISSILES => 179 + MALISON => 180 + PROTECTION_FROM_NORMAL_WEAPONS => 181 + TENSERS_TRANSFORMATION => 182 + END +END ELSE BEGIN + // on EE/ToBEx installs, add markers to show they are problematic + // (else I look at stats.ids and make the mistake of trusting it) + ACTION_DEFINE_ASSOCIATIVE_ARRAY stats_array BEGIN + PROTECTION_FROM_PETRIFICATION_DONOTUSE => 176 + SPELL_SHIELD_DONOTUSE => 177 + RESIST_FEAR_DONOTUSE => 178 + PROTECTION_FROM_NORMAL_MISSILES_DONOTUSE => 179 + MALISON_DONOTUSE => 180 + PROTECTION_FROM_NORMAL_WEAPONS_DONOTUSE => 181 + TENSERS_TRANSFORMATION_DONOTUSE => 182 + END +END + +COPY_EXISTING "stats.ids" override + REPLACE_TEXTUALLY "[0-9]+ +DMWW_SLOT_[0-9]+\(%WNL%\|%LNL%\|%MNL%\)" "\1" +ACTION_PHP_EACH stats_array AS name => code BEGIN + ACTION_IF !FILE_CONTAINS_EVALUATED ("override/stats.ids" "%code%[ %TAB%]+%name%") BEGIN + APPEND "stats.ids" "%code% %name%" + END +END + + LAF ds_sort_ids STR_VAR ids=stats END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///// Sort an IDS file into numerical order (copy of function in stratagems/sfo/general/lib_general.tpa, with new ds-localised helper function +///// and some EVALs to function in a non-AUTO_EVAL_STRINGS environment) +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION ds_sort_ids STR_VAR ids="" BEGIN + ACTION_CLEAR_ARRAY ids_entries + OUTER_SET max=0 + COPY_EXISTING "%ids%.ids" override + READ_2DA_ENTRIES_NOW ids_array 2 + // top row is either 'IDS V1.0', or a single row entry, or blank + PATCH_IF INDEX_BUFFER ("IDS *V1.0")>=0 BEGIN + SPRINT top_row "IDS V1.0" + END ELSE BEGIN + COUNT_2DA_ROWS 1 rowcount_1 + PATCH_IF rowcount_1=ids_array BEGIN + SPRINT top_row " " + END ELSE BEGIN + READ_2DA_ENTRY 0 0 1 top_row + END + END + FOR (i=0;imax ? num : max + READ_2DA_ENTRY_FORMER ids_array i 1 val + PATCH_IF "%val%" STRING_COMPARE_CASE DMWW_UNUSED_FOR_DELETION BEGIN + PATCH_IF VARIABLE_IS_SET $ids_entries("%num%") BEGIN + SPRINT temp $ids_entries("%num%") + SPRINT $ids_entries("%num%") "%temp% %val%" + END ELSE BEGIN + SPRINT $ids_entries("%num%") "%val%" + END + END + END + END + BUT_ONLY + COPY ".../ds-inline/blank" "override/%ids%.ids" + INSERT_2DA_ROW 0 2 "DW_SORT_IDS_PLACEHOLDER" + SET rowcount=0 + FOR (num=0;num<=max;num+=1) BEGIN + PATCH_IF VARIABLE_IS_SET $ids_entries("%num%") BEGIN + SPRINT list $ids_entries("%num%") + WHILE "%list%" STRING_COMPARE "" BEGIN + LPF ds_return_first_entry STR_VAR list RET entry list END + SPRINT check "%num%--%entry%" + PATCH_IF !VARIABLE_IS_SET EVAL "%check%" BEGIN + INSERT_2DA_ROW rowcount 2 "%num% %entry%" + SET rowcount+=1 + SPRINT EVAL "%check%" "" + END + END + END + END + REPLACE_TEXTUALLY "DW_SORT_IDS_PLACEHOLDER" "%top_row%" +END + +DEFINE_PATCH_FUNCTION ds_return_first_entry + STR_VAR list="" + RET entry + list +BEGIN + PATCH_IF "%list%" STRING_EQUAL "" BEGIN // return nothing if list is empty + SPRINT list "" + SPRINT entry "" + END ELSE + PATCH_IF INDEX (" " "%list%")<0 BEGIN // only one entry + SPRINT entry "%list%" + SPRINT list "" + END ELSE BEGIN + INNER_PATCH_SAVE list "%list%" BEGIN + REPLACE_EVALUATE "\([^ ]*\) \(.*\)" + BEGIN + SPRINT entry "%MATCH1%" + END + "%MATCH2%" + END + END +END + +<<<<<<<< .../ds-inline/blank +>>>>>>>> + + + +////////////////////////////////////////////////////////////////////////////////////// +// Legacy code (adapted from Ardanis DS v3) ////////////// +////////////////////////////////////////////////////////////////////////////////////// + +// Warding Whip can be broken by older versions of DS. Check it up. +// +// If broken, but in a recognizable shape, we try to fix it first, before resorting to replacement with a backup file. +// +// While it likely is possible to write sufficiently sophisticated code to reanimate the file even if it has +// suffered the most dire kind of abuse, I feel that's rather excessive to do so. + +DEFINE_ACTION_FUNCTION ds_fix_khelben BEGIN + +COPY_EXISTING ~spwi705.spl~ override + READ_LONG 0x64 ab_off + READ_SHORT 0x68 ab_num + READ_LONG 0x6a ef_off + fubar=0 + + // check if the file is ok + repair=0 + total=0 + FOR (i=0;i= 0 BEGIN + total +=1 + size -=0x30 + END + PATCH_IF size > 0 && size < 0x30 BEGIN + fubar=1 + PATCH_PRINT ~Detectable Spells: SPWI705.SPL is broken in unknown manner, restoring from a backup~ + END + + // check if the first effect in each header is the expected 233/1/132 + PATCH_IF fubar=0 BEGIN + FOR (i=0;i0x71 BEGIN + LPF ~FJ_SPL_ITM_REINDEX~ END + + + READ_LONG 0x64 ab_off + READ_SHORT 0x68 ab_num + + weapon=0 + FOR (i=0;i fb) AND (hc > 0)) BEGIN + READ_ASCII hf ~eh~ ELSE ~fail~ (hs * hc) + PATCH_IF (~%eh%~ STRING_EQUAL ~fail~) BEGIN + WHILE ((~%eh%~ STRING_EQUAL ~fail~) AND (hc > 0)) BEGIN + READ_ASCII hf ~eh~ ELSE ~fail~ (hs * hc) + hc -= 1 + END + END + DELETE_BYTES hf (hs * hc) + hf = 0x72 + WRITE_LONG 0x64 hf + WRITE_SHORT 0x68 hc + fb = (0x72 + (hs * hc)) + WRITE_LONG 0x6a fb + PATCH_IF !(~%eh%~ STRING_EQUAL ~fail~) BEGIN + INSERT_BYTES hf (hs * hc) + WRITE_ASCIIE hf ~%eh%~ + END +END ELSE PATCH_IF ((hf != 0x72) AND (hc = 0)) BEGIN + hf = 0x72 + WRITE_LONG 0x64 hf +END +FOR (i1 = 0; i1 < (hs * hc); i1 += hs) BEGIN + WRITE_SHORT (hf + i1 + 0x20) fc + READ_SHORT (hf + i1 + 0x1e) cx + fc += cx +END +PATCH_IF (SOURCE_SIZE > (0x72 + (hs * hc) + (0x30 * fc))) BEGIN + DELETE_BYTES (0x72 + (hs * hc) + (0x30 * fc)) (SOURCE_SIZE - (0x72 + (hs * hc) + (0x30 * fc))) +END + +// added by Ardanis +WRITE_SHORT 0x6e 0 + +END // end of function + +////////////////////////////////////////////////////////////////////////////////////// +//// Softcoded version of WEIDU LOOKUP_IDS, because we don't want to have to keep clearing +//// the IDS map +////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION ds_load_ids + STR_VAR ids="" + RET_ARRAY ids_map +BEGIN + ACTION_IF FILE_EXISTS_IN_GAME "%ids%.ids" BEGIN + COPY_EXISTING "%ids%.ids" "override" + READ_2DA_ENTRIES_NOW _ds_ids_entries 2 + FOR (row=0;row<_ds_ids_entries;++row) BEGIN + READ_2DA_ENTRY_FORMER _ds_ids_entries row 0 val + PATCH_IF IS_AN_INT val BEGIN + READ_2DA_ENTRY_FORMER _ds_ids_entries row 1 var + SET $ids_map("%var%")=val + END + END + BUT_ONLY + END + OUTER_SET $ids_map("DS_IDS_MAP_LOADED")=1 +END diff --git a/iwdification/lib/elemental_summoning.tpa b/iwdification/lib/elemental_summoning.tpa new file mode 100644 index 0000000..7f0259b --- /dev/null +++ b/iwdification/lib/elemental_summoning.tpa @@ -0,0 +1,245 @@ +DEFINE_ACTION_FUNCTION elemental_summoning + RET scroll_new +BEGIN + OUTER_SPRINT scroll_new "" + LAF make_label STR_VAR label=dw#elemental_summoning END + + /////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////// + // Removes elemental-battle from elemental-summoning spells. + // + // MODIFIED version of SCS one that works on dw_iwdspells conversion + /////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////// + + // this is the filename for the water elemental CRE + + OUTER_SPRINT water_cre es8watr + + ACTION_DEFINE_ASSOCIATIVE_ARRAY elem_desc_map BEGIN // TRA location of the descriptions of the L6 spells + EARTH=>3 + AIR=>5 + FIRE=>4 + WATER=>6 + END + + // this points to the "Conjure Lesser [x] Elemental" strings (we have to introduce water) + ACTION_IF !GAME_IS "bgee" BEGIN + ACTION_DEFINE_ASSOCIATIVE_ARRAY lesser_elem_name_map BEGIN + AIR=>24827 + EARTH=>24829 + FIRE=>24830 + END + END ELSE BEGIN + ACTION_DEFINE_ASSOCIATIVE_ARRAY lesser_elem_name_map BEGIN + AIR=>26540 + EARTH=>26542 + FIRE=>26530 + END + END + OUTER_SET $lesser_elem_name_map("WATER")=RESOLVE_STR_REF (@7) + + // this points to the names for the various sorts of water elemental + + COPY_EXISTING "%water_cre%.cre" "%workspace%" + SET $water_elem_names("STANDARD")=LONG_AT NAME1 + BUT_ONLY + OUTER_SET $water_elem_names("GREATER")=73479 + OUTER_SET $water_elem_names("ELDER")= RESOLVE_STR_REF (@8) + OUTER_SET $water_elem_names("LESSER")= RESOLVE_STR_REF (@9) + + // this is the "conjure water elemental" string + + COPY_EXISTING "%WIZARD_CONJURE_LESSER_WATER_ELEMENTAL%.spl" "%workspace%" + SET conjure_water_strref=LONG_AT NAME1 + BUT_ONLY + + /////////////////////////////////////////////////////////////// + // remove elemental-summoning overlay from summoned creatures + /////////////////////////////////////////////////////////////// + + ACTION_FOR_EACH creature IN elairsu2 elairsu3 elairsu4 elearsu1 elearsu2 elearsu3 elearsu4 elfirsu1 elfirsu2 elfirsu3 elfirsu4 BEGIN + ACTION_IF FILE_EXISTS_IN_GAME "%creature%.cre" BEGIN + COPY_EXISTING "%creature%.cre" override + REPLACE_TEXTUALLY "wizelsum" "" (8) + REPLACE_TEXTUALLY "wizelsu2" "" (8) + BUT_ONLY + END + END + + /////////////////////////////////////////////////////////////// + // change summoning effects so that allegiance matches summoner + /////////////////////////////////////////////////////////////// + + ACTION_FOR_EACH effect IN speart1 speart2 speart3 splesear spfir1 spfir2 spfir3 splesfir spair1 spair2 spair3 splesair BEGIN + ACTION_IF FILE_EXISTS_IN_GAME "%effect%.eff" BEGIN + COPY_EXISTING "%effect%.eff" override + WRITE_LONG 0x20 0 + BUT_ONLY + END + END + + /////////////////////////////////////////////////////////////// + // edit the L6 spells to change the descriptions and remove the mental-battle opcodes + /////////////////////////////////////////////////////////////// + + ACTION_FOR_EACH key IN EARTH AIR FIRE BEGIN + OUTER_SET strref=$elem_desc_map("%key%") + OUTER_SPRINT spellname "WIZARD_CONJURE_%key%_ELEMENTAL" + OUTER_SPRINT scrollname "%spellname%_SCROLL" + OUTER_SPRINT spell EVAL "%%spellname%%" + OUTER_SPRINT scroll EVAL "%%scrollname%%" + LAF remove_elemental_battle INT_VAR strref STR_VAR spell scroll END + END + + /////////////////////////////////////////////////////////////// + // rename the L5 spells back to Lesser + /////////////////////////////////////////////////////////////// + + ACTION_FOR_EACH key IN EARTH AIR FIRE WATER BEGIN + OUTER_SPRINT spellname "WIZARD_CONJURE_LESSER_%key%_ELEMENTAL" + OUTER_SPRINT scrollname "WIZARD_CONJURE_LESSER_%key%_ELEMENTAL_SCROLL" + OUTER_SPRINT spell EVAL "%%spellname%%" + OUTER_SPRINT scroll EVAL "%%scrollname%%" + OUTER_SET new_name_strref=$lesser_elem_name_map("%key%") + ACTION_GET_STRREF new_name_strref new_name + COPY_EXISTING "%spell%.spl" override + READ_STRREF NAME1 old_name + READ_STRREF 0x50 old_desc + INNER_PATCH_SAVE new_desc "%old_desc%" BEGIN + REPLACE_TEXTUALLY "%old_name%" "%new_name%" + END + SET new_desc_strref=RESOLVE_STR_REF ("%new_desc%") + WRITE_LONG 0x50 new_desc_strref + WRITE_LONG NAME1 new_name_strref + BUT_ONLY + COPY_EXISTING "%scroll%.itm" override + WRITE_LONG DESC new_desc_strref + WRITE_LONG NAME2 new_name_strref + BUT_ONLY + END + + /////////////////////////////////////////////////////////////// + // clone air-elemental summoning to make a water version + // (space here to tweak the CRE files for originality) + /////////////////////////////////////////////////////////////// + + // the spell + + OUTER_SET name=conjure_water_strref + OUTER_SET desc=$elem_desc_map("WATER") + OUTER_SPRINT water_icon "%WIZARD_CONJURE_LESSER_WATER_ELEMENTAL%" + + OUTER_SPRINT template "%WIZARD_CONJURE_AIR_ELEMENTAL%" + COPY_EXISTING "%template%.spl" "%workspace%" + + ADD_SPELL "%workspace%/%template%.spl" 2 6 WIZARD_CONJURE_WATER_ELEMENTAL + WRITE_LONG NAME1 name + SAY 0x50 (AT desc) + LPF ALTER_EFFECT STR_VAR match_resource = spair1 resource = ~dw#wat1~ END + LPF ALTER_EFFECT STR_VAR match_resource = spair2 resource = ~dw#wat2~ END + LPF ALTER_EFFECT STR_VAR match_resource = spair3 resource = ~dw#wat3~ END + REPLACE_TEXTUALLY CASE_INSENSITIVE SPWI621B "%water_icon%B" (8) + REPLACE_TEXTUALLY CASE_INSENSITIVE SPWI621C "%water_icon%C" (8) + + LAF idscode_to_spell INT_VAR idscode="%WIZARD_CONJURE_WATER_ELEMENTAL%" RET resref END + OUTER_INNER_PATCH_SAVE scroll_new "%resref%" BEGIN + WRITE_ASCII 0x0 CDIA + END + + // the scroll (uses an install_iwd_spell_resources function) + + OUTER_SPRINT scroll_old "%WIZARD_CONJURE_AIR_ELEMENTAL_SCROLL%" // only bother if it exists + ACTION_IF FILE_EXISTS_IN_GAME "%scroll_old%.itm" BEGIN + COPY_EXISTING "%scroll_old%.ITM" "override/%scroll_new%.ITM" + WRITE_LONG NAME2 name + SAY DESC (AT desc) + REPLACE_TEXTUALLY CASE_INSENSITIVE SPWI621A "%water_icon%A" (8) + REPLACE_TEXTUALLY CASE_INSENSITIVE SPWI621B "%water_icon%B" (8) + REPLACE_TEXTUALLY CASE_INSENSITIVE SPWI621C "%water_icon%C" (8) + REPLACE_TEXTUALLY CASE_INSENSITIVE SPWI621 "%resref%" (8) + BUT_ONLY + + COPY_EXISTING_REGEXP GLOB ".*\.sto" override + PATCH_TRY + PATCH_IF INDEX_BUFFER ("%scroll_old%")>=0 BEGIN + GET_OFFSET_ARRAY offset_array STO_V10_ITEMS_SOLD + PHP_EACH offset_array AS key=>offset_base BEGIN + LPF STO_read_item_resource RET item_resref=value END + PATCH_IF "%item_resref%" STRING_EQUAL_CASE "%scroll_old%" BEGIN + LPF STO_read_item_num_in_stock RET number_in_stock=value END + END + END + ADD_STORE_ITEM "%scroll_new%" AFTER "%scroll_old%" #1 #0 #0 "IDENTIFIED" (number_in_stock) + END + WITH DEFAULT + LPF regexp_warning STR_VAR parent=elemental_summoning END + END + BUT_ONLY + END + // the EFF files + + COPY_EXISTING "SPAIR1.EFF" "override/DW#WAT1.EFF" WRITE_ASCIIE 0x30 DW#WATE2 (8) + COPY_EXISTING "SPAIR2.EFF" "override/DW#WAT2.EFF" WRITE_ASCIIE 0x30 DW#WATE3 (8) + COPY_EXISTING "SPAIR3.EFF" "override/DW#WAT3.EFF" WRITE_ASCIIE 0x30 DW#WATE4 (8) + + // the CRE files + + // get the CLASS and ANIMATION entries from the water elemental; rename while we're at it + + COPY_EXISTING "%water_cre%.cre" override + READ_LONG 0x28 anim + READ_BYTE 0x273 class + SET temp=$water_elem_names("LESSER") + WRITE_LONG 0x8 temp + WRITE_LONG 0xc temp + BUT_ONLY + ACTION_DEFINE_ASSOCIATIVE_ARRAY air_elem BEGIN + STANDARD=>ELAIRSU2 + GREATER=>ELAIRSU3 + ELDER=>ELAIRSU4 + END + ACTION_DEFINE_ASSOCIATIVE_ARRAY water_elem BEGIN + STANDARD=>DW#WATE2 + GREATER=>DW#WATE3 + ELDER=>DW#WATE4 + END + ACTION_PHP_EACH air_elem AS key=>oldcre BEGIN + OUTER_SPRINT newcre $water_elem("%key%") + OUTER_SET name=$water_elem_names("%key%") + COPY_EXISTING "%oldcre%.cre" "override/%newcre%.cre" + WRITE_LONG 0x28 anim + WRITE_BYTE 0x273 class + WRITE_LONG NAME1 name + WRITE_LONG NAME2 name + BUT_ONLY + END + + +END // end of main function + + /////////////////////////////////////////////////////////////// + // helper functions + /////////////////////////////////////////////////////////////// + + +DEFINE_ACTION_FUNCTION remove_elemental_battle + INT_VAR strref=0 + STR_VAR scroll="" + spell="" +BEGIN + COPY_EXISTING "%spell%.spl" override + PATCH_FOR_EACH opcode_to_delete IN 165 215 142 BEGIN + LPF DELETE_SPELL_EFFECT INT_VAR opcode_to_delete END + END + SAY 0x50 (AT strref) + BUT_ONLY + ACTION_IF FILE_EXISTS_IN_GAME "%scroll%.itm" BEGIN // not present in BGEE + COPY_EXISTING "%scroll%.itm" override + SAY 0x50 (AT strref) + BUT_ONLY + END + +END + + diff --git a/iwdification/lib/functions.tpa b/iwdification/lib/functions.tpa deleted file mode 100644 index 4d16133..0000000 --- a/iwdification/lib/functions.tpa +++ /dev/null @@ -1,633 +0,0 @@ -///// \\\\\ -///// string selector \\\\\ -///// \\\\\ - -OUTER_SET string_attack = 10348 -OUTER_SET string_berserk = 14036 -OUTER_SET string_blinded = 14674 -OUTER_SET string_charmed = 14672 -OUTER_SET string_confused = 14782 -OUTER_SET string_crawler = 9360 -OUTER_SET string_cursed = 17426 -OUTER_SET string_dcharmed = 14780 -OUTER_SET string_deafness = 14073 -OUTER_SET string_dexmod = 14024 -OUTER_SET string_dispel = 14056 -OUTER_SET string_ghast = 9348 -OUTER_SET string_gspider = 6410 -OUTER_SET string_hasted = 14023 -OUTER_SET string_healed = 14022 -OUTER_SET string_held = 14102 -OUTER_SET string_intoxicated = 17396 -OUTER_SET string_mf_panic = 20568 -OUTER_SET string_ogre = 6313 -OUTER_SET string_panic = 17427 -OUTER_SET string_paralyzed = 14650 -OUTER_SET string_poison = 14017 -OUTER_SET string_poisoned = 14662 -OUTER_SET string_pspider = 9369 -OUTER_SET string_rthinking = 14791 -OUTER_SET string_silence = 14002 -OUTER_SET string_silenced = 14676 -OUTER_SET string_skelly = 8765 -OUTER_SET string_sleep = 14001 -OUTER_SET string_slow = 14000 -OUTER_SET string_slowed = 14668 -OUTER_SET string_stun = 14043 -OUTER_SET string_uncon = 20438 -OUTER_SET string_wwolf = 8774 - - -ACTION_IF GAME_IS ~bgee~ BEGIN - - OUTER_SET string_diseased = 31238 - OUTER_SET string_dominated = 26206 - OUTER_SET string_entangled = 25144 - OUTER_SET string_goblin = 27641 - OUTER_SET string_ineffective = 24534 - OUTER_SET string_shadow = 25764 - OUTER_SET string_stricken = 26453 - OUTER_SET string_stunned = 26050 - OUTER_SET string_troll = 25772 - -END ELSE BEGIN - - OUTER_SET string_diseased = 54337 - OUTER_SET string_dominated = 8364 - OUTER_SET string_entangled = 47835 - OUTER_SET string_goblin = 2511 - OUTER_SET string_ineffective = 4742 - OUTER_SET string_shadow = 3080 - OUTER_SET string_stricken = 39752 - OUTER_SET string_stunned = 1280 - OUTER_SET string_troll = 3008 - -END - -///// \\\\\ -///// adding animations for ee games \\\\\ -///// \\\\\ - -DEFINE_ACTION_FUNCTION cd_animation - STR_VAR - code = "" - BEGIN - - ACTION_IF ee_game BEGIN - - ACTION_BASH_FOR ~iwdification/animations/%code%~ ~^.+\..+$~ BEGIN - - ACTION_IF !FILE_EXISTS_IN_GAME ~%BASH_FOR_FILE%~ BEGIN - - COPY ~%BASH_FOR_FILESPEC%~ ~override~ - - END - - END - - END - -END -/* - LAF cd_animation STR_VAR code = 7203 END // 29187 MBER_PO bear_polar - LAF cd_animation STR_VAR code = 7320 END // 29472 MAIR elemental_air - LAF cd_animation STR_VAR code = 7a00 END // 31232 MSPI_GI spider_giant - LAF cd_animation STR_VAR code = 7a02 END // 31234 MSPI_PH spider_phase - LAF cd_animation STR_VAR code = 7b03 END // 31491 MWLF_WI wolf_winter - LAF cd_animation STR_VAR code = 9000 END // 36864 MOGR ogre - LAF cd_animation STR_VAR code = a100 END // 41216 MCAR carrion_crawler - - LAF cd_animation STR_VAR code = 6403 END // 25603 MSKL skeleton - LAF cd_animation STR_VAR code = 7302 END // 29442 MEAE_SH shambling_mound - LAF cd_animation STR_VAR code = e070 END // 57456 MMIN minotaur - MMIN doubles with bg2 mindflayer - LAF cd_animation STR_VAR code = e0b0 END // 57520 MTRO troll_blue - MTRO doubles with bg2 troll - LAF cd_animation STR_VAR code = e0d0 END // 57552 MUMB umber_hulk_elder - MUMB doubles with bg2 umber hulk - LAF cd_animation STR_VAR code = e220 END // 57888 MBBM beetle_black - LAF cd_animation STR_VAR code = e24b END // 57931 MELE elemental_earth_iwd - LAF cd_animation STR_VAR code = e24c END // 57932 MELF elemental_fire_iwd - LAF cd_animation STR_VAR code = e24d END // 57933 MELW elemental_water - LAF cd_animation STR_VAR code = e25d END // 57949 MYET tundra_yeti - LAF cd_animation STR_VAR code = e300 END // 58112 MGHO ghost - LAF cd_animation STR_VAR code = e320 END // 58144 MGH3 ghast_greater - LAF cd_animation STR_VAR code = e400 END // 58368 MGO1 goblin_axe - LAF cd_animation STR_VAR code = e420 END // 58400 MGO3 goblin_elite_axe - LAF cd_animation STR_VAR code = e500 END // 58624 MLIZ lizard_man_elite - LAF cd_animation STR_VAR code = e510 END // 58640 MLI2 lizard_man - LAF cd_animation STR_VAR code = e900 END // 59648 MSAL salamander_fire - LAF cd_animation STR_VAR code = e910 END // 59664 MSA2 salamander_frost - LAF cd_animation STR_VAR code = ea20 END // 59936 MSH2 shadow_large - LAF cd_animation STR_VAR code = eb20 END // 60192 MSKB skeleton_fiend - LAF cd_animation STR_VAR code = ee00 END // 60928 MZO2 zombie_yellow -*/ - -///// \\\\\ -///// adding portrait icons \\\\\ -///// \\\\\ - -DEFINE_ACTION_FUNCTION cd_new_portrait_icon - INT_VAR string = 0 - STR_VAR bam_file = "****" - RET icon - BEGIN - - OUTER_SET icon = "-1" - - ACTION_IF ee_game BEGIN - - COPY_EXISTING ~statdesc.2da~ ~override~ - COUNT_2DA_ROWS 3 count - READ_2DA_ENTRY (count - 1) 0 3 icon - SET icon += 1 - - APPEND ~statdesc.2da~ ~%icon% %string% %bam_file%~ - - END - -END - -///// \\\\\ -///// adding summons tables \\\\\ -///// \\\\\ - -DEFINE_ACTION_FUNCTION cd_new_summon_table - STR_VAR descript = "foo" - 2da_file = "foo" - RET table - BEGIN - - OUTER_SET table = "-1" - - ACTION_IF ee_game BEGIN - - COPY_EXISTING ~smtables.2da~ ~override~ - COUNT_2DA_ROWS 2 count - READ_2DA_ENTRY (count - 1) 0 2 table - INNER_PATCH_SAVE table ~%table%~ BEGIN - REPLACE_TEXTUALLY ~^\([0-9]+\).+$~ ~\1~ - END - SET table += 1 - - APPEND ~smtables.2da~ ~%table%_%descript% %2da_file%~ - - END - -END - -///// \\\\\ -///// scroll making made easy \\\\\ -///// \\\\\ - -DEFINE_PATCH_FUNCTION cd_scroll - INT_VAR - unusable0 = 0 - unusable1 = 0 - unusable2 = 0 - target_hdr = 1 - range = 30 - opcode = 146 - target_eff = 2 - price = 54321 - STR_VAR - spell = cdnull - BEGIN - - WRITE_LONG 0x1e (THIS | unusable0) // class/alignment flags - WRITE_BYTE 0x2d (THIS | unusable1) // add first set of unusable flags - WRITE_BYTE 0x2f (THIS | unusable2) // add second set of unusable flags - WRITE_LONG 0x34 price // price of scroll - WRITE_BYTE 0x7e target_hdr // target: any point - WRITE_SHORT 0x80 range // range - - WRITE_ASCIIE 0x3a "%DEST_RES%" - WRITE_ASCII 0x41 a #1 - WRITE_ASCIIE 0x76 "%DEST_RES%" - WRITE_ASCII 0x7d a #1 - PATCH_IF (SOURCE_SIZE > 0xda) BEGIN // only for arcane scrolls that have second header for learning - WRITE_SHORT 0xe2 opcode // cast-at-point opcode - WRITE_BYTE 0xe4 target_eff // target: self - WRITE_ASCIIE 0xae "%DEST_RES%" - WRITE_ASCII 0xb5 a #1 - WRITE_ASCIIE 0xf6 "%spell%" #8 - WRITE_ASCIIE 0x126 "%spell%" #8 - END ELSE BEGIN // divine scroll - WRITE_SHORT 0xaa opcode // cast-at-point opcode - WRITE_BYTE 0xac target_eff // target: self - WRITE_ASCIIE 0xbe "%spell%" #8 - END - -END - -///// \\\\\ -///// simulate cloud projectiles for vanilla \\\\\ -///// \\\\\ - -/* -Original idea from DavidW for IWD-in-BG2. Basic idea: cloud spells summon an invisible creature, fooM. In turn -fooM runs cycles of spawning several fooV, who teleport a short distance away, play a visual, and then disappear. -fooM also repeatedly casts the actual working spell (with an invisible AoE projectile) to do the work. The working -spell also includes a one-round 206 against itself to prevent applying effects to targets more than once a round. - -Visual randomness is achieved by fooV using teleport field to jump away from fooM at the center of the cloud, and -then randomly playing one of the VVCs available. Functionality is achieved by fooM casting the working spell. - -If the spell should be cleared out from Zone of Sweet Air, additional steps are taken. Any spell that provides a -ZoSA effect is patched to set a global, CDIZOSA. All of the invisible cloud creatures destroy themselves if this -variable gets set, and then the main baldur game script resets the variable after a round. - -EEs are so, so, SO much easier here. Thanks Laszlo! -*/ - -DEFINE_ACTION_FUNCTION cd_create_cloud - INT_VAR cloud_dur = 6 - visloop = 5 - zosa = 0 - STR_VAR code = null - anim = null -BEGIN - - ACTION_IF ("%anim%" STRING_COMPARE_CASE "null" = 0) BEGIN - - OUTER_SPRINT anim ~%code%V~ - - END - - COPY ~iwdification/eff/cloud.eff~ ~override/%code%.eff~ - WRITE_ASCIIE 0x30 ~%code%M~ - - COPY ~iwdification/cre/cloud.cre~ ~override/%code%M.cre~ - ~iwdification/cre/cloud.cre~ ~override/%code%V.cre~ - WRITE_ASCIIE 0x248 ~%DEST_RES%~ - WRITE_ASCIIE 0x280 ~%DEST_RES%~ - - EXTEND_TOP ~%code%M.bcs~ ~iwdification/baf/cloudmn.baf~ EVALUATE_BUFFER - EXTEND_TOP ~%code%V.bcs~ ~iwdification/baf/cloudvs.baf~ EVALUATE_BUFFER - - ACTION_IF zosa BEGIN - - ACTION_IF NOT FILE_EXISTS ~iwdification/baf/cdzosa.baf~ THEN BEGIN // run only once across both components - - COPY_EXISTING_REGEXP GLOB ~^.+\.spl$~ ~override~ - LPF CLONE_EFFECT INT_VAR silent = 1 match_opcode = 273 opcode = 265 parameter1 = 1 timing = 1 STR_VAR resource = cdizosa END - BUT_ONLY - - COPY ~iwdification/baf/zosa.baf~ ~iwdification/baf/cdzosa.baf~ - - ACTION_FOR_EACH file IN baldur baldur25 BEGIN - - ACTION_IF FILE_EXISTS_IN_GAME ~%file%.bcs~ THEN BEGIN - - EXTEND_BOTTOM ~%file%.bcs~ ~iwdification/baf/baldur.baf~ - - END - - END - - END - - EXTEND_TOP ~%code%M.bcs~ ~iwdification/baf/cdzosa.baf~ - EXTEND_TOP ~%code%V.bcs~ ~iwdification/baf/cdzosa.baf~ - - END - - ACTION_IF NOT FILE_EXISTS_IN_GAME cdiclout.spl THEN BEGIN - COPY ~iwdification/spl/cdiclout.spl~ ~override~ // minions jump away - END - - COPY ~iwdification/spl/cloudv.spl~ ~override/%code%v.spl~ - SET step = (100 / (visloop + 1)) - LPF ADD_SPELL_EFFECT INT_VAR opcode = 215 target = 1 parameter2 = 2 probability1 = step STR_VAR resource = EVALUATE_BUFFER ~%code%0~ END - FOR (index = 1 ; index <= visloop ; ++index) BEGIN - READ_BYTE 0xac temp_prob - LPF ADD_SPELL_EFFECT INT_VAR insert_point = 0 opcode = 215 target = 1 parameter2 = 2 - probability2 = (temp_prob + 1) probability1 = (temp_prob + step) STR_VAR resource = EVALUATE_BUFFER ~%code%%index%~ END - END - WRITE_BYTE 0xac 100 - - OUTER_FOR (index = 0 ; index <= visloop ; ++index) BEGIN - COPY ~iwdification/vvc/%code%%index%.vvc~ ~override~ - WRITE_ASCIIE 0x08 ~%anim%~ - END -// COPY ~iwdification/bam/%anim%.bam~ ~override~ - -END - -///// \\\\\ -///// bastardized handle_audio variant \\\\\ -///// \\\\\ - -// I just made some changes because I want WeiDU to convert (or rename) ogg > wav once, and then leave the resulting wav files to -// be copied (or not) by the respective components. Basically anything tha moves or copies the files has been removed, so that -// WeiDU won't remove the wav files if the component that invoked this function gets uninstalled. - -DEFINE_ACTION_FUNCTION CD_HANDLE_AUDIO - INT_VAR - music = 0 - STR_VAR - audio_path = ~iwdification/wav~ - oggdec_path = ~iwdification/wav~ - sox_path = ~iwdification/wav~ - output_path = ~iwdification/wav~ -BEGIN - /* Early versions of BG:EE do not include bgee.lua and - * PST:EE does not include monkfist.2da - */ - ACTION_IF !ee_game - BEGIN - ACTION_MATCH "%WEIDU_OS%" WITH - win32 - BEGIN - ACTION_IF FILE_EXISTS "%oggdec_path%/oggdec.exe" BEGIN - ACTION_BASH_FOR ~%audio_path%~ ~.+\.ogg$~ BEGIN -// OUTER_SPRINT wavfile ~%audio_path%/%BASH_FOR_RES%.wav~ -// COPY ~.../fl#inlined/null.file~ ~%wavfile%~ - AT_NOW ~%oggdec_path%/oggdec.exe "%BASH_FOR_FILESPEC%"~ -// MOVE ~%wavfile%~ ~%output_path%~ - END - END ELSE BEGIN - WARN ~WARNING: audio was not installed because oggdec.exe could not be found in %oggdec_path%~ - END - END - - osx - BEGIN - ACTION_IF FILE_EXISTS ~%sox_path%/sox~ BEGIN - AT_NOW ~chmod +x '%sox_path%/sox'~ - ACTION_BASH_FOR ~%audio_path%~ ~.+\.ogg$~ BEGIN - OUTER_SPRINT wavfile ~%audio_path%/%BASH_FOR_RES%.wav~ -// COPY ~.../fl#inlined/null.file~ ~%wavfile%~ - AT_NOW ~'%sox_path%/sox' '%BASH_FOR_FILESPEC%' '%wavfile%'~ -// MOVE ~%wavfile%~ ~%output_path%~ - END - END ELSE BEGIN - WARN ~WARNING: audio was not installed because sox could not be found in %sox_path%~ - END - END - - unix - BEGIN - OUTER_SET installed = 1 - ACTION_BASH_FOR ~%audio_path%~ ~.+\.ogg$~ BEGIN - OUTER_SPRINT wavfile ~%audio_path%/%BASH_FOR_RES%.wav~ -// COPY ~.../fl#inlined/null.file~ ~%wavfile%~ - AT_NOW ~oggdec '%BASH_FOR_FILESPEC%'~ - ACTION_IF FILE_EXISTS ~%wavfile%~ AND !FILE_SIZE ~%wavfile%~ 0 BEGIN -// MOVE ~%wavfile%~ ~%output_path%~ - END ELSE OUTER_SET installed = 0 - END - ACTION_IF !installed BEGIN - WARN "WARNING: audio was not installed because WAV files were not found. Are you sure you have oggdec installed?" - END - END - DEFAULT - END - END ELSE BEGIN - ACTION_IF !music BEGIN - OUTER_SPRINT ext "wav" - END ELSE BEGIN - OUTER_SPRINT ext "acm" - END - ACTION_BASH_FOR ~%audio_path%~ ~.+\.ogg$~ BEGIN - COPY_LARGE + ~%BASH_FOR_FILESPEC%~ ~%output_path%/%BASH_FOR_RES%.%ext%~ - END - END -END - -///// \\\\\ -///// CD_SPLIT_SAVE_DAMAGE \\\\\ -///// \\\\\ - -DEFINE_PATCH_FUNCTION CD_SPLIT_SAVE_DAMAGE // turns damage using ee's save-for-half bit into two damage opcodes - - // defines what we're going to check - INT_VAR header = "-1" - header_type = "-1" - m_power = "-1" - m_type = "-1" - m_damtype = "-1" - m_timing = "-1" - m_dispel = "-1" - m_duration = "-1" - m_prob1 = "-1" - m_prob2 = "-1" - m_dicesize = "-1" - m_flags = "-1" -BEGIN - - READ_ASCII 0x00 sig (3) - SET abil_length = 0x28 - PATCH_IF ("%sig%" STRING_COMPARE_CASE "ITM" = 0) BEGIN - SET abil_length = 0x38 - END - READ_LONG 0x64 abil_off ELSE 0 - READ_SHORT 0x68 abil_num ELSE 0 - READ_LONG 0x6a fx_off ELSE 0 - SET fx_delta = 0 - FOR (index = 0 ; index < abil_num ; ++index) BEGIN // start iterating through abilities - WRITE_SHORT (abil_off + 0x20 + (abil_length * index)) (THIS + fx_delta) - READ_SHORT (abil_off + (abil_length * index)) o_header_type - PATCH_IF (((header = index) OR (header < 0)) AND - ((header_type = o_header_type) OR (header_type < 0))) BEGIN - READ_SHORT (abil_off + 0x1e + (abil_length * index)) abil_fx_num - READ_SHORT (abil_off + 0x20 + (abil_length * index)) abil_fx_idx - FOR (index2 = 0 ; index2 < abil_fx_num ; ++index2) BEGIN - READ_SHORT (fx_off + (0x30 * (abil_fx_idx + index2))) opcode - READ_LONG (fx_off + 0x2c + (0x30 * (abil_fx_idx + index2))) o_flags - PATCH_IF (((opcode = 12) AND (o_flags & BIT8) = BIT8)) BEGIN - READ_BYTE (fx_off + 0x02 + (0x30 * (abil_fx_idx + index2))) o_power - READ_LONG (fx_off + 0x04 + (0x30 * (abil_fx_idx + index2))) o_amount - READ_SHORT (fx_off + 0x08 + (0x30 * (abil_fx_idx + index2))) o_type - READ_SHORT (fx_off + 0x0a + (0x30 * (abil_fx_idx + index2))) o_damtype - READ_BYTE (fx_off + 0x0c + (0x30 * (abil_fx_idx + index2))) o_timing - READ_BYTE (fx_off + 0x0d + (0x30 * (abil_fx_idx + index2))) o_dispel - READ_LONG (fx_off + 0x0e + (0x30 * (abil_fx_idx + index2))) o_duration - READ_BYTE (fx_off + 0x12 + (0x30 * (abil_fx_idx + index2))) o_prob1 - READ_BYTE (fx_off + 0x13 + (0x30 * (abil_fx_idx + index2))) o_prob2 - READ_LONG (fx_off + 0x1c + (0x30 * (abil_fx_idx + index2))) o_dicenum - READ_LONG (fx_off + 0x20 + (0x30 * (abil_fx_idx + index2))) o_dicesize - READ_LONG (fx_off + 0x24 + (0x30 * (abil_fx_idx + index2))) o_save - READ_LONG (fx_off + 0x28 + (0x30 * (abil_fx_idx + index2))) o_savebonus -// READ_LONG (fx_off + 0x2c + (0x30 * (abil_fx_idx + index2))) o_flags - PATCH_IF (((o_power = m_power) OR (m_power < 0)) AND - ((o_type = m_type) OR (m_type < 0)) AND - ((o_damtype = m_damtype) OR (m_damtype < 0)) AND - ((o_timing = m_timing) OR (m_timing < 0)) AND - ((o_dispel = m_dispel) OR (m_dispel < 0)) AND - ((o_duration = m_duration) OR (m_duration < 0)) AND - ((o_prob1 = m_prob1) OR (m_prob1 < 0)) AND - ((o_prob2 = m_prob2) OR (m_prob2 < 0)) AND - ((o_dicesize = m_dicesize) OR (m_dicesize < 0)) AND - ((o_flags = m_flags) OR (m_flags < 0))) BEGIN - WRITE_LONG (fx_off + 0x2c + (0x30 * (abil_fx_idx + index2))) (THIS BAND `BIT8) // remove save-for-half flag - READ_ASCII (fx_off + (0x30 * (abil_fx_idx + index2))) clone (48) // read info for new effect - INSERT_BYTES (fx_off + (0x30 * (abil_fx_idx + index2))) 0x30 // insert new effect - WRITE_ASCIIE (fx_off + (0x30 * (abil_fx_idx + index2))) ~%clone%~ // copy existing effect into new bytes - WRITE_LONG (fx_off + 0x04 + (0x30 * (abil_fx_idx + index2))) ((o_amount + 1) / 2) // set original damage to half - WRITE_LONG (fx_off + 0x1c + (0x30 * (abil_fx_idx + index2))) ((o_dicenum + 0) / 2) - WRITE_LONG (fx_off + 0x34 + (0x30 * (abil_fx_idx + index2))) ((o_amount + 0) / 2) // set new damage to half - WRITE_LONG (fx_off + 0x4c + (0x30 * (abil_fx_idx + index2))) ((o_dicenum + 1) / 2) // +1 is fudge factor for rounding odd numbers - WRITE_LONG (fx_off + 0x24 + (0x30 * (abil_fx_idx + index2))) (((((THIS BAND `BIT0) BAND `BIT1) BAND `BIT2) BAND `BIT3) BAND `BIT4) // remove save flags from new effect -// WRITE_LONG (fx_off + 0x24 + (0x30 * (abil_fx_idx + index2))) ((THIS BAND `(BIT0 + BIT1 + BIT2 + BIT3 + BIT4)) // remove save flags from new effect - SET index2 += 1 - SET fx_delta += 1 - SET abil_fx_num += 1 - END // param check - END // damage, flag check - END // abil fx loop - WRITE_SHORT (abil_off + 0x1e + (abil_length * index)) abil_fx_num - END // abil type check - END // abil loop - -END - -///// \\\\\ -///// CD_CONVERT_333 \\\\\ -///// \\\\\ - -DEFINE_PATCH_FUNCTION CD_CONVERT_333 - - STR_VAR 333spell = "" - -BEGIN // converts recurring 333s to simple 146s - - READ_ASCII 0x00 sig (3) - SET abil_length = 0x28 - PATCH_IF ("%sig%" STRING_COMPARE_CASE "ITM" = 0) BEGIN - SET abil_length = 0x38 - END - READ_LONG 0x64 abil_off ELSE 0 - READ_SHORT 0x68 abil_num ELSE 0 - READ_LONG 0x6a fx_off ELSE 0 - SET fx_delta = 0 - FOR (index = 0 ; index < abil_num ; ++index) BEGIN // start iterating through abilities - WRITE_SHORT (abil_off + 0x20 + (abil_length * index)) (THIS + fx_delta) - READ_SHORT (abil_off + 0x1e + (abil_length * index)) abil_fx_num - READ_SHORT (abil_off + 0x20 + (abil_length * index)) abil_fx_idx - FOR (index2 = 0 ; index2 < abil_fx_num ; ++index2) BEGIN - READ_SHORT (fx_off + (0x30 * (abil_fx_idx + index2))) opcode - PATCH_IF opcode = 333 BEGIN - PATCH_IF ("%333spell%" STRING_COMPARE_CASE "" = 0) BEGIN - READ_ASCII (fx_off + 0x14 + (0x30 * (abil_fx_idx + index2))) resref - PATCH_IF ("%resref%" STRING_COMPARE_CASE "" = 0) BEGIN - SPRINT 333spell "%SOURCE_RES%b" - END ELSE BEGIN - SPRINT 333spell "%resref%b" - END - END - READ_LONG (fx_off + 0x2c + (0x30 * (abil_fx_idx + index2))) delay - PATCH_IF !delay BEGIN SET delay = 6 END // if delay is 0, use default 6 instead - READ_LONG (fx_off + 0x04 + (0x30 * (abil_fx_idx + index2))) times - READ_LONG (fx_off + 0x08 + (0x30 * (abil_fx_idx + index2))) level - WRITE_SHORT (fx_off + (0x30 * (abil_fx_idx + index2))) 146 // opcode - WRITE_LONG (fx_off + 0x04 + (0x30 * (abil_fx_idx + index2))) level // cast at level - WRITE_LONG (fx_off + 0x08 + (0x30 * (abil_fx_idx + index2))) 1 // cast instantly - WRITE_BYTE (fx_off + 0x0c + (0x30 * (abil_fx_idx + index2))) 1 // timing: delay/perm - WRITE_LONG (fx_off + 0x0e + (0x30 * (abil_fx_idx + index2))) 0 // delay - WRITE_ASCIIE (fx_off + 0x14 + (0x30 * (abil_fx_idx + index2))) ~%333spell%~ #8 // subspell - READ_ASCII (fx_off + (0x30 * (abil_fx_idx + index2))) clone (48) // read info for new effect(s) - FOR (index3 = 0 ; index3 < times ; ++index3) BEGIN - INSERT_BYTES (fx_off + (0x30 * (abil_fx_idx + index2))) 0x30 // insert new effect - WRITE_ASCIIE (fx_off + (0x30 * (abil_fx_idx + index2))) ~%clone%~ // copy existing effect into new bytes - WRITE_BYTE (fx_off + 0x0c + (0x30 * (abil_fx_idx + index2))) 4 // timing: delay/perm - WRITE_LONG (fx_off + 0x0e + (0x30 * (abil_fx_idx + index2))) ((index3 + 1) * delay) // delay - SET index2 += 1 - SET fx_delta += 1 - SET abil_fx_num += 1 - END // new fx loop - END // 333 check - END // abil fx loop - WRITE_SHORT (abil_off + 0x1e + (abil_length * index)) abil_fx_num - END // abil loop - -END - -///// \\\\\ -///// CD_CONVERT_9_255 \\\\\ -///// \\\\\ - -DEFINE_PATCH_FUNCTION CD_CONVERT_9_255 BEGIN - - READ_ASCII 0x00 sig (3) - SET abil_length = 0x28 - PATCH_IF ("%sig%" STRING_COMPARE_CASE "ITM" = 0) BEGIN - SET abil_length = 0x38 - END - READ_LONG 0x64 abil_off ELSE 0 - READ_SHORT 0x68 abil_num ELSE 0 - READ_LONG 0x6a fx_off ELSE 0 - SET fx_delta = 0 - FOR (index = 0 ; index < abil_num ; ++index) BEGIN // start iterating through abilities - WRITE_SHORT (abil_off + 0x20 + (abil_length * index)) (THIS + fx_delta) - READ_SHORT (abil_off + 0x1e + (abil_length * index)) abil_fx_num - READ_SHORT (abil_off + 0x20 + (abil_length * index)) abil_fx_idx - FOR (index2 = 0 ; index2 < abil_fx_num ; ++index2) BEGIN - READ_SHORT (fx_off + (0x30 * (abil_fx_idx + index2))) opcode - PATCH_IF ((opcode = 8) OR (opcode = 9)) BEGIN - READ_SHORT (fx_off + 0x08 + (0x30 * (abil_fx_idx + index2))) loc - PATCH_IF loc = 255 BEGIN - WRITE_SHORT (fx_off + 0x08 + (0x30 * (abil_fx_idx + index2))) 6 - READ_ASCII (fx_off + (0x30 * (abil_fx_idx + index2))) clone (48) - FOR (index3 = 0 ; index3 < 6 ; ++index3) BEGIN - INSERT_BYTES (fx_off + (0x30 * (abil_fx_idx + index2))) 0x30 - WRITE_ASCIIE (fx_off + (0x30 * (abil_fx_idx + index2))) ~%clone%~ - WRITE_SHORT (fx_off + 0x08 + (0x30 * (abil_fx_idx + index2))) index3 - END - SET fx_delta += 6 - SET index2 += 6 - SET abil_fx_num += 6 - END - END - END - WRITE_SHORT (abil_off + 0x1e + (abil_length * index)) abil_fx_num - END - -END - -///// \\\\\ -///// CD_EXTEND-O-MATIC, patent pending \\\\\ -///// \\\\\ - -// this function creates headers and does basic duration extensions to level 30; written for inwd-in-bg2 ages ago -DEFINE_PATCH_FUNCTION CD_EXTEND-O-MATIC - INT_VAR base_dur = 0 // constant to add to all durations - step_dur = 6 // how much duration to add to each consecutive header - step_size = 1 // how many levels between headers - level_cap = 20 // stop extending at level - min_dur = 4 // ignore effects with durations less than this (e.g. cosmetics) - dur_special = 0 // just add step_dur to existing effects (ignore base_dur) - min_lev_alt = 0 // if extending from level 1, use this value as its minimum level instead (e.g. fifth slevel spell with only one header, use 9 here) -BEGIN - - READ_LONG 0x64 abil_off - READ_SHORT 0x68 abil_num - READ_LONG 0x6a fx_off - READ_SHORT (abil_off + 0x10 + (0x28 * (abil_num - 1))) min_lev // read level of last ability - PATCH_IF ((min_lev = 1) AND (min_lev_alt != 0)) BEGIN SET min_lev = min_lev_alt END - FOR (index = min_lev + step_size ; index < (level_cap + 1) ; index = index + step_size) BEGIN - READ_ASCII (abil_off + (0x28 * (abil_num - 1))) abil (0x28) // read entire ability - READ_SHORT (abil_off + 0x1e + (0x28 * (abil_num - 1))) abil_fx_num - READ_SHORT (abil_off + 0x20 + (0x28 * (abil_num - 1))) abil_fx_idx - READ_ASCII (fx_off + (0x30 * abil_fx_idx)) effects (abil_fx_num * 0x30) // read entire fx block - INSERT_BYTES (fx_off + (0x30 * (abil_fx_idx + abil_fx_num))) (abil_fx_num * 0x30) // insert bytes for new ability - WRITE_ASCIIE (fx_off + (0x30 * (abil_fx_idx + abil_fx_num))) "%effects%" // write in effects block - FOR (index2 = 0 ; index2 < abil_fx_num ; ++index2) BEGIN - READ_LONG (fx_off + 0x0e + (0x30 * (abil_fx_idx + abil_fx_num + index2))) duration - PATCH_IF (duration > min_dur) BEGIN // exclude instant/cosmetic efects - PATCH_IF dur_special = 1 BEGIN - SET new_dur = duration + step_dur - END ELSE BEGIN - SET new_dur = (base_dur + (index * step_dur)) - END - WRITE_LONG (fx_off + 0x0e + (0x30 * (abil_fx_idx + abil_fx_num + index2))) new_dur // adjust durations - END - END - INSERT_BYTES (abil_off + (0x28 * abil_num)) 0x28 // insert new ability - WRITE_ASCIIE (abil_off + (0x28 * abil_num)) "%abil%" - WRITE_SHORT (abil_off + 0x10 + (0x28 * abil_num)) index - WRITE_SHORT (abil_off + 0x20 + (0x28 * abil_num)) (abil_fx_idx + abil_fx_num) - SET abil_num += 1 - SET fx_off += 0x28 - END - WRITE_SHORT 0x68 abil_num - WRITE_LONG 0x6a fx_off - -END \ No newline at end of file diff --git a/iwdification/lib/get_iwd_spell_bams.tpa b/iwdification/lib/get_iwd_spell_bams.tpa new file mode 100644 index 0000000..f3b56bf --- /dev/null +++ b/iwdification/lib/get_iwd_spell_bams.tpa @@ -0,0 +1,14 @@ +DEFINE_ACTION_FUNCTION get_iwd_spell_bams STR_VAR file="" BEGIN + + LAF read_in_list STR_VAR file locbase="%iwdspells_data%" RET list END + OUTER_WHILE "%list%" STRING_COMPARE "" BEGIN + LAF return_first_entry STR_VAR list RET entry list END + LAF RES_NUM_OF_SPELL_NAME STR_VAR spell_name="%entry%" RET resref=spell_res END + ACTION_FOR_EACH letter IN A B C BEGIN + ACTION_IF FILE_EXISTS_IN_GAME "%resref%%letter%.bam" BEGIN + COPY_EXISTING "%resref%%letter%.bam" "%resource_loc%/bam/%entry%_ANIMATION_%letter%.bam" + END + END + END + +END diff --git a/iwdification/lib/get_iwd_spell_resources.tpa b/iwdification/lib/get_iwd_spell_resources.tpa new file mode 100644 index 0000000..b8e26a5 --- /dev/null +++ b/iwdification/lib/get_iwd_spell_resources.tpa @@ -0,0 +1,413 @@ +DEFINE_ACTION_FUNCTION get_iwd_spell_resources STR_VAR file="" resref_list="" smtables_list="" proj_list="" location="" locbase="" locabs="" BEGIN + + + // generate list of IWD resources not in BG2 + + LAF spell_comparison END + + // read in that list + + COPY "%data_loc%/spells_not_in_bg2.txt" "%workspace%" + READ_2DA_ENTRIES_NOW not_in_bg2_arr 2 + FOR (i=0;i>>>>>>> + ACTION_IF !FILE_EXISTS "%resource_loc%/spells_used.2da" BEGIN + COPY ".../stratagems-inline/spells_used.2da" "%resource_loc%" + END + + // quick ad hoc recording of strings needed + + LAF log_this STR_VAR file=strings_used.txt input="119397" END // Cure Moderate Wounds temple string - includes the +100000 + OUTER_FOR (input=121648;input<=121654;input+=1) BEGIN + LAF log_this STR_VAR file=strings_used.txt input END // Seven Eyes strings - includes the +100000 + END + // main install + + LAF read_in_list STR_VAR file location locbase locabs RET list END + LAF return_first_entry STR_VAR list RET list END // discard first entry + OUTER_WHILE "%list%" STRING_COMPARE "" BEGIN + LAF return_first_entry STR_VAR list RET spell=entry list END + PRINT "Processing %spell%" + LAF deabbreviate_spellname STR_VAR input="%spell%" RET spellname END + MKDIR "%resource_loc%/%spellname%" + LAF get_spellcode STR_VAR input="%spell%" RET resref=value END + OUTER_SPRINT SFO_reserved_spell_here "%resref%" + LAF log_this STR_VAR locabs="%resource_loc%" file="%resref_list%" input="%spellname% %resref%" END + ACTION_IF VARIABLE_IS_SET $iterate_override("%spellname%") BEGIN + OUTER_SPRINT file $iterate_override("%spellname%") + OUTER_INNER_PATCH_SAVE file_resref "%file%" BEGIN + READ_ASCII (BUFFER_LENGTH - 3) ext (3) + DELETE_BYTES (BUFFER_LENGTH - 4) 4 + END + COPY_EXISTING "%file%" "%resource_loc%/%spellname%" + LPF apply_to_strrefs STR_VAR arguments=log_strref filename="%file_resref%" file_ext="%ext%" END + OUTER_SPRINT to_check "%file%" + END ELSE BEGIN + COPY_EXISTING "%resref%.spl" "%resource_loc%/%spellname%" + LPF apply_to_strrefs STR_VAR arguments=log_strref filename="%resref%" file_ext="spl" END + OUTER_SPRINT to_check "%resref%.spl" + END + ACTION_IF FILE_EXISTS_IN_GAME "%resref%A.BAM" BEGIN + COPY_EXISTING "%resref%A.BAM" "%resource_loc%/%spellname%" + END + LAF iter_resource INT_VAR skip_payload_on_ignore=1 STR_VAR to_check func=iterfunc_get_resources ignore_func=ignore_wrapper immunity_func=iterfunc_log_immunities END + + END // end of copy routine + + PRINT "Finished main resource collection, doing residual tasks" + // manual edits go here + + // get animations/sounds for beetles + + MKDIR "%resource_loc%/beetle/bam" + COPY_EXISTING_REGEXP "mbbm.*\.bam" "%resource_loc%/beetle/bam" + MKDIR "%resource_loc%/beetle/wav" + COPY_EXISTING_REGEXP "bomba.*\.wav" "%resource_loc%/beetle/wav" + + // get entries for SMTABLES + + ACTION_IF FILE_EXISTS "%data_loc%/smtable_entries.2da" BEGIN + COPY "%data_loc%/smtable_entries.2da" "%resource_loc%/%smtables_list%" + END + + +END + +DEFINE_PATCH_FUNCTION log_strref INT_VAR offset=0 STR_VAR filename="" file_ext="" BEGIN + READ_LONG offset strref + SET strref=strref+100000 // slightly hacky way to ensure no strref is a substring of another + LPF log_this STR_VAR file="strings_used.txt" input="%strref%" repeat="no" END +END + +DEFINE_ACTION_FUNCTION iterfunc_log_immunities STR_VAR resref="" resref_ext="" source="" source_ext="" +// we only care about spells, only if they're in the spell.ids, and only if they're not in BG(2)EE +BEGIN + ACTION_IF "%resref_ext%" STRING_EQUAL_CASE SPL BEGIN + ACTION_MATCH "%resref%" WITH + "SPIN[0-9]+" "SPWI[0-9]+" "SPPR[0-9]+" BEGIN + ACTION_TO_UPPER resref + ACTION_IF VARIABLE_IS_SET $not_in_bg2("%resref%") BEGIN + OUTER_SPRINT idsname $not_in_bg2("%resref%") + ACTION_IF "%source_ext%" STRING_EQUAL_CASE "SPL" BEGIN + LAF return_spellname STR_VAR resref="%source%" RET source=spellname END + END + LAF log_this STR_VAR file="spells_used.2da" locabs="%resource_loc%" input="%resref% %idsname% %source% %source_ext%" repeat=no END + END + END + + DEFAULT + END + + + END +END + +DEFINE_ACTION_FUNCTION iterfunc_get_resources // slight violation of encapsulation: we assume access to "%spellname%" + STR_VAR output="" // dummy, not used + resref="" + ext="" + parent="" + RET output + BEGIN + OUTER_SPRINT output "" + OUTER_SET copy=1 + ACTION_MATCH "%ext%" WITH + pro BEGIN + // log this projectile + ACTION_MATCH "%resref%" WITH + mfmiss mfmiss2 + BEGIN + END + DEFAULT + OUTER_SET pronum=IDS_OF_SYMBOL (projectl "%resref%") + LAF log_this STR_VAR file="%proj_list%" locabs="%resource_loc%" input="%resref% %pronum%" repeat=no END + END + END + wav BEGIN + OUTER_PATCH "%resref%" BEGIN + READ_ASCII 0x0 start (4) + END + ACTION_MATCH "%start%" WITH + EFF_ AFT_ TRA_ BEGIN + OUTER_SET copy=0 + END + DEFAULT END + END + DEFAULT END + ACTION_IF copy BEGIN + // check if this needs renaming + ACTION_TO_UPPER resref + ACTION_TO_UPPER ext + ACTION_IF VARIABLE_IS_SET $file_renames("%resref%" "%ext%") BEGIN + OUTER_SPRINT resref_new $file_renames("%resref%" "%ext%") + OUTER_SPRINT copy_name "%resref_new%.%ext%" + COPY "%resource_loc%/%spellname%/%parent%" "%resource_loc%/%spellname%" + REPLACE_TEXTUALLY CASE_INSENSITIVE "%resref%" "%resref_new%" (8) + END ELSE BEGIN + OUTER_SPRINT copy_name "%resref%.%ext%" + END + ACTION_IF FILE_EXISTS_IN_GAME "%resref%.%ext%" BEGIN + ACTION_MATCH "%ext%" WITH + BCS BEGIN + COPY_EXISTING "%resref%.%ext%" "%resource_loc%/%spellname%/%resref%.BAF" + DECOMPILE_BCS_TO_BAF + END + DEFAULT + COPY_EXISTING "%resref%.%ext%" "%resource_loc%/%spellname%/%copy_name%" + LPF apply_to_strrefs STR_VAR arguments=log_strref filename="%resref%" file_ext="%ext%" END + END + END ELSE BEGIN + LAF warning STR_VAR warning="%resref%.%ext% missing (used by %parent%; relevant to %spellname%)" END + END + END +END + +//// this function must not use external libraries + +DEFINE_ACTION_FUNCTION process_tra_entries + INT_VAR make_lookup=1 + STR_VAR tra="" lookup="" +BEGIN + OUTER_SPRINT traloc "%resource_loc%/tra/%tra%" + ACTION_IF !FILE_EXISTS "%traloc%" BEGIN + COPY ".../stratagems-inline/blank" "%traloc%" + END + ACTION_IF make_lookup BEGIN + OUTER_SPRINT lookuploc "%resource_loc%/%lookup%" + ACTION_IF !FILE_EXISTS "%lookuploc%" BEGIN + COPY ".../stratagems-inline/blank" "%lookuploc%" + END + END + ACTION_CLEAR_ARRAY strings_used + COPY "%data_loc%/strings_used.txt" "%workspace%" + REPLACE_EVALUATE "\([0-9]+\)" BEGIN + SET $strings_used("%MATCH1%")=1 + END + "" + OUTER_SET tra_ind=1 + ACTION_PHP_EACH strings_used AS strref=>discard BEGIN + OUTER_SET strref=strref - 100000 // reverse the transformation in log_strref + ACTION_IF !VARIABLE_IS_SET $processed("%strref%") BEGIN + ACTION_GET_STRREF strref temp + OUTER_SPRINT $tra_output("%strref%") "%atsymbol%%tra_ind%=~%temp%~" + OUTER_SPRINT $tra_map("%strref%") "%tra_ind%" + OUTER_SET tra_ind +=1 + OUTER_SET $processed("%strref%")=1 + END + END + COPY_EXISTING "%traloc%" "%traloc%" + PHP_EACH tra_output AS null=>line BEGIN + INSERT_2DA_ROW 0 0 "%line%" + END + BUT_ONLY + ACTION_IF make_lookup BEGIN + COPY_EXISTING "%lookuploc%" "%lookuploc%" + PHP_EACH tra_map AS strref=>tra_ind BEGIN + INSERT_2DA_ROW 0 0 "%strref% %tra_ind%" + END + BUT_ONLY + END +END + +DEFINE_ACTION_FUNCTION process_tra_entries_all +BEGIN + ACTION_IF get_all_languages BEGIN + ACTION_FOR_EACH language IN cs_CZ de_DE en_US es_ES fr_FR it_IT ko_KR pl_PL ru_RU tr_TR BEGIN // current list of IWD languages + ACTION_IF !("%language%" STRING_EQUAL_CASE "%EE_LANGUAGE%") BEGIN // do your current language last, so WEIDU doesn't save your change + MKDIR "%resource_loc%/tra/%language%" + COPY ".../stratagems-inline/blank" "%resource_loc%/tra/%language%/iwdspells.tra" + COPY "%MOD_FOLDER%/%iwdspells_lib%/process_strref.tp2" "%workspace%" EVALUATE_BUFFER + AT_NOW "setup-%scsroot% %workspace%\process_strref.tp2 --no-auto-tp2 --use-lang %language% --force-install 1000 --yes" + END + END + AT_NOW "setup-%scsroot% --no-auto-tp2 --use-lang %EE_LANGUAGE% --yes" + END + LAF include STR_VAR file=get_iwd_spell_resources.tpa location="%iwdspells_lib%" END + LAF process_tra_entries STR_VAR tra="%EE_LANGUAGE%/iwdspells.tra" lookup="iwd_strref.txt" END + +END + +// Ignore any SPIN/SPWI/SPPR - EXCEPT if it's the spell itself (we violate encapsulation here) + +DEFINE_ACTION_FUNCTION ignore_wrapper + STR_VAR resref="" + ext="" + parent="" + RET value +BEGIN + // check the list + OUTER_SPRINT file "%resref%.%ext%" + ACTION_TO_UPPER file + ACTION_IF VARIABLE_IS_SET $do_not_copy("%file%") BEGIN + OUTER_SET value=1 + END ELSE BEGIN + LAF ignore_spell_entries STR_VAR resref ext parent RET value END + END +END + + +DEFINE_ACTION_FUNCTION ignore_spell_entries + STR_VAR resref="" + ext="" + parent="" + RET value +BEGIN + OUTER_SET value=0 + ACTION_IF ("%ext%" STRING_EQUAL_CASE "spl" && "%resref%" STRING_COMPARE_CASE "%SFO_reserved_spell_here%") BEGIN + // hardcoded list of BG2 resources we don't care about + ACTION_MATCH "%resref%" WITH + SPRA301 "SPWM.*" "SPWISH.*" + BEGIN + OUTER_SET value=1 + END + DEFAULT + ACTION_MATCH "%resref%" WITH + "SPIN[0-9]+" "SPWI[0-9]+" "SPPR[0-9]+" BEGIN + OUTER_SET value=1 + ACTION_TO_UPPER resref + ACTION_IF VARIABLE_IS_SET $not_in_bg2("%resref%") BEGIN + OUTER_SPRINT idsname $not_in_bg2("%resref%") + OUTER_INNER_PATCH_SAVE parent_resref "%parent%" BEGIN + READ_ASCII (BUFFER_LENGTH - 3) ext (3) + DELETE_BYTES (BUFFER_LENGTH - 4) 4 + END + ACTION_IF "%ext%" STRING_EQUAL_CASE SPL BEGIN + LAF return_spellname STR_VAR resref="%parent_resref%" RET spellname END + OUTER_SPRINT parent_resref "%spellname%" + END + LAF log_this STR_VAR file="spells_used.2da" locabs="%resource_loc%" input="%resref% %idsname% %parent_resref% %ext%" repeat=no END + END + END + DEFAULT + OUTER_SET value=0 + END + END + END +END + +// macro to work out which resources aren't in BG(2)EE and which might have different names + +DEFINE_ACTION_FUNCTION spell_comparison +BEGIN + ACTION_IF !FILE_EXISTS "%data_loc%/spells_not_in_bg2.txt" BEGIN + COPY_EXISTING "spell.ids" "%workspace%" + READ_2DA_ENTRIES_NOW iwdspl_array 2 + FOR (i=1;iidscode BEGIN + ACTION_IF !VARIABLE_IS_SET $bg2_ids_array("%spell%") BEGIN + LAF idscode_to_spell INT_VAR idscode RET resref END + ACTION_TO_UPPER resref + LAF log_this STR_VAR file="spells_not_in_bg2.txt" input="%resref% %spell%" END + END ELSE BEGIN + OUTER_SET idscode_bg2 = $bg2_ids_array("%spell%") + ACTION_IF !idscode=idscode_bg2 BEGIN + LAF log_this STR_VAR file="spell_ids_mismatch.txt" input="%spell%" END // as there aren't any mismatches as of 2.5, we don't actually do anything with this data + END + END + END + END +END + +// icon collector + +DEFINE_ACTION_FUNCTION get_iwd_icons BEGIN + MKDIR "%resource_loc%/icon" + COPY_EXISTING "statdesc.2da" "%resource_loc%/icon" + COUNT_2DA_ROWS 3 rowcount + FOR (i=0;i= 164 && number <=187) BEGIN + READ_2DA_ENTRY i 1 3 strref + SET strref += 100000 + LPF log_this STR_VAR file="strings_used.txt" input="%strref%" END + END + END + // BUT_ONLY // always copy! + ACTION_FOR_EACH file IN "states.bam" "states2.bam" BEGIN + COPY_EXISTING "%file%" "%resource_loc%/icon" + END +END diff --git a/iwdification/lib/insect_postproduction.tpa b/iwdification/lib/insect_postproduction.tpa new file mode 100644 index 0000000..7aaa3b3 --- /dev/null +++ b/iwdification/lib/insect_postproduction.tpa @@ -0,0 +1,37 @@ +DEFINE_ACTION_FUNCTION insect_postproduction STR_VAR tra="" BEGIN + + // get immunity string from Summon Insects + + ACTION_GET_STRREF 36302 old_desc + OUTER_PATCH "%old_desc%" BEGIN + REPLACE_EVALUATE "^\([A-Z].*\)$" BEGIN + SPRINT extra "%MATCH1%" + END + "%extra%" + END + + // add immunity to undead/constructs/elementals; update description + + ACTION_FOR_EACH spell IN "%CLERIC_CREEPING_DOOM%" "%CLERIC_INSECT_PLAGUE%" BEGIN + COPY_EXISTING "%spell%.spl" override + READ_LONG 0x50 desc_str + GET_STRREF desc_str desc + INNER_PATCH_SAVE desc "%desc%" BEGIN + LPF insect_desc STR_VAR extra END + END + INNER_ACTION BEGIN + STRING_SET_EVALUATE desc_str "%desc%" + END + LPF ADD_SPELL_EFFECT INT_VAR insert_point=0 opcode=324 target=2 power=0 parameter2=55 duration=1 STR_VAR resource="%spell%" END + LPF ADD_SPELL_EFFECT INT_VAR insert_point=0 opcode=324 target=2 power=0 parameter2=9 duration=1 STR_VAR resource="%spell%" END + END + +END + +DEFINE_PATCH_FUNCTION insect_desc STR_VAR extra="" BEGIN + + end=BUFFER_LENGTH + INSERT_BYTES end (STRING_LENGTH "%WNL%%WNL%%extra%") + WRITE_ASCIIE end "%WNL%%WNL%%extra%" + +END \ No newline at end of file diff --git a/iwdification/lib/install_iwd_spell_bams.tpa b/iwdification/lib/install_iwd_spell_bams.tpa new file mode 100644 index 0000000..418dec0 --- /dev/null +++ b/iwdification/lib/install_iwd_spell_bams.tpa @@ -0,0 +1,18 @@ +DEFINE_ACTION_FUNCTION install_iwd_spell_bams STR_VAR file="" install_loc="" BEGIN + + LAF read_in_list STR_VAR file locbase="%iwdspells_data%" RET list END + OUTER_WHILE "%list%" STRING_COMPARE "" BEGIN + LAF return_first_entry STR_VAR list RET entry list END + LAF deabbreviate_spellname STR_VAR input="%entry%" RET spellname END + LAF get_spellcode STR_VAR input="%entry%" RET resref=value END + ACTION_FOR_EACH letter IN A B C BEGIN + ACTION_IF FILE_EXISTS "%resource_loc%/bam/%spellname%_ANIMATION_%letter%.bam" BEGIN + PRINT "copying to %install_loc%/%resref%%letter%.bam" + COPY "%resource_loc%/bam/%spellname%_ANIMATION_%letter%.bam" "%install_loc%/%resref%%letter%.bam" + ACTION_IF (!do_not_biff && FILE_EXISTS "override/%resref%%letter%.bam") BEGIN + DELETE "override/%resref%%letter%.bam" + END + END + END + END +END diff --git a/iwdification/lib/install_iwd_spell_resources.tpa b/iwdification/lib/install_iwd_spell_resources.tpa new file mode 100644 index 0000000..36a5854 --- /dev/null +++ b/iwdification/lib/install_iwd_spell_resources.tpa @@ -0,0 +1,740 @@ +DEFINE_ACTION_FUNCTION install_iwd_spell_resources + INT_VAR overwrite_always=0 + make_scrolls=1 + truncate_at_level=0 + iwdification_extra=0 + STR_VAR scroll_shadow_list="" + smtables_list="" + spell_list="" + proj_list="" + smtables_list="" + scroll_price_list="" + tra="" + lookup="" + location="" + locbase="" + locabs="" + biff="" + bam_copy="" + green_bams="" + afterwards="" + afterwards_tra="" + style_old="" + style_new="" +BEGIN + + + ACTION_IF "%scroll_shadow_list%" STRING_EQUAL "" BEGIN + OUTER_SET macro_spellcode_skip_scrolls=1 + END + OUTER_SET macro_spellcodes_read=0 + LAM read_in_spellcodes + + + // initialise scroll finder + OUTER_SPRINT scroll_slot "00" + + ACTION_IF do_not_biff BEGIN + OUTER_SPRINT install_loc override + END ELSE BEGIN + OUTER_SPRINT install_loc "%workspace%/%biff%" + MKDIR "%install_loc%" + END + OUTER_SPRINT baf_loc "%workspace%/iwdspells_baf" + MKDIR "%baf_loc%" + + // load spell styles + + ACTION_IF "%style_new%" STRING_COMPARE "" BEGIN + LAF load_spell_styles STR_VAR file="%MOD_FOLDER%/%style_new%" RET_ARRAY style_vvc style_wav style_glow END + OUTER_SPRINT SFO_reserved_old_style_file "%MOD_FOLDER%/%style_old%" + END + + // install animations + ACTION_IF !GAME_IS iwdee BEGIN + LAF check_label STR_VAR label="dw#iwd_anim" RET value END + ACTION_IF !value BEGIN + LAF make_label STR_VAR label="dw#iwd_anim" END + ACTION_IF do_not_biff BEGIN + ACTION_BASH_FOR "%resource_loc%/anim/bam" "*.*" BEGIN + COPY "%BASH_FOR_FILESPEC%" override + END + ACTION_BASH_FOR "%resource_loc%/anim/wav" "*.*" BEGIN + COPY "%BASH_FOR_FILESPEC%" override + END + END ELSE BEGIN + MAKE_BIFF "dw#idani" BEGIN "%resource_loc%/anim/bam" ".*\.*" END + MAKE_BIFF "dw#idawv" BEGIN "%resource_loc%/anim/wav" ".*\.*" END + END + END + + // install creature animations (right now, only beetles) + + ACTION_BASH_FOR "%resource_loc%/beetle/bam" ".*\.bam" BEGIN + ACTION_IF !FILE_EXISTS_IN_GAME "%BASH_FOR_FILE%" BEGIN + COPY "%BASH_FOR_FILESPEC%" override + END + END + + ACTION_BASH_FOR "%resource_loc%/beetle/wav" ".*\.wav" BEGIN + ACTION_IF !FILE_EXISTS_IN_GAME "%BASH_FOR_FILE%" BEGIN + COPY "%BASH_FOR_FILESPEC%" override + END + END + END + // read in files we're allowed to overwrite (NOT redundant with later such block - this one is individual files!) + + LAF read_in_list STR_VAR file="resource_overwrite.2da" location="%iwdspells_data%" RET list END + OUTER_WHILE "%list%" STRING_COMPARE_CASE "" BEGIN + LAF return_first_entry STR_VAR list RET entry list END + ACTION_TO_UPPER entry + OUTER_SET $overwrite_me("%entry%")=1 + END + + PRINT "Resolving animation reallocations" + + ACTION_IF enhanced_edition BEGIN + // get a list of which IWD animations are missing in BG(2)EE + ACTION_IF !GAME_IS iwdee BEGIN + ACTION_IF !(FILE_EXISTS "%data_loc%/missing_animations.2da") BEGIN + LAF run STR_VAR file=audit_animations location="%iwdspells_lib%" END + END + ACTION_IF FILE_EXISTS "%data_loc%/missing_animations.2da" BEGIN // theoretically it might still not exist because every animation has been added! + COPY "%data_loc%/missing_animations.2da" "%workspace%" + READ_2DA_ENTRIES_NOW missing_anim_array 1 + FOR (i=0;i %value_number%, corresponding to %key%=>%value" + END + END + + PRINT "Resolving TRA entries" + + // load in and resolve the tra entries + + ACTION_IF FILE_EXISTS "%resource_loc%/tra/%EE_LANGUAGE%/%tra%" BEGIN + OUTER_SPRINT tra_file "%resource_loc%/tra/%EE_LANGUAGE%/%tra%" + END ELSE BEGIN + OUTER_SPRINT tra_file "%resource_loc%/tra/en_us/%tra%" + END + + WITH_TRA "%tra_file%" BEGIN + // LAF log_this STR_VAR file=strref_map.2da input="map generated from %tra_file% and %resource_loc%/%lookup%" END + COPY_EXISTING "%resource_loc%/%lookup%" "%workspace%" + READ_2DA_ENTRIES_NOW tra_entries 2 + FOR (i=0;i"projectile=>~projectile in adjust_projectile_number~" + patch_effect_inline=>"match=>opcode=331 parameter2=>~parameter2 in summons_swap~" + delete_effect=>"opcode=324 and parameter2=63" // remove Evasion + END + ACTION_IF !("%new_resref%.%BASH_FOR_EXT%" STRING_MATCHES_REGEXP "SPWI[1-9][0-9][0-9]\.spl") BEGIN + OUTER_SPRINT $patch_data("enforce_school") null + END + ACTION_IF "%BASH_FOR_EXT%" STRING_EQUAL_CASE spl && "%style_new%" STRING_COMPARE "" BEGIN + OUTER_SPRINT $patch_data("update_spell_style") null + END + ACTION_IF "%BASH_FOR_EXT%" STRING_EQUAL_CASE "spl" && truncate_at_level>0 BEGIN + OUTER_SPRINT $patch_data("delete_ability") "ability_min_level>%truncate_at_level%" + END + LAF edit_whatever STR_VAR file="%new_resref%.%BASH_FOR_EXT%" locabs="%install_loc%" edits=patch_data END + END + pro BEGIN + COPY "%install_loc%/%new_resref%.%BASH_FOR_EXT%" "%workspace%" + PATCH_IF BUFFER_LENGTH>0x200 BEGIN + SET extended=1 + END ELSE BEGIN + SET extended=0 + END + BUT_ONLY + ACTION_IF extended BEGIN + MAKE_PATCH + explosion_pro=>"explosion_pro in adjust_projectile_number" + secondary_pro=>"secondary_pro in adjust_projectile_number" + END + LAF edit_pro STR_VAR pro="%new_resref%" locabs="%install_loc%" edits=patch_data END + + END + END + cre BEGIN + MAKE_PATCH + animation_code=>"animation_code in animation_swap" + END + LAF edit_creature STR_VAR creature="%new_resref%" locabs="%install_loc%" edits=patch_data END + END + DEFAULT END + END // end of the 'have we copied this over already?' loop + END // end of the sanity-check-fail loop + + END // end of the resource ACTION_BASH_FOR + END // end of proceed? loop + // scroll + ACTION_IF (!overwrite && make_scrolls && INDEX ("\(SPWI\|SPPR\)[1-9][0-9][0-9]$" "%new_spell_resref%")>=0 && !VARIABLE_IS_SET "%spellname%_SCROLL" ) BEGIN + ACTION_IF is_iwd BEGIN + OUTER_SPRINT name_func dw_scroll_name + END ELSE BEGIN + OUTER_SPRINT name_func cd_scroll_name + END + ACTION_IF VARIABLE_IS_SET $scroll_prices("%spellname%") BEGIN + OUTER_SET price=$scroll_prices("%spellname%") + END ELSE BEGIN + OUTER_SET price="-1" + END + LAF make_scroll_of_spell INT_VAR price STR_VAR spell_loc="%install_loc%" resref="%new_spell_resref%" name_func RET scrollname END + OUTER_SPRINT "%spellname%_SCROLL" "%scrollname%" + END + ACTION_IF overwrite BEGIN + OUTER_SPRINT scrollname "%spellname%_SCROLL" + OUTER_SPRINT scroll EVAL "%%scrollname%%" + ACTION_IF FILE_EXISTS_IN_GAME "%scroll%.itm" BEGIN + COPY "%install_loc%/%new_spell_resref%.spl" "%workspace%" + READ_LONG 0x8 name_strref + READ_LONG 0x50 desc_strref + BUT_ONLY + COPY_EXISTING "%scroll%.itm" override + WRITE_LONG 0xc name_strref + WRITE_LONG 0x54 desc_strref + BUT_ONLY + END + END + + END // end of outer loop + + // compile any scripts (do this last, so new entries have a chance to get into spell.ids) + + CLEAR_IDS_MAP + ACTION_BASH_FOR "%baf_loc%" ".*\.baf" BEGIN + COPY "%BASH_FOR_FILESPEC%" "%install_loc%/%BASH_FOR_RES%.BCS" + COMPILE_BAF_TO_BCS + END + + // if relevant, install scrolls + + ACTION_IF "%scroll_shadow_list%" STRING_COMPARE "" BEGIN + LAF install_scrolls STR_VAR scroll_shadow_list END + END + + // greenify + + ACTION_IF "%bam_copy%" STRING_COMPARE_CASE "" BEGIN + LAF include STR_VAR file=install_iwd_spell_bams.tpa location="%iwdspells_lib%" END + LAF install_iwd_spell_bams STR_VAR file="%bam_copy%" install_loc END + END + + ACTION_IF "%green_bams%" STRING_COMPARE_CASE "" BEGIN + LAF include STR_VAR file=make_bams_green.tpa location="%iwdspells_lib%" END + LAF make_bams_green STR_VAR file="%green_bams%" END + END + + // icons (will only happen once) + + ACTION_IF !GAME_IS iwdee BEGIN + LAF install_iwd_icons END + END + + // make BIFF + + ACTION_IF !do_not_biff BEGIN + MAKE_BIFF "%biff%" BEGIN "%install_loc%" ".*\.*" END + END + + // sort out remaps (needs to happen AFTER biff so files are in-game - this is the price of having separate divine, arcane components) + ACTION_IF !GAME_IS iwdee BEGIN + LAF process_table STR_VAR function=remap_spell_resrefs_helper table="spells_used.2da" locabs="%resource_loc%" END + + ACTION_IF FILE_EXISTS_IN_GAME "7eyes.2da" BEGIN + COPY_EXISTING "7eyes.2da" override + PATCH_IF VARIABLE_IS_SET CLERIC_DESTRUCTION BEGIN + SPRINT replace "%CLERIC_DESTRUCTION%" + TO_UPPER replace + REPLACE_TEXTUALLY SPPR734 "%replace%" + END + PATCH_IF VARIABLE_IS_SET CLERIC_SYMBOL_HOPELESSNESS BEGIN + SPRINT replace "%CLERIC_SYMBOL_HOPELESSNESS%" + TO_UPPER replace + REPLACE_TEXTUALLY SPPR716 "%replace%" + END + END + END + + // manual tasks + + ACTION_IF "%afterwards%" STRING_COMPARE_CASE "" BEGIN + ACTION_IF "%afterwards_tra%" STRING_COMPARE_CASE "" BEGIN + ACTION_IF FILE_EXISTS "%MOD_FOLDER%/%iwdspells_trabase%/%LANGUAGE%/%afterwards_tra%" BEGIN + OUTER_SPRINT tra "%MOD_FOLDER%/%iwdspells_trabase%/%LANGUAGE%/%afterwards_tra%" + END ELSE BEGIN + OUTER_SPRINT tra "%MOD_FOLDER%/%iwdspells_trabase%/english/%afterwards_tra%" + END + END ELSE BEGIN + OUTER_SPRINT tra "" + END + LAF include STR_VAR file="%afterwards%.tpa" location="%iwdspells_lib%" END + LAF "%afterwards%" STR_VAR tra END + END + + // tidy up + + LAF sort_ids STR_VAR ids=spell END +END + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION strref_updater + INT_VAR strref=0 offset=0 + STR_VAR filename="" file_ext="" // unused, but needed because apply_to_strrefs requires them + RET strref_new +BEGIN + SET strref_new=strref + PATCH_IF offset=0 BEGIN + SET old=strref + END ELSE BEGIN + READ_LONG offset old + END + PATCH_IF VARIABLE_IS_SET $strref_map("%old%") BEGIN + SET strref_new=$strref_map("%old%") + PATCH_IF offset>0 BEGIN + WRITE_LONG offset strref_new + END + + END +END + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION adjust_projectile_number + STR_VAR arguments=0 RET value +BEGIN + SET arguments -=1 + PATCH_IF VARIABLE_IS_SET $proj_map("%arguments%") BEGIN + SET value = $proj_map("%arguments%") + 1 + END ELSE BEGIN + SET value = arguments + 1 + END +END + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION summons_swap + STR_VAR arguments=0 RET value +BEGIN + PATCH_IF enhanced_edition BEGIN + PATCH_IF VARIABLE_IS_SET $smtables_map("%arguments%") BEGIN + SPRINT value $smtables_map("%arguments%") + END ELSE BEGIN + SPRINT value "%arguments%" + LPF warning STR_VAR warning="failed to recognise a swap for summons code %arguments%" END + END + END +END + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION animation_swap + STR_VAR arguments=0 RET value +BEGIN + PATCH_IF VARIABLE_IS_SET $anim_map("%arguments%") BEGIN + SET value=$anim_map("%arguments%") + END ELSE BEGIN + arguments +=1 // to force number + arguments -=1 + PATCH_IF VARIABLE_IS_SET $anim_missing("%arguments%") BEGIN + LOOKUP_IDS_SYMBOL_OF_INT anim_name animate arguments + SPRINT warning_string "Warning: animation %anim_name% does not exist in game. Reverting to MINOTAUR, which may look weird" + LPF warning STR_VAR warning="%warning_string%" END + SET value=0xE070 + END ELSE BEGIN + SET value=arguments + END + END +END + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION add_projectile_ids_entry INT_VAR lowest_to_try=300 STR_VAR resref="" RET number +BEGIN + OUTER_PATCH "" BEGIN + LOOKUP_IDS_SYMBOL_OF_INT check projectl lowest_to_try + END + ACTION_IF IS_AN_INT check BEGIN // ie if it's -1, i.e. that number isn't used + APPEND "projectl.ids" "%lowest_to_try% %resref%" + OUTER_SET number=lowest_to_try + END ELSE BEGIN + OUTER_SET lowest_to_try +=1 + LAF add_projectile_ids_entry INT_VAR lowest_to_try STR_VAR resref RET number END + END +END + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION install_scrolls + STR_VAR scroll_shadow_list="" +BEGIN + // read in the shadow list + COPY "%MOD_FOLDER%/%iwdspells_data%/%scroll_shadow_list%" "%workspace%" + COUNT_2DA_ROWS 2 rowcount + FOR (i=1;ioffset_base BEGIN + LPF STO_read_item_resource RET item_resref=value END + LPF STO_read_item_num_in_stock RET number=value END + TO_UPPER item_resref + SET $stock("%item_resref%")=number + END + + PHP_EACH shadow_map AS key=>value BEGIN + PATCH_IF INDEX_BUFFER ("%value%")>=0 BEGIN + TO_UPPER value + SET number_in_stock=$stock("%value%") + ADD_STORE_ITEM "%key%" AFTER "%value%" #1 #0 #0 "IDENTIFIED" (number_in_stock) + END + END + BUT_ONLY +END + +//////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION find_scroll_slot + STR_VAR scroll_slot="00" + RET scroll_slot +BEGIN + ACTION_IF (FILE_EXISTS_IN_GAME "SCRL%scroll_slot%.itm" || FILE_EXISTS "%install_loc%/SCRL%scroll_slot%.itm") BEGIN + LAF alphanumeric_advance STR_VAR arguments="%scroll_slot%" RET scroll_slot=value END + LAF find_scroll_slot STR_VAR scroll_slot RET scroll_slot END + END +END + +DEFINE_ACTION_FUNCTION dw_scroll_name + STR_VAR arguments="" + RET value +BEGIN + LAF find_scroll_slot RET scroll_slot END + OUTER_SPRINT value "SCRL%scroll_slot%" +END + + +//////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION remap_spell_resrefs_helper + STR_VAR resref="" + spellname="" + parent="" + parent_ext="" +BEGIN + ACTION_TO_UPPER parent + ACTION_IF "%parent_ext%" STRING_EQUAL_CASE SPL BEGIN + ACTION_IF VARIABLE_IS_SET "%parent%" BEGIN + OUTER_SPRINT parent EVAL "%%parent%%" + END + END + ACTION_IF FILE_EXISTS_IN_GAME "%parent%.%parent_ext%" BEGIN + OUTER_INNER_PATCH_SAVE placeholder "%resref%" BEGIN + WRITE_ASCII 0x0 "##" + END + ACTION_TO_UPPER spellname + ACTION_IF VARIABLE_IS_SET "%spellname%" BEGIN + OUTER_SPRINT resref_new EVAL "%%spellname%%" + PRINT "%spellname% exists; swapping %placeholder% and %resref% for %resref_new% in %parent%" + LAF swap_text STR_VAR files="%parent%.%parent_ext%" swaps="%placeholder%=>%resref_new% %resref%=>%resref_new%" END + END ELSE BEGIN + PRINT "%spellname% does not exist; swapping %resref% for %placeholder% in %parent%" + LAF swap_text STR_VAR files="%parent%.%parent_ext%" swaps="%resref%=>%placeholder%" END + END + END +END + +//////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////// +/// Name scrolls CamDawg style +/// +//////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////// + + + +DEFINE_ACTION_FUNCTION cd_scroll_name + STR_VAR arguments="" + RET value +BEGIN + OUTER_INNER_PATCH_SAVE value "%arguments%" BEGIN + REPLACE_TEXTUALLY SPWI CDIA + REPLACE_TEXTUALLY SPPR CDID + END + +END + +//////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////// +/// Install icons +/// +//////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION install_iwd_icons BEGIN + + LAF check_label STR_VAR label="dw#iwd_icons" RET value END + ACTION_IF !value BEGIN + LAF make_label STR_VAR label="dw#iwd_icons" END + COPY "%resource_loc%/icon/states.bam" override + COPY "%resource_loc%/icon/states2.bam" override + END + COPY "%resource_loc%/icon/statdesc.2da" "%workspace%" + COUNT_2DA_ROWS 3 rowcount + FOR (i=0;i=164 && number <=187) BEGIN + READ_2DA_ENTRY i 1 3 strref_iwd + SET $icon_strref("%number%") = $strref_map("%strref_iwd%") + END + END + BUT_ONLY + COPY_EXISTING "statdesc.2da" override + COUNT_2DA_ROWS 3 rowcount + FOR (i=0;i=164 && number <=187) BEGIN + SET to_add=$icon_strref("%number%") + SET_2DA_ENTRY i 1 3 to_add + END + END + +END diff --git a/iwdification/lib/iwdfix.tph b/iwdification/lib/iwdfix.tph new file mode 100644 index 0000000..93c5cb6 --- /dev/null +++ b/iwdification/lib/iwdfix.tph @@ -0,0 +1,108 @@ +DEFINE_ACTION_FUNCTION iwd_spell_fixes BEGIN + + // broken file + + COPY_EXISTING "#bonecir.spl" override WRITE_ASCII 0x0 "SPL " + + + // lich touch (paralysis effect missing) +/* obsolete in 2.6 + + + MAKE_PATCH + patch_effect_inline=>"save_vs_death=>0 parameter2b=>64" + add_effect_inline=>"opcode=>175 resist_dispel=>1 target=>2 parameter2=>2 duration=>600 save_vs_death=>1" + add_effect_inline'=>"opcode=>142 resist_dispel=>1 target=>2 parameter2=>13 duration=>600 save_vs_death=>1" + add_effect_inline''=>"opcode=>174 resist_dispel=>1 timing=>1 target=>2 resource=>~#eff_m07~ save_vs_death=>1" + add_effect_inline'''=>"opcode=>215 resist_dispel=>1 timing=>1 target=>2 resource=>~necroh~" + END + LAF edit_spell STR_VAR spell=ltouch edits=patch_data END + +*/ + + // entropy shield (remove spurious protection from Breach/Spellstrike/Imprisonment; doesn't protect against Flame Strike) + // apparently not fixed in 2.6 + + COPY_EXISTING "%CLERIC_ENTROPY_SHIELD%.spl" override + LPF DELETE_EFFECT INT_VAR match_opcode=83 match_parameter2=54 END + PATCH_FOR_EACH resource IN sppr503 spimix01 ohbeflam BEGIN + LPF CLONE_EFFECT STR_VAR match_resource=sppr984 resource END + END + BUT_ONLY + + + + // Vitriolic sphere 1/2 (splash shouldn't affect primary target; shouldn't be blocked by primary target's MR) + /* apparently fixed in 2.6 + + COPY_EXISTING "%WIZARD_VITRIOLIC_SPHERE%.spl" override + LPF ALTER_EFFECT INT_VAR match_opcode=146 resist_dispel=0 END + LPF ALTER_EFFECT INT_VAR match_opcode=215 resist_dispel=0 END + LPF CLONE_EFFECT INT_VAR match_opcode=146 opcode=318 parameter1=0 parameter2=0 duration=1 timing=0 STR_VAR resource=spwi431y END + + */ + + // Vitriolic sphere 2/2 (splash damage doesn't decrease with time) + + /* apparently fixed in 2.6 + + COPY_EXISTING "%WIZARD_VITRIOLIC_SPHERE%.spl" override + "%WIZARD_VITRIOLIC_SPHERE%z.spl" override + LPF ALTER_EFFECT INT_VAR match_opcode=146 parameter2=2 END + + */ + + // 7 eyes (eye of the sword shouldn't protect against stunning damage, which is only used for the hp backlash of the Enrage ability) + // apparently still an issue in 2.6 + + COPY_EXISTING "7eyes.2da" override + REPLACE_TEXTUALLY "12*0x8000000" "*" + PRETTY_PRINT_2DA + + // The projectile for Bombardier Beetle clouds has a duplicate string + // still an issue in 2.6 + + COPY_EXISTING "%INNATE_BOMBARDIER_BEETLE_CLOUD%.spl" override + LPF DELETE_EFFECT INT_VAR match_opcode=139 match_parameter1=35568 multi_match=1 END + BUT_ONLY + + // Cause Light Wounds has mismatched damage + + /* looks fixed in 2.6 + + COPY_EXISTING "%CLERIC_CAUSE_LIGHT_WOUNDS%.spl" override + LPF DELETE_EFFECT INT_VAR match_opcode=12 match_save_vs_spell=0 END + LPF ALTER_EFFECT INT_VAR match_opcode=12 parameter1=8 save_for_half=1 END + BUT_ONLY + + */ + + // Storm Shell shouldn't stack with itself + // still an issue in 2.6 + + COPY_EXISTING "%CLERIC_STORM_SHELL%.spl" override + LPF ADD_SPELL_EFFECT INT_VAR insert_point=0 opcode=321 target=2 timing=0 resist_dispel=3 STR_VAR resource="%CLERIC_STORM_SHELL%" END + LPF ALTER_EFFECT INT_VAR target=1 END // for some subtle reason, ability_target=5 and target=2 doesn't play nice with the 321 trick + BUT_ONLY + + // Mind Blank is supposed to protect against petrification + // still an issue on 2.6 + + COPY_EXISTING "%WIZARD_MIND_BLANK%.spl" override + LPF CLONE_EFFECT INT_VAR match_opcode=101 match_parameter2=175 parameter2=134 END // immune to petrification opcode + LPF CLONE_EFFECT INT_VAR match_opcode=267 match_parameter1=14102 parameter2=14127 END // immune to petrification string + LPF CLONE_EFFECT INT_VAR match_opcode=169 match_parameter2=3 parameter2=171 END // immune to petrification icon + BUT_ONLY + + +END + +DEFINE_ACTION_FUNCTION iwd_misc_fixes BEGIN + + // Hjollder wind-walk cutscenes cosmetic fix (restore to more like IWDvanilla) + + LAF swap_text STR_VAR file="bctoil.bcs bctoku.bcs bitoku.bcs hjescape.bcs kutobc.bcs kutobi.bcs kutolw.bcs" swaps=~Wait(2)=>SmallWait(15)ApplySpellRES("dw#silin",Myself)Wait(2)~ END + + + +END \ No newline at end of file diff --git a/iwdification/lib/lib_ini.tpa b/iwdification/lib/lib_ini.tpa new file mode 100644 index 0000000..a3726d7 --- /dev/null +++ b/iwdification/lib/lib_ini.tpa @@ -0,0 +1,63 @@ +// the ini functions, extracted from SFO and SFO_lite + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///// Read an ini file "ini_to_read.ini" into SFO_reserved_ini_hash (mostly borrowed from Kjeron) +///// +///// ini key values are treated case-insensitive +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION SFO_read_ini_file + STR_VAR ini_to_read="" + RET_ARRAY SFO_reserved_ini_hash +BEGIN + ACTION_IF "%ini_to_read%" STRING_EQUAL "" BEGIN + OUTER_SPRINT ini_to_read "%MOD_FOLDER%/%MOD_FOLDER%.ini" + END +PRINT ~ini is %ini_to_read%~ + OUTER_SPRINT key "" + ACTION_IF FILE_EXISTS "%ini_to_read%" BEGIN + COPY - "%ini_to_read%" "%workspace%" + REPLACE_EVALUATE ~^\([^ %TAB%%WNL%]+\) *= *\([^%WNL%$]+\)~ + BEGIN + // key must start line and cannot contain whitespace + // value is everything after the "=" until the newline/end + SPRINT key "%MATCH1%" + TO_LOWER key + TEXT_SPRINT $SFO_reserved_ini_hash(~%key%~) ~%MATCH2%~ + END + ~~ + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///// Check an ini value (case-insensitive) +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION check_ini + INT_VAR silent=0 + STR_VAR ini="" + RET value +BEGIN + TO_LOWER ini + PATCH_IF !VARIABLE_IS_SET $SFO_reserved_ini_hash(~%ini%~) BEGIN + SPRINT value 0 + PATCH_IF !silent BEGIN + PATCH_PRINT "working on $SFO_reserved_ini_hash(~%ini%~)" + PATCH_WARN "ini entry %ini% has been checked, but is not present in the ini file" + END + END ELSE BEGIN + SPRINT value $SFO_reserved_ini_hash(~%ini%~) + END +END + +DEFINE_ACTION_FUNCTION check_ini + INT_VAR silent=0 + STR_VAR ini="" + RET value +BEGIN + OUTER_PATCH "" BEGIN + LPF check_ini INT_VAR silent STR_VAR ini RET value END + END +END \ No newline at end of file diff --git a/iwdification/lib/lib_spell_style.tph b/iwdification/lib/lib_spell_style.tph new file mode 100644 index 0000000..edf4213 --- /dev/null +++ b/iwdification/lib/lib_spell_style.tph @@ -0,0 +1,259 @@ +<<<<<<<< .../stratagems-inline/spell_style_prototypes.txt +style prototype +mage_enchantment WIZARD_LUCK +mage_abjuration WIZARD_SPELL_TURNING +mage_divination WIZARD_INFRAVISION +mage_invocation WIZARD_MAGIC_MISSILE +mage_alteration WIZARD_COLOR_SPRAY +mage_blind_deaf WIZARD_BLINDNESS +mage_necromancy WIZARD_ENERGY_DRAIN +mage_mirror_image WIZARD_MIRROR_IMAGE +mage_spook WIZARD_SPOOK +mage_invisibility WIZARD_INVISIBILITY +mage_detect_illusion WIZARD_DETECT_ILLUSION +mage_antimagic WIZARD_BREACH +mage_ruby_ray WIZARD_RUBY_RAY_OF_REVERSAL +mage_confusion WIZARD_CONFUSION +mage_symbol WIZARD_SYMBOL_STUN +cleric_abjuration CLERIC_PROTECT_FROM_EVIL +cleric_alteration CLERIC_BARKSKIN +cleric_conjuration CLERIC_SYMBOL_STUN +cleric_divination CLERIC_FIND_TRAPS +cleric_enchantment CLERIC_MAGIC_STONE +cleric_invocation CLERIC_GOOD_BERRIES +cleric_necromancy CLERIC_AID +>>>>>>>> + +<<<<<<<< .../stratagems-inline/blank +>>>>>>>> + +///////////////////////////////////////////////////////////////////////////////////////// +/// Get the style data (if any) for the current spell +///////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION get_style_data RET vvc wav glow BEGIN + + SPRINT vvc null + SPRINT wav null + SPRINT glow null + GET_OFFSET_ARRAY2 fx_arr 0x72 SPL_V10_HEAD_EFFECTS + PHP_EACH fx_arr AS fx_ind=>fx_off BEGIN + READ_SHORT fx_off opcode + PATCH_IF opcode=215 BEGIN + PATCH_IF BYTE_AT (0xc+fx_off)=1 BEGIN + READ_ASCII 0x14+fx_off resource + TO_UPPER resource + SPRINT vvc "%resource%" + END + END + PATCH_IF opcode=141 BEGIN + PATCH_IF BYTE_AT (0xc+fx_off)=1 BEGIN + READ_LONG 0x8+fx_off lighting_type + SPRINT vvc "141-%lighting_type%" + + END + END + PATCH_IF opcode=174 BEGIN + PATCH_IF BYTE_AT (0xc+fx_off)=1 BEGIN + READ_ASCII 0x14+fx_off resource + TO_UPPER resource + SPRINT wav "%resource%" + END + END + PATCH_IF opcode=61 || opcode=50 BEGIN + READ_LONG 0x4+fx_off color + READ_LONG 0x8+fx_off color2 + SPRINT glow "%opcode%-%color%-%color2%" + END + END + + +END + + +///////////////////////////////////////////////////////////////////////////////////////// +/// Get the actual styles from a list of prototypes (probably not run in live-distributed code) +///////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION collect_spell_styles STR_VAR prototypes=".../stratagems-inline/spell_style_prototypes.txt" output_loc="" output="" BEGIN + + // get the prototype data + + + OUTER_SPRINT data "2DA V1.0%WNL%*%WNL%vvc wav glow%WNL%" + COPY "%prototypes%" override + READ_2DA_ENTRIES_NOW prototype_data 2 + FOR (row=1;rowvvc_of_style BEGIN + SPRINT wav_of_style $style_wav("%style%") + SPRINT glow_of_style $style_glow("%style%") + PATCH_IF "%vvc_of_style%" STRING_EQUAL_CASE "%vvc%" && "%wav_of_style%" STRING_EQUAL_CASE "%wav%" && "%glow_of_style%" STRING_EQUAL_CASE "%glow%" BEGIN + SPRINT style_is "%style%" + END + END + SPRINT style "%style_is%" +END + + +///////////////////////////////////////////////////////////////////////////////////////// +/// As a patch function, apply a style to a spell +/// +/// This assumes that in the background we have arrays style_vvc, style_wav, style_glow loaded +///////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION apply_spell_style STR_VAR arguments="" BEGIN + + TO_LOWER arguments + // get data + PATCH_IF !VARIABLE_IS_SET $style_vvc("%arguments%") BEGIN + LPF warning STR_VAR warning="Unable to apply spell style %arguments% as it doesn't exist, or else hasn't been loaded" END + END ELSE BEGIN + SPRINT vvc $style_vvc("%arguments%") + SPRINT wav $style_wav("%arguments%") + SPRINT glow $style_glow("%arguments%") + END + // find a prototype effect + GET_OFFSET_ARRAY2 fx_arr 0x72 SPL_V10_HEAD_EFFECTS + template_opcode=0 + template_target=0 + PHP_EACH fx_arr AS fx_ind=>fx_off BEGIN + PATCH_IF template_opcode=0 BEGIN + PATCH_IF BYTE_AT (0xc+fx_off)=1 BEGIN // permanent duration + READ_SHORT fx_off opcode + PATCH_MATCH "%opcode%" WITH + 215 141 174 50 61 BEGIN + template_opcode=opcode + READ_BYTE fx_off+0x2 template_target + END + DEFAULT + END + END + END + END + PATCH_IF template_opcode=0 BEGIN + LPF warning STR_VAR warning="failed to apply spell style %arguments% to %filename% as it lacks a viable prototype" END + END ELSE BEGIN + // mark the template + LPF ALTER_EFFECT INT_VAR match_opcode=template_opcode match_target=template_target match_timing=1 opcode=999 END + // delete other style features + PATCH_FOR_EACH match_opcode IN 50 61 141 174 215 BEGIN + LPF DELETE_EFFECT INT_VAR match_opcode match_target=template_target match_timing=1 END + END + // vvc + PATCH_IF "%vvc%" STRING_COMPARE_CASE "null" BEGIN + PATCH_MATCH "%vvc%" WITH + "141.*" BEGIN + INNER_PATCH "%vvc%" BEGIN + REPLACE_EVALUATE "141-\(.*\)" + BEGIN + 141_value="%MATCH1%" + END + "" + END + LPF CLONE_EFFECT INT_VAR match_opcode=999 opcode=141 parameter1=0 parameter2=141_value STR_VAR resource="" END + END + DEFAULT + LPF CLONE_EFFECT INT_VAR match_opcode=999 opcode=215 parameter1=0 parameter2=0 STR_VAR resource="%vvc%" END + END + END + // wav + PATCH_IF "%wav%" STRING_COMPARE_CASE "null" BEGIN + LPF CLONE_EFFECT INT_VAR match_opcode=999 opcode=174 parameter1=0 parameter2=0 STR_VAR resource="%wav%" END + END + // glow + PATCH_IF "%glow%" STRING_COMPARE_CASE "null" BEGIN + INNER_PATCH "%glow%" BEGIN + REPLACE_EVALUATE "\(-?[0-9]+\)-\(-?[0-9]+\)-\(-?[0-9]+\)" BEGIN + opcode="%MATCH1%" + parameter1="%MATCH2%" + parameter2="%MATCH3%" + END + "" + END + LPF CLONE_EFFECT INT_VAR match_opcode=999 opcode parameter1 parameter2 STR_VAR resource="" END + END + // clean up + LPF DELETE_EFFECT INT_VAR match_opcode=999 END + END + +END + +///////////////////////////////////////////////////////////////////////////////////////// +/// As a patch function, update a spell's style +/// +/// The reserved variable SFO_reserved_old_style_file must be set to the file with the old style in +///////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION update_spell_style + STR_VAR arguments="" // not used, for compatibility with SFO interface +BEGIN + // identify current style + LPF identify_spell_style STR_VAR style_file="%SFO_reserved_old_style_file%" RET style END + // update style + PATCH_IF "%style%" STRING_COMPARE "" BEGIN + LPF apply_spell_style STR_VAR arguments="%style%" END + LPF log_this STR_VAR file="altered_spell_styles.txt" input="%SOURCE_RES% %style%" END + END + +END \ No newline at end of file diff --git a/iwdification/lib/make_bams_green.tpa b/iwdification/lib/make_bams_green.tpa new file mode 100644 index 0000000..1cc8b7d --- /dev/null +++ b/iwdification/lib/make_bams_green.tpa @@ -0,0 +1,58 @@ +DEFINE_ACTION_FUNCTION make_bams_green STR_VAR file="" +BEGIN + + LAF read_in_list STR_VAR file locbase="%iwdspells_data%" RET list END + OUTER_WHILE "%list%" STRING_COMPARE "" BEGIN + LAF return_first_entry STR_VAR list RET entry list END + LAF get_spellcode STR_VAR input="%entry%" RET resref=value END + LAF patch_colors INT_VAR suppress_warning=1 STR_VAR bam="%resref%a %resref%c" condition=is_red action=col_swap END + LAF patch_colors INT_VAR suppress_warning=1 STR_VAR bam="%resref%b" condition=is_dark_red action=col_swap_2 END + END +END + + +DEFINE_PATCH_FUNCTION col_swap + INT_VAR red=0 green=0 blue=0 + RET red green blue +BEGIN + SET green_old=green + SET blue_old=blue + SET red_old=red + + SET red = 35 + SET green = red_old - 50 + SET blue = blue_old - 20 +END + +DEFINE_PATCH_FUNCTION col_swap_2 + INT_VAR red=0 green=0 blue=0 + RET red green blue +BEGIN + SET green_old=green + SET blue_old=blue + SET red_old=red + + SET red = 50 + SET green = red_old - 50 + SET blue = 40 +END + +DEFINE_PATCH_FUNCTION is_red + INT_VAR red=0 green=0 blue=0 + RET value +BEGIN + SET value=1 + PATCH_IF (red<160 || green>90) BEGIN + SET value=0 + END +END + +DEFINE_PATCH_FUNCTION is_dark_red + INT_VAR red=0 green=0 blue=0 + RET value +BEGIN + SET value=1 + PATCH_IF (red<60) BEGIN + SET value=0 + END +END diff --git a/iwdification/lib/process_strref.tp2 b/iwdification/lib/process_strref.tp2 new file mode 100644 index 0000000..52a08b3 --- /dev/null +++ b/iwdification/lib/process_strref.tp2 @@ -0,0 +1,26 @@ +BACKUP "weidu_external/backup/iwdspells_auto" +AUTHOR ~DavidW~ +VERSION ~v1~ + +AUTO_EVAL_STRINGS + +BEGIN "Automated conversion of strings" DESIGNATED 1000 NO_LOG_RECORD + + OUTER_SPRINT resource_loc "%resource_loc%" + OUTER_SPRINT iwdspells_data "%iwdspells_data%" + OUTER_SPRINT iwdspells_lib "%iwdspells_lib%" + OUTER_SPRINT iwdspells_resource "%iwdspells_resource%" + OUTER_SPRINT iwdspells_trabase "%iwdspells_trabase%" + OUTER_SPRINT sfo_loc "%sfo_loc%" + OUTER_SPRINT ssl_loc "%ssl_loc%" + OUTER_SPRINT data_loc "%data_loc%" + OUTER_SPRINT language "%language%" + +INCLUDE "%MOD_FOLDER%/%iwdspells_lib%/get_iwd_spell_resources.tpa" + + +<<<<<<<< .../stratagems-inline/blank +>>>>>>>> + + +LAF process_tra_entries INT_VAR make_lookup=0 STR_VAR tra="%language%/iwdspells.tra" END diff --git a/iwdification/lib/rebuild_spell_hotkeys.tpa b/iwdification/lib/rebuild_spell_hotkeys.tpa new file mode 100644 index 0000000..2c92313 --- /dev/null +++ b/iwdification/lib/rebuild_spell_hotkeys.tpa @@ -0,0 +1,174 @@ +DEFINE_ACTION_FUNCTION rebuild_spell_hotkeys BEGIN + + ACTION_IF !VARIABLE_IS_SET workspace BEGIN + OUTER_SPRINT workspace "weidu_external/workspace" + MKDIR "%workspace%" + END + + LAF get_hidespl_data RET_ARRAY is_hidden END + LAF prepare_lua RET_ARRAY occupied_slots END + OUTER_SET number=0 + OUTER_SPRINT priest_insert "" + ACTION_FOR_EACH root IN sppr1 sppr2 sppr3 sppr4 sppr5 sppr6 sppr7 BEGIN + LAF get_hotkey_spells_by_root STR_VAR root RET_ARRAY hotkey_spells_array END + ACTION_PHP_EACH hotkey_spells_array AS resref=>strref BEGIN + LAF get_next_free_slot INT_VAR current_slot=number RET number=next_slot END + OUTER_SPRINT to_add " { %number%, 5, '%resref%', %strref%, '', 0, 0 }" + ACTION_IF "%priest_insert%" STRING_EQUAL "" BEGIN + OUTER_SPRINT priest_insert "%to_add%" + END ELSE BEGIN + OUTER_SPRINT priest_insert "%priest_insert%,%WNL%%to_add%" + END + END + END + OUTER_SPRINT mage_insert "" + ACTION_FOR_EACH root IN spwi1 spwi2 spwi3 spwi4 spwi5 spwi6 spwi7 spwi8 spwi9 BEGIN + LAF get_hotkey_spells_by_root STR_VAR root RET_ARRAY hotkey_spells_array END + ACTION_PHP_EACH hotkey_spells_array AS resref=>strref BEGIN + LAF get_next_free_slot INT_VAR current_slot=number RET number=next_slot END + OUTER_SPRINT to_add " { %number%, 6, '%resref%', %strref%, '', 0, 0 }" + ACTION_IF "%mage_insert%" STRING_EQUAL "" BEGIN + OUTER_SPRINT mage_insert "%to_add%" + END ELSE BEGIN + OUTER_SPRINT mage_insert "%mage_insert%,%WNL%%to_add%" + END + END + END + COPY_EXISTING bgee.lua override + REPLACE_TEXTUALLY DW_INSERT_POINT_PRIEST_SPELLS "%priest_insert%" + REPLACE_TEXTUALLY DW_INSERT_POINT_MAGE_SPELLS "%mage_insert%" + +END + + +DEFINE_ACTION_FUNCTION prepare_lua + RET_ARRAY occupied_slots +BEGIN + // destructively get data from a copy of BGEE.LUA + COPY_EXISTING "bgee.lua" "%workspace%" + SET found_first=0 + REPLACE_TEXTUALLY "%TAB%" " " + REPLACE_EVALUATE "{ +\([0-9]+\), +[1-4], [^}]*}" BEGIN + SET $occupied_slots("%MATCH1%")=1 + END + "" + REPLACE_EVALUATE "{ +[0-9]+, +5, +'\(SPPR[0-9]+\)" BEGIN + PATCH_IF !found_first BEGIN + SET found_first=1 + SPRINT first_priest_spell "%MATCH1%" + END + SPRINT last_priest_spell "%MATCH1%" + END + "" + SET found_first=0 + REPLACE_EVALUATE "{ +[0-9]+, +6, +'\(SPWI[0-9]+\)" BEGIN + PATCH_IF !found_first BEGIN + SET found_first=1 + SPRINT first_mage_spell "%MATCH1%" + END + SPRINT last_mage_spell "%MATCH1%" + END + "" + // now patch the original + COPY_EXISTING "bgee.lua" override + REPLACE_TEXTUALLY ".*%first_priest_spell%.*" "DW_INSERT_POINT_1" + REPLACE_TEXTUALLY ".*%last_priest_spell%.*" "DW_INSERT_POINT_PRIEST_SPELLS" + start_point = INDEX_BUFFER ("DW_INSERT_POINT_1") + end_point = INDEX_BUFFER ("DW_INSERT_POINT_PRIEST_SPELLS") + DELETE_BYTES start_point (end_point - start_point) + REPLACE_TEXTUALLY ".*%first_mage_spell%.*" "DW_INSERT_POINT_2" + REPLACE_TEXTUALLY ".*%last_mage_spell%.*" "DW_INSERT_POINT_MAGE_SPELLS" + start_point = INDEX_BUFFER ("DW_INSERT_POINT_2") + end_point = INDEX_BUFFER ("DW_INSERT_POINT_MAGE_SPELLS") + DELETE_BYTES start_point (end_point - start_point) + + +END + +DEFINE_ACTION_FUNCTION get_hotkey_spells_by_root + INT_VAR display_output=0 + STR_VAR root="" + RET_ARRAY hotkey_spells_array +BEGIN + ACTION_CLEAR_ARRAY hotkey_spells_array + ACTION_CLEAR_ARRAY ordering_array + ACTION_CLEAR_ARRAY strref_array + COPY_EXISTING_REGEXP "%root%[0-9]+\.spl" "%workspace%" + SPRINT resref "%SOURCE_RES%" + TO_UPPER resref + PATCH_IF !VARIABLE_IS_SET $is_hidden("%resref%") BEGIN + READ_LONG 0x8 name_strref + READ_STRREF 0x8 name_string + SPRINT $strref_array("%name_strref%") "%resref%" + SPRINT $ordering_array("%name_string%") "%name_strref%" + END + BUT_ONLY + ACTION_SORT_ARRAY_INDICES ordering_array LEXICOGRAPHICALLY + ACTION_PHP_EACH ordering_array AS discard=>strref BEGIN + OUTER_SPRINT resref $strref_array("%strref%") + OUTER_SPRINT $hotkey_spells_array("%resref%") "%strref%" + END + // for debugging + ACTION_IF display_output BEGIN + ACTION_PHP_EACH hotkey_spells_array AS resref=>strref BEGIN + ACTION_GET_STRREF strref name + PRINT "%resref% (%name%)" + END + END +END + + +DEFINE_ACTION_FUNCTION get_next_free_slot + INT_VAR current_slot=0 + RET next_slot +BEGIN + ACTION_IF current_slot>9999 BEGIN + FAIL "emergency exit from loop" + END + OUTER_SET current_slot +=1 + ACTION_IF VARIABLE_IS_SET $occupied_slots("%current_slot%") BEGIN + LAF get_next_free_slot INT_VAR current_slot RET next_slot END + END ELSE BEGIN + OUTER_SET next_slot=current_slot + END +END + + + + + + + +DEFINE_ACTION_FUNCTION get_hidespl_data + RET_ARRAY is_hidden +BEGIN + COPY_EXISTING hidespl.2da override + READ_2DA_ENTRIES_NOW hidespl_array 4 + FOR (i=0;idiscard BEGIN + OUTER_INNER_PATCH "%key%" BEGIN + READ_ASCII 0x0 start (5) + READ_ASCII 0x5 number (2) + END + OUTER_FOR (n=number+1;n<100;n+=1) BEGIN + OUTER_SPRINT resref "%start%%n%" + ACTION_IF (FILE_EXISTS_IN_GAME "%resref%.spl" && !VARIABLE_IS_SET $is_hidden("%resref%")) BEGIN + OUTER_SET $is_hidden("%resref%")=1 + OUTER_SET $is_removed("%resref%")=0 + END + END + END +END diff --git a/iwdification/lib/resource/weidu_external_readme.txt b/iwdification/lib/resource/weidu_external_readme.txt new file mode 100644 index 0000000..14c891f --- /dev/null +++ b/iwdification/lib/resource/weidu_external_readme.txt @@ -0,0 +1,11 @@ +This folder is created by DavidW's mods for storing and building files. Other modders are welcome to use it; it's organised as follows: + +Workspace: for building things. Put anything you like in here; don't expect it still to be there next time you check. + +Data: for storing data that you want to read between components of your mod, or between different mods. Store data in a subfolder of 'Data'. I suggest using a folder with the same name as your mod folder itself; alternatively, use a folder with your modder prefix. Don't have your mod edit anything in someone else's folder without permission. + +Markers: for putting small files that let other components of your mod, or other mods, detect what your mod has done. (This is not a good way to detect whether a component is installed at all, as it does not play nicely with automated installers; use REQUIRE/FORBID_COMPONENT and similar for that.) Since this folder is shared, use your modder prefix for any file stored in it. I suggest ".mrk" as a file suffix. + +Backup: you can backup your mod here if you'd rather not use a folder in your own mod folder. Use +BACKUP "weidu_external/backup/[your mod folder name]" in your tp2. + diff --git a/iwdification/lib/spell_prep.tpa b/iwdification/lib/spell_prep.tpa deleted file mode 100644 index 23de304..0000000 --- a/iwdification/lib/spell_prep.tpa +++ /dev/null @@ -1,113 +0,0 @@ -ACTION_IF !FILE_EXISTS ~iwdification/wav/cditra61.wav~ BEGIN LAF CD_HANDLE_AUDIO END END - -/* animations that are good for either engine -OUTER_SET anim_aelem = 29472 -OUTER_SET anim_carrion = 41216 -OUTER_SET anim_gobaxe = 58368 -OUTER_SET anim_gobaxe_e = 58400 -OUTER_SET anim_gspider = 31232 -OUTER_SET anim_lizman_e = 58624 -OUTER_SET anim_mino = 57456 -OUTER_SET anim_ogre = 36864 -OUTER_SET anim_pbear = 29187 -OUTER_SET anim_pspider = 31234 -OUTER_SET anim_salfire = 59648 -OUTER_SET anim_salfrost = 59664 -OUTER_SET anim_shmound = 29442 -OUTER_SET anim_skeleton = 25603 -OUTER_SET anim_skeleton_fiend = 60192 -OUTER_SET anim_wwolf = 31491 -*/ - -ACTION_IF ee_game BEGIN // don't repeat if you don't have to - - OUTER_SET anim_beetle = 57888 // beetle - OUTER_SET anim_btroll = 57520 // iwd blue troll - OUTER_SET anim_eelem = 57931 // iwd earth elemental - OUTER_SET anim_felem = 57932 // iwd fire elemental - OUTER_SET anim_ghast = 58144 // greater ghast - OUTER_SET anim_ghost = 58112 // ghost - OUTER_SET anim_jzombie = 60928 // ju-ju zombie - OUTER_SET anim_lizman = 58640 // lizard man - OUTER_SET anim_shadow_lg = 59936 // iwd large shadow - OUTER_SET anim_uhulk = 57552 // iwd-style umber hulk - OUTER_SET anim_welem = 57933 // iwd water elemental - OUTER_SET anim_yeti = 57949 // yeti - -END ELSE BEGIN - - OUTER_SET anim_beetle = 0 - OUTER_SET anim_btroll = 32512 // sub bg2 troll - OUTER_SET anim_eelem = 29440 // sub bg2 earth elemental - OUTER_SET anim_felem = 29456 // sub bg2 fire elemental - OUTER_SET anim_ghast = 30466 // sub bg2 ghast - OUTER_SET anim_ghost = 30467 // sub bg2 shadow - OUTER_SET anim_jzombie = 32000 // sub regular zombie - OUTER_SET anim_lizman = 58624 // bg2 lacks alternative lizard man animation - OUTER_SET anim_shadow_lg = 30467 // sub bg2 shadow - OUTER_SET anim_uhulk = 32529 // sub bg2 umber hulk - OUTER_SET anim_welem = 61200 // sub bg2 water elemental - OUTER_SET anim_yeti = 0 - - // if infinity animations has added iwd animations, use them - ACTION_IF MOD_IS_INSTALLED ~INFINITYANIMATIONS/SETUP-INFINITYANIMATIONS.TP2~ ~400~ BEGIN // 'distinctive undead' - - ACTION_IF IDS_OF_SYMBOL (~animate~ ~GHAST_IWD~) > 0 THEN BEGIN - OUTER_SET anim_ghast = IDS_OF_SYMBOL (~animate~ ~GHAST_IWD~) - END - - ACTION_IF IDS_OF_SYMBOL (~animate~ ~ZOMBIE_YELLOW_IWD~) > 0 THEN BEGIN - OUTER_SET anim_jzombie = IDS_OF_SYMBOL (~animate~ ~ZOMBIE_YELLOW_IWD~) - END - - ACTION_IF IDS_OF_SYMBOL (~animate~ ~SHADOW_LARGE_IWD~) > 0 THEN BEGIN - OUTER_SET anim_shadow_lg = IDS_OF_SYMBOL (~animate~ ~SHADOW_LARGE_IWD~) - END - - ACTION_IF IDS_OF_SYMBOL (~animate~ ~GHOST_IWD~) > 0 THEN BEGIN - OUTER_SET anim_ghost = IDS_OF_SYMBOL (~animate~ ~GHOST_IWD~) - END - - END - - ACTION_IF MOD_IS_INSTALLED ~INFINITYANIMATIONS/SETUP-INFINITYANIMATIONS.TP2~ ~500~ BEGIN // 'more base animations' - - ACTION_IF IDS_OF_SYMBOL (~animate~ ~BEETLE_BLACK~) > 0 THEN BEGIN - OUTER_SET anim_beetle = IDS_OF_SYMBOL (~animate~ ~BEETLE_BLACK~) - END - - ACTION_IF IDS_OF_SYMBOL (~animate~ ~TROLL_BLUE~) > 0 THEN BEGIN - OUTER_SET anim_btroll = IDS_OF_SYMBOL (~animate~ ~TROLL_BLUE~) - END - - ACTION_IF IDS_OF_SYMBOL (~animate~ ~LIZARDMAN_GREEN~) > 0 THEN BEGIN - OUTER_SET anim_lizman = IDS_OF_SYMBOL (~animate~ ~LIZARDMAN_GREEN~) - END - - ACTION_IF IDS_OF_SYMBOL (~animate~ ~UMBERHULK_IWD~) > 0 THEN BEGIN - OUTER_SET anim_uhulk = IDS_OF_SYMBOL (~animate~ ~UMBERHULK_IWD~) - END - - END - - ACTION_IF MOD_IS_INSTALLED ~INFINITYANIMATIONS/SETUP-INFINITYANIMATIONS.TP2~ ~550~ BEGIN // 'more icewind dale animations' - - ACTION_IF IDS_OF_SYMBOL (~animate~ ~TUNDRA_YETI~) > 0 THEN BEGIN - OUTER_SET anim_yeti = IDS_OF_SYMBOL (~animate~ ~TUNDRA_YETI~) - END - - ACTION_IF IDS_OF_SYMBOL (~animate~ ~ELEMENTAL_EARTH_IWD~) > 0 THEN BEGIN - OUTER_SET anim_eelem = IDS_OF_SYMBOL (~animate~ ~ELEMENTAL_EARTH_IWD~) - END - - ACTION_IF IDS_OF_SYMBOL (~animate~ ~ELEMENTAL_FIRE_IWD~) > 0 THEN BEGIN - OUTER_SET anim_felem = IDS_OF_SYMBOL (~animate~ ~ELEMENTAL_FIRE_IWD~) - END - - ACTION_IF IDS_OF_SYMBOL (~animate~ ~ELEMENTAL_WATER~) > 0 THEN BEGIN - OUTER_SET anim_welem = IDS_OF_SYMBOL (~animate~ ~ELEMENTAL_WATER~) - END - - END - -END diff --git a/iwdification/lib/sr_nwn_spelldeflection.tpa b/iwdification/lib/sr_nwn_spelldeflection.tpa new file mode 100644 index 0000000..1da0519 --- /dev/null +++ b/iwdification/lib/sr_nwn_spelldeflection.tpa @@ -0,0 +1,85 @@ +DEFINE_ACTION_FUNCTION sr_nwn_spelldeflection + STR_VAR version="sr_nwn_arcane" +BEGIN + CLEAR_IDS_MAP + LAF read_in_assoc_array STR_VAR location=data file=~%version%.2da~ RET_ARRAY array END + ACTION_PHP_EACH array AS input=>r2 BEGIN + LAF get_spellcode STR_VAR input RET i2=value END // we have changed the ids, so don't trust stored variables + LAF sr_nwn_spelldeflection_core INT_VAR r2 STR_VAR i2 END + END +END + + + + + + + +DEFINE_ACTION_FUNCTION sr_nwn_spelldeflection_core /// basically taken direct from SR, other than the function wrapper + INT_VAR r2=1 + STR_VAR i2="" +BEGIN + OUTER_SET found=0 + OUTER_SPRINT letter ~d~ + ACTION_FOR_EACH char_check IN d e f g h i j k l m BEGIN + ACTION_IF found=0 BEGIN + ACTION_IF NOT FILE_EXISTS_IN_GAME ~%i2%%char_check%.spl~ BEGIN + OUTER_SET found=1 + OUTER_SPRINT letter ~%char_check%~ + END + END + END + + ACTION_IF found && r2 && (FILE_EXISTS_IN_GAME ~%i2%.spl~) BEGIN + COPY_EXISTING ~%i2%.spl~ ~override/%i2%%letter%.spl~ // cloning original into the secondary spell + WRITE_ASCII 0x8 ~~ (8) // clearing out the name + GET_OFFSET_ARRAY headers 0x64 4 0x68 2 0 0 0x28 + PHP_EACH headers AS i => r BEGIN + WRITE_SHORT (r+0x0c) 1 // target = creature + WRITE_SHORT (r+0x26) 1 // projectile = none + END + BUT_ONLY + + COPY_EXISTING ~%i2%.spl~ ~override~ // modifying the original + READ_LONG 0x34 level + READ_LONG 0x64 ab_off + READ_SHORT 0x68 ab_num + READ_LONG 0x6a ef_off + READ_SHORT 0x70 cast_num // global effects aka casting features + + total_eff=cast_num + FOR (i=0;i"opcode=233" // pointless cruft in IWD file + remove_items=>umberhlk + add_items=>"helmnoan umber01" + patch_item_inline=>"unstealable=>1 undroppable=>1" + swap_script=>"UHGAZE=>DW#UMBER GNSUMMM=>bdsum00" + dv=>ms7umber + xp_value=>0 + END + LAF edit_creature INT_VAR allow_missing=1 STR_VAR creature=MS7UMBH edits=patch_data END + LAF install STR_VAR file=dw#umber.baf location="%iwdspells_resource%" END + +//// Ettin - baseline is BG2 ettin + + ACTION_IF !FILE_EXISTS_IN_GAME "pettin.cre" BEGIN + COPY "%MOD_FOLDER%/%iwdspells_resource%/pettin.cre" override + SAY 0x8 @15 + SAY 0xc @15 + END + + MAKE_PATCH + allegiance=>controlled + gender=>summoned + dv=>ms7ettin + no_corpse=>1 + swap_script=>"wtasight=>bdsum00" + xp_value=>0 + END + LAF clone_creature INT_VAR allow_missing=1 STR_VAR creature="PETTIN=>DW#MS7ET" edits=patch_data END + + LAF make_summoning_2da STR_VAR monsters="MS7UMBH DW#MS7ET" filename=msummo7 END +END + +///////////////////////////////////////////////////// +//// MS6 +/////////////////////////////////////////////////// + + +ACTION_IF VARIABLE_IS_SET $IWD_spell_installed("WIZARD_MONSTER_SUMMONING_6") BEGIN + +/// Frost salamander - base is IWDEE's MS6 salamander but needs BG2-style aura etc + + MAKE_PATCH + delete_effect=>"opcode=233" + remove_items=>salfros + add_items=>"ring95 immune1 salgrice" + class=>ELEMENTAL_WATER // best match - no SALAMANDER class in BG2 + dv=>MS6salac + strip_script=>safrost + patch_item_inline=>"unstealable=>1 undroppable=>1" + add_proficiencies=>"spear=>2" + swap_script=>"gnsummm=>bdsum00" + xp_value=>0 + END + LAF edit_creature INT_VAR allow_missing=1 STR_VAR creature=MS6SALC edits=patch_data END + +//// Fire salamanader - ditto + + MAKE_PATCH + delete_effect=>"opcode=233" + add_item=>"ring95 immune1" + class=>ELEMENTAL_FIRE// best match - no SALAMANDER class in BG2 + dv=>MS6salaf + remove_items=>salfire + add_items=>salgrfir + strip_script=>safire + patch_item_inline=>"unstealable=>1 undroppable=>1" + add_proficiencies=>"spear=>2" + swap_script=>"gnsummm=>bdsum00" + xp_value=>0 + END + LAF edit_creature INT_VAR allow_missing=1 STR_VAR creature=MS6SALF edits=patch_data END + +//// giant troll - base is BG2 trolgi01 + + ACTION_IF !FILE_EXISTS_IN_GAME "trolgi01.cre" BEGIN + COPY "%MOD_FOLDER%/%iwdspells_resource%/trolgi01.cre" override + SAY 0x8 @17 + SAY 0xc @17 + END + + MAKE_PATCH + allegiance=>controlled + gender=>summoned + dv=>ms6gttrl + no_corpse=>1 + swap_script=>"wtasight=>bdsum00" + strip_script=>gensht01 + immunity_to_spell=>trollreg + remove_items=>monhp1 + xp_value=>0 + END + LAF clone_creature INT_VAR allow_missing=1 STR_VAR creature="trolgi01=>DW#MS6GT" edits=patch_data END + + LAF make_summoning_2da STR_VAR monsters="MS6SALC MS6SALF DW#MS6GT" filename=msummo6 END +END + +///////////////////////////////////////////////////// +//// MS5 +/////////////////////////////////////////////////// + +ACTION_IF VARIABLE_IS_SET $IWD_spell_installed("WIZARD_MONSTER_SUMMONING_5") BEGIN + + /// ordinary troll + + ACTION_IF !FILE_EXISTS_IN_GAME "troll01.cre" BEGIN + OUTER_SET troll_string=GAME_IS bgee ? 25772 : 3008 + COPY "%MOD_FOLDER%/%iwdspells_resource%/troll01.cre" override + WRITE_LONG 0x8 troll_string + WRITE_LONG 0xc troll_string + END + + MAKE_PATCH + allegiance=>controlled + gender=>summoned + dv=>ms5troll + no_corpse=>1 + immunity_to_spell=>trollreg + remove_items=>monhp1 + swap_script=>"wtatroll=>bdsum00" + xp_value=>0 + END + LAF clone_creature INT_VAR allow_missing=1 STR_VAR creature="troll01=>DW#MS5TR" edits=patch_data END + + /// minotaur + + MAKE_PATCH + delete_effect=>"opcode=233" + immunity_to_spell=>"%WIZARD_MAZE% %PSIONIC_MAZE%" + remove_items=>"s1-8m1" + add_items=>"ax1h01" + patch_item_inline=>"unstealable=>1 undroppable=>1" + add_proficiencies=>"axe=>2" + strength=>18 + str_ex=>100 + xp_value=>0 + swap_script=>"gnsummm=>bdsum00" + END + LAF edit_creature INT_VAR allow_missing=1 STR_VAR creature=ms5mino edits=patch_data END + + + LAF make_summoning_2da STR_VAR monsters="MS5MINO DW#MS5TR" filename=msummo5 END +END + +///////////////////////////////////////////////////// +//// MS4 +/////////////////////////////////////////////////// + +ACTION_IF VARIABLE_IS_SET $IWD_spell_installed("WIZARD_MONSTER_SUMMONING_4") BEGIN + + // ogre mage - based on unused monster-summon in BG2 + + ACTION_IF !FILE_EXISTS_IN_GAME "ogremasu.cre" BEGIN + COPY "%MOD_FOLDER%/%iwdspells_resource%/ogremasu.cre" override + END + + LAF ds_resolve_stat STR_VAR id=ITEM_MM RET stat_ind END + LAF ds_resolve_stat STR_VAR id=ITEM_MM_SEEN RET stat_ind END + LAF ds_resolve_stat STR_VAR id=DO_NOT_TARGET_SPELLS RET stat_ind END + LAF install STR_VAR file="ogremasu.baf" locbase="%iwdspells_resource%" END + + MAKE_PATCH + allegiance=>controlled + no_corpse=>1 + dv=>ms4ogrem + add_proficiencies=>"singleweapon=>2 bastardsword=>2" + remove_spells=>all + add_spells=>"MAGIC_MISSILE(2) BURNING_HANDS(2) MIRROR_IMAGE MELF_ACID_ARROW LIGHTNING_BOLT GHOST_ARMOR" + swap_script=>"wtasight=>bdsum00" + xp_value=>0 + END + LAF edit_creature INT_VAR allow_missing=1 STR_VAR creature=ogremasu edits=patch_data END + + /// yuan-ti + + ACTION_IF !FILE_EXISTS_IN_GAME "icyuan01.cre" BEGIN + COPY "%MOD_FOLDER%/%iwdspells_resource%/icyuan01.cre" override + SAY 0x8 @16 + SAY 0xc @16 + END + + MAKE_PATCH + allegiance=>controlled + gender=>summoned + dv=>ms5yuant + no_corpse=>1 + swap_script=>"wtasight=>bdsum00" + xp_value=>0 + END + LAF clone_creature INT_VAR allow_missing=1 STR_VAR creature="icyuan01=>DW#MS4YU" edits=patch_data END + + LAF make_summoning_2da STR_VAR monsters="OGREMASU DW#MS4YU" filename=msummo4 END +END + +///////////////////////////////////////////////////// +//// MS3 +/////////////////////////////////////////////////// + + +ACTION_IF VARIABLE_IS_SET $IWD_spell_installed("WIZARD_MONSTER_SUMMONING_3") BEGIN + + // ogre berserker + + MAKE_PATCH + add_spells=>BERSERKER_RAGE + enforce_class=>null + remove_items=>ogre1 + add_items=>blun06 + add_proficiencies=>"FLAILMORNINGSTAR=>2" + patch_item_inline=>"unstealable=>1 undroppable=>1" + insert_script_high=>"dw#msogr" + no_corpse=>1 + xp_value=>0 + END + LAF edit_creature INT_VAR allow_missing=1 STR_VAR creature=ogregrsu edits=patch_data END + LAF install STR_VAR file=dw#msogr.baf location="%iwdspells_resource%" END + + // hobgoblin elite + MAKE_PATCH + add_proficiencies=>"BASTARDSWORD=>2 LONGBOW=>2" + no_corpse=>1 + xp_value=>0 + END + LAF edit_creature INT_VAR allow_missing=1 STR_VAR creature=hobgobsu edits=patch_data END + + // ettercap + + MAKE_PATCH + no_corpse=>1 + xp_value=>0 + END + LAF edit_creature INT_VAR allow_missing=1 STR_VAR creature=ettercsu edits=patch_data END + + LAF make_summoning_2da STR_VAR monsters="OGREGRSU ETTERCSU HOBGOBSU" filename=msummo3 END + +END + +///////////////////////////////////////////////////// +//// MS2 +/////////////////////////////////////////////////// + + +ACTION_IF VARIABLE_IS_SET $IWD_spell_installed("WIZARD_MONSTER_SUMMONING_2") BEGIN + + // gnoll + + MAKE_PATCH + level=>3 + name1_string=>6627 + name2_string=>6627 + hitpoints=>24 + attacks=>1 + no_corpse=>1 + add_proficiencies=>"spear=>1" + xp_value=>0 + END + LAF edit_creature INT_VAR allow_missing=1 STR_VAR creature=gnollsu edits=patch_data END + + // ogrillon + + MAKE_PATCH + attacks=>1 + no_corpse=>1 + xp_value=>0 + END + LAF edit_creature INT_VAR allow_missing=1 STR_VAR creature=ogrelesu edits=patch_data END + + // lizard man + + MAKE_PATCH + xp_value=>0 + level=>3 + swap_script=>"gnsummm=>bdsum00" + END + LAF edit_creature INT_VAR allow_missing=1 STR_VAR creature=ms2lizm edits=patch_data END + COPY_EXISTING "#S1-12.itm" override WRITE_ASCII 0x22 QS + // ogre + + MAKE_PATCH + no_corpse=>1 + swap_script=>"gnsummm=>bdsum00" + END + LAF edit_creature INT_VAR allow_missing=1 STR_VAR creature=ogresu edits=patch_data END + + LAF make_summoning_2da STR_VAR monsters="MS2LIZM OGRELESU GNOLLSU OGRESU" filename=msummo2 END +END + +///////////////////////////////////////////////////// +//// MS1 +/////////////////////////////////////////////////// + +ACTION_IF VARIABLE_IS_SET $IWD_spell_installed("WIZARD_MONSTER_SUMMONING_1") BEGIN + + // install some BG2-only files if needed + + ACTION_IF !is_bg2 BEGIN + ACTION_DEFINE_ASSOCIATIVE_ARRAY bg2_crefiles BEGIN + orc01=>11 + orc02=>12 + hobwar01=>13 + hobarc01=>14 + END + + ACTION_PHP_EACH bg2_crefiles AS crefile=>name BEGIN + COPY "%MOD_FOLDER%/%iwdspells_resource%/%crefile%.cre" override + SAY 0x8 (AT "%name%") + SAY 0xc (AT "%name%") + END + END + + // goblins + + MAKE_PATCH + patch_item_inline=>"unstealable=>1 undroppable=>1" + xp_value=>0 + swap_script=>"gnsummm=>bdsum00" + swap_script'=>"gnsummb=>bdsum00" + END + LAF edit_creature INT_VAR allow_missing=1 STR_VAR creature="ms1goba ms1gobm" edits=patch_data END + + // hobgoblins + + MAKE_PATCH + gender=>summoned + no_corpse=>1 + class=>hobgoblin + allegiance=>controlled + xp_value=>0 + dv=>ms1hobgo + strip_script=>"gensht01 hgarch01 hgwarr01" + swap_script=>"wtasight=>bdsum00" + patch_item_inline=>"unstealable=>1 undroppable=>1" + END + LAF clone_creature INT_VAR allow_missing=1 STR_VAR creature="hobwar01=>dw#ms1hw hobarc01=>dw#ms1ha" edits=patch_data END + + // orc archer + MAKE_PATCH + gender=>summoned + level=>1 + hitpoints=>8 + thac0=>20 + attacks=>1 + no_corpse=>1 + allegiance=>controlled + xp_value=>0 + dv=>ms1orcar + strip_script=>"gensht01 oarch02" + swap_script=>"wtasight=>bdsum00 wtarsgt=>bdsum00" + animation_code=>59408 + remove_items=>rndtre03 + patch_item_inline=>"unstealable=>1 undroppable=>1" + patch_item_inline'=>"match=>~resource=arow02~ resource=>arow01" + enforce_saves=>null + END + LAF clone_creature INT_VAR allow_missing=1 STR_VAR creature="orc02=>dw#ms1oa" edits=patch_data END + + // orc warrior + MAKE_PATCH + gender=>summoned + level=>1 + hitpoints=>8 + thac0=>20 + attacks=>1 + no_corpse=>1 + allegiance=>controlled + xp_value=>0 + dv=>ms1orcwa + strip_script=>"gensht01 orcwar" + swap_script=>"wtasight=>bdsum00 wtarsgt=>bdsum00" + remove_items=>rndtre03 + patch_item_inline=>"unstealable=>1 undroppable=>1" + enforce_saves=>null + END + LAF clone_creature INT_VAR allow_missing=1 STR_VAR creature="orc01=>dw#ms1ow" edits=patch_data END + + LAF make_summoning_2da STR_VAR monsters="DW#MS1OW DW#MS1OA DW#MS1HW DW#MS1HA MS1GOBA MS1GOBM" filename=msummo1 END +END + +///////////////////////////////////////////////////// +//// global - handle breakable items +/////////////////////////////////////////////////// + +ACTION_IF GAME_IS BGEE BEGIN + +COPY_EXISTING hamm01.spl override // missing effect here + LPF DELETE_EFFECT INT_VAR match_opcode=318 match_parameter2=136 END + LPF ADD_SPELL_EFFECT INT_VAR insert_point=0 opcode=318 target=2 parameter1=6 parameter2=136 duration=1 END + +ACTION_FOR_EACH spell IN +sw1h01 +sw1h04 +sw1h07 +sw1h12 +sw1h17 +sw1h20 +sw1h21 +sw2h01 +sw2h01b +ax1h01 +dagg01 +dagg06 +dagg07 +halb01 +hamm01 +sper01 +blun02 +blun04 +blun06 +blun08 +BEGIN + ACTION_IF FILE_EXISTS_IN_GAME "%spell%.spl" BEGIN + COPY_EXISTING "%spell%.spl" override + LPF DELETE_EFFECT INT_VAR match_opcode=318 match_parameter2=107 END + LPF CLONE_EFFECT INT_VAR match_opcode=318 match_parameter2=136 parameter2=107 parameter1=6 END + BUT_ONLY + END +END +END + + +///////////////////////////////////////////////////// +//// shadow summons +/////////////////////////////////////////////////// + +ACTION_IF VARIABLE_IS_SET $IWD_spell_installed("WIZARD_SHADES") BEGIN + + // the shadow umber hulk needs BGification + + MAKE_PATCH + remove_items=>umberhlk + add_items=>"helmnoan umber01" + patch_item_inline=>"unstealable=>1 undroppable=>1" + swap_script=>"UHGAZE=>DW#UMBER GNSUMMM=>bdsum00" + xp_value=>0 + END + LAF edit_creature INT_VAR allow_missing=1 STR_VAR creature="SS3UMB8 SS3UMB9" edits=patch_data END + + // the shadow lizard men need visible weapons + + ACTION_FOR_EACH lizard IN ss2liz5 ss2liz6 ss2liz7 ss1liz3 ss1liz4 BEGIN + COPY_EXISTING "%lizard%.cre" override + REPLACE_TEXTUALLY "[BS]1-12" "#S1-12" (8) + BUT_ONLY + END + +END + +///////////////////////////////////////////////////// +//// misc +/////////////////////////////////////////////////// + + + // everything needs BD scripts + + MAKE_PATCH + xp_value=>0 + swap_script=>"GNSUMMM=>bdsum00" + END + LAF edit_creature INT_VAR allow_missing=1 STR_VAR creature="SUMSHAD SS1GOB1 SS1GOB2 SS1GOB3 SS1LIZ3 SS1LIZ4 SS1TRL6 SS1TRL7 SS1TRL8 SS2GOB1 SS2GOB2 SS2GOB3 SS2LIZ5 SS2LIZ6 SS2LIZ7 SS3TRL7 SS3TRL8" edits=patch_data END // Summon Shadow + LAF edit_creature INT_VAR allow_missing=1 STR_VAR creature="ES8WATR ES8FIRE ES8ERTH ES8AIR" edits=patch_data END // elementals + LAF edit_creature INT_VAR allow_missing=1 STR_VAR creature="AD3SKLM" edits=patch_data END // soul eater + + // L5 elementals need to be small (no easy way to do for water elementals) + + LAF edit_creature INT_VAR allow_missing=1 STR_VAR creature=ES8FIRE editstring="animation=>elemental_fire_small" END + LAF edit_creature INT_VAR allow_missing=1 STR_VAR creature=ES8ERTH editstring="animation=>elemental_earth_small" END + LAF edit_creature INT_VAR allow_missing=1 STR_VAR creature=ES8AIR editstring="animation=>elemental_air_small" END + +END + +DEFINE_ACTION_FUNCTION summoned_monsters_divine BEGIN + +///////////////////////////////////////////////////// +//// shamblers - put on a more standard format +/////////////////////////////////////////////////// + +ACTION_IF VARIABLE_IS_SET $IWD_spell_installed("CLERIC_STALKER") BEGIN + + LAF clone_effect STR_VAR effect="SPEART1P=>DW#SHAMB" editstring="resource=>SSHAMB" END + + MAKE_PATCH + match=>"opcode=67" + opcode=>177 + target=>1 + parameter2=>2 + duration=>2400 + resource=>DW#SHAMB + END + LAF edit_spell STR_VAR spell="%CLERIC_STALKER%" editstring="patch_effect=>patch_data" END + + MAKE_PATCH + allegiance=>controlled + swap_script=>"EFATKMEL=>bdsum00" + END + LAF edit_creature INT_VAR allow_missing=1 STR_VAR creature=SSHAMB edits=patch_data END +END + + +///////////////////////////////////////////////////// +//// giant insect - just map over to new scripts +/////////////////////////////////////////////////// + +ACTION_IF VARIABLE_IS_SET $IWD_spell_installed("CLERIC_GIANT_INSECT") BEGIN + + MAKE_PATCH + xp_value=>0 + swap_script=>"GNSUMMM=>bdsum00" + END + LAF edit_creature INT_VAR allow_missing=1 STR_VAR creature="GISBOMB GISBORB" edits=patch_data END +END + + +END + +<<<<<<<< .../stratagems-inline/summon_template.2da +2DA V1.0 +0 + RESREF Hit AreaHitAnimation +>>>>>>>> + +DEFINE_ACTION_FUNCTION make_summoning_2da + STR_VAR filename="" + monsters="" + anim_hit="msumm1h" + anim_area="msumm1x" +BEGIN + COPY ".../stratagems-inline/summon_template.2da" "override/%filename%.2da" + OUTER_SET counter=1 + OUTER_WHILE "%monsters%" STRING_COMPARE "" BEGIN + LAF return_first_entry STR_VAR list="%monsters%" RET entry monsters=list END + APPEND "%filename%.2da" "%counter% %entry% %anim_hit% %anim_area%" + OUTER_SET counter +=1 + END +END diff --git a/iwdification/notes_for_dw.txt b/iwdification/notes_for_dw.txt new file mode 100644 index 0000000..f4e1508 --- /dev/null +++ b/iwdification/notes_for_dw.txt @@ -0,0 +1,84 @@ +Alright, so the basic idea is this: + +Each component has some late INCLUDEs in the various postproduction tpa files. + * One includes a tpa for additional functions + * One includes the code for de-EE-ification and misc fixes + * The arcane and divine components also cross-patch one another in a third include. + +These are INCLUDEd within the postproduction instead of the tp2 so that they can use +all of the vars defined in the main install_iwd_spell_resources function when the +spells are installed, e.g. WIZARD_ANTIMAGIC_SHELL. I've tried to patch to future-proof +against IWDEE releases, but in a few cases (notably Shroud of Flame) I'm forced to +directly insert new resources. + +I've stayed out of the /dw_iwdspells_resource except for one, absolutely needed change: +I did a search-and-replace in isdwpells.tra to replace em-dashes with normal dashes. +The former just get corrupted when used in oBG2. + +For the most part I've tried to stay out of the /lib folder; all resources and +includes are in this obg2_res folder. Define the path in the tp2 and you're good to go: + + OUTER_SPRINT obg2_res_path ~iwdification/obg2_res~ + +Changes I've had to make to the /lib folder are documented below: + +always.tph + Removed the EE/FAIL check right at the top and the EE check for DS installation + (install otherwise fails as a DS function gets invoked). + +elemental_summoning.tpa + Adjusted GAME_IS check around line 27 as it would use BG string values for oBG2. + Also ran the EFF swap through an ALTER_EFFECT because the text replacement wasn't + catching the higher-level spair2 and spair3 references. + +install_iwd_spell_resources.tpa + Added new iwdification_extra variable that will scatter spell scrolls throughout the + game and add a few arcane spells to joinable NPC spellbooks. Default is zero and is + used solely to include scroll_placement.tpa. + +arcane_spells_postproduction.tpa + Inserted the INCLUDEs as noted above. + +bardsong_spells_postproduction.tpa + Inserted the INCLUDEs as noted above. fjbard.spl is from an optional Fixpack + component, so I've added a file existance check around line 6. Similarly, + clastext.2da is also an EE-only resource, so I hardcode the oBG2 bard + class description around line 29 and then pull the various kit descriptions + from kitlist.2da instead of clastext; this required a little re-jiggering of + the patching. + +divine_spells_postproduction.tpa + Inserted the INCLUDEs as noted above. The hidespl APPENDs are now gated on + EE-game checks. + +tp2 + I outright remove the spells that won't work on oBG2 by creating an alternate + X_resrefs_obg2.txt and handing that to the function instead. Ideally, this would go into + weidu_external so as to preserve immutability, but the function hardcodes the path partially: + trying to hand off spell_list=EVAL ~weidu_external/%scsroot%/arcane_resrefs_obg2.txt~ will + cause it to fail as it looks for ~%resource_loc%/weidu_external/%scsroot%/arcane_resrefs_obg2.txt~. + + The hotkey routine gets gated behind an EE check since it has no relvance for oBG2. + + Scripting is another issue; in the arcane component you can see where I try to work around + the EE-only scripting. ogremasu.baf in particular also looks like it's been SCS-ized. Rather + than trying to reverse SSL, I just copy over the default ogremasu from oBG2. + +data/scroll_prices_arcane.txt + The following price adjustments were made to the scrolls: + * Snilloc's Snowball Swarm 900 > 300 - other level 2 scrolls range 200-300 + * Icelance 900 > 400 - other level 3 scrolls range 300-400 + * Lance of Disruption 600 > 400 - other level 3 scrolls range 300-400 + * Emotion, Hope - 600 > 500 - level 4 scrolls are 400-500 + * Shout - 1200 > 500 - level 4 scrolls are 400-500 + * Vitriolic Sphere - 1600 > 500 - level 4 scrolls are 400-500 + * Shadow Monsters - 1200 > 500 - level 4 scrolls are 400-500 + * All level 5 spells - 1500 > 1000 - All others, save two, are 1000 + * All level 6 spells - 600 to 1800 > 2000 - All others are 2000 + * All level 7 spells - 700 to 2100 > 3000 - All others are 3000 + * All level 8 spells - 800 to 2400 > 5000 - All others are 5000 + * Monster Summoning VI - 2700 > 5000 - All others are 5k, 10k save Freedom + +data/scroll_prices_divine.txt + Adjusted Symbol, Pain from 700 to 3000 to bring it inline with others. + \ No newline at end of file diff --git a/iwdification/obg2_res/abjurax.bam b/iwdification/obg2_res/abjurax.bam new file mode 100644 index 0000000..f0d3ef4 Binary files /dev/null and b/iwdification/obg2_res/abjurax.bam differ diff --git a/iwdification/obg2_res/abjurh.bam b/iwdification/obg2_res/abjurh.bam new file mode 100644 index 0000000..b9b21e6 Binary files /dev/null and b/iwdification/obg2_res/abjurh.bam differ diff --git a/iwdification/obg2_res/abjurh_ee.bam b/iwdification/obg2_res/abjurh_ee.bam new file mode 100644 index 0000000..b4b563f Binary files /dev/null and b/iwdification/obg2_res/abjurh_ee.bam differ diff --git a/iwdification/obg2_res/acidh.bam b/iwdification/obg2_res/acidh.bam new file mode 100644 index 0000000..f4958e3 Binary files /dev/null and b/iwdification/obg2_res/acidh.bam differ diff --git a/iwdification/obg2_res/acidh.vvc b/iwdification/obg2_res/acidh.vvc new file mode 100644 index 0000000..e3ae47c Binary files /dev/null and b/iwdification/obg2_res/acidh.vvc differ diff --git a/iwdification/obg2_res/acidh_ee.bam b/iwdification/obg2_res/acidh_ee.bam new file mode 100644 index 0000000..3acc315 Binary files /dev/null and b/iwdification/obg2_res/acidh_ee.bam differ diff --git a/iwdification/obg2_res/aft_m04.wav b/iwdification/obg2_res/aft_m04.wav new file mode 100644 index 0000000..cde4e86 Binary files /dev/null and b/iwdification/obg2_res/aft_m04.wav differ diff --git a/iwdification/obg2_res/aft_m15.wav b/iwdification/obg2_res/aft_m15.wav new file mode 100644 index 0000000..e58d106 Binary files /dev/null and b/iwdification/obg2_res/aft_m15.wav differ diff --git a/iwdification/obg2_res/aft_m16.wav b/iwdification/obg2_res/aft_m16.wav new file mode 100644 index 0000000..6c1ba69 Binary files /dev/null and b/iwdification/obg2_res/aft_m16.wav differ diff --git a/iwdification/obg2_res/aft_m17.wav b/iwdification/obg2_res/aft_m17.wav new file mode 100644 index 0000000..83a921f Binary files /dev/null and b/iwdification/obg2_res/aft_m17.wav differ diff --git a/iwdification/obg2_res/aft_m18.wav b/iwdification/obg2_res/aft_m18.wav new file mode 100644 index 0000000..611d028 Binary files /dev/null and b/iwdification/obg2_res/aft_m18.wav differ diff --git a/iwdification/obg2_res/aft_p03.wav b/iwdification/obg2_res/aft_p03.wav new file mode 100644 index 0000000..9ca035d Binary files /dev/null and b/iwdification/obg2_res/aft_p03.wav differ diff --git a/iwdification/obg2_res/aft_p20.wav b/iwdification/obg2_res/aft_p20.wav new file mode 100644 index 0000000..ebcc3ea Binary files /dev/null and b/iwdification/obg2_res/aft_p20.wav differ diff --git a/iwdification/obg2_res/aft_p21.wav b/iwdification/obg2_res/aft_p21.wav new file mode 100644 index 0000000..af1150c Binary files /dev/null and b/iwdification/obg2_res/aft_p21.wav differ diff --git a/iwdification/obg2_res/aft_p25.wav b/iwdification/obg2_res/aft_p25.wav new file mode 100644 index 0000000..e494b9d Binary files /dev/null and b/iwdification/obg2_res/aft_p25.wav differ diff --git a/iwdification/obg2_res/aft_p26.wav b/iwdification/obg2_res/aft_p26.wav new file mode 100644 index 0000000..d329819 Binary files /dev/null and b/iwdification/obg2_res/aft_p26.wav differ diff --git a/iwdification/obg2_res/alancet.bam b/iwdification/obg2_res/alancet.bam new file mode 100644 index 0000000..5126dc0 Binary files /dev/null and b/iwdification/obg2_res/alancet.bam differ diff --git a/iwdification/obg2_res/alterh.bam b/iwdification/obg2_res/alterh.bam new file mode 100644 index 0000000..0ca08af Binary files /dev/null and b/iwdification/obg2_res/alterh.bam differ diff --git a/iwdification/obg2_res/amshelc.bam b/iwdification/obg2_res/amshelc.bam new file mode 100644 index 0000000..b2f8054 Binary files /dev/null and b/iwdification/obg2_res/amshelc.bam differ diff --git a/iwdification/obg2_res/area1x.bam b/iwdification/obg2_res/area1x.bam new file mode 100644 index 0000000..6c98450 Binary files /dev/null and b/iwdification/obg2_res/area1x.bam differ diff --git a/iwdification/obg2_res/area4x.bam b/iwdification/obg2_res/area4x.bam new file mode 100644 index 0000000..dbdc237 Binary files /dev/null and b/iwdification/obg2_res/area4x.bam differ diff --git a/iwdification/obg2_res/astorma.bam b/iwdification/obg2_res/astorma.bam new file mode 100644 index 0000000..408ef3a Binary files /dev/null and b/iwdification/obg2_res/astorma.bam differ diff --git a/iwdification/obg2_res/astormx.bam b/iwdification/obg2_res/astormx.bam new file mode 100644 index 0000000..dfcb340 Binary files /dev/null and b/iwdification/obg2_res/astormx.bam differ diff --git a/iwdification/obg2_res/asumm1x.bam b/iwdification/obg2_res/asumm1x.bam new file mode 100644 index 0000000..4bfd7e2 Binary files /dev/null and b/iwdification/obg2_res/asumm1x.bam differ diff --git a/iwdification/baf/baldur.baf b/iwdification/obg2_res/baldur.baf similarity index 95% rename from iwdification/baf/baldur.baf rename to iwdification/obg2_res/baldur.baf index 7932d93..4226c59 100644 --- a/iwdification/baf/baldur.baf +++ b/iwdification/obg2_res/baldur.baf @@ -1,15 +1,15 @@ -IF - Global("CDIZOSA","GLOBAL",1) -THEN - RESPONSE #100 - SetGlobalTimer("CDIZOSAREBOOT","GLOBAL",6) - SetGlobal("CDIZOSA","GLOBAL",2) -END - -IF - Global("CDIZOSA","GLOBAL",2) - GlobalTimerExpired("CDIZOSAREBOOT","GLOBAL") -THEN - RESPONSE #100 - SetGlobal("CDIZOSA","GLOBAL",0) +IF + Global("CDIZOSA","GLOBAL",1) +THEN + RESPONSE #100 + SetGlobalTimer("CDIZOSAREBOOT","GLOBAL",6) + SetGlobal("CDIZOSA","GLOBAL",2) +END + +IF + Global("CDIZOSA","GLOBAL",2) + GlobalTimerExpired("CDIZOSAREBOOT","GLOBAL") +THEN + RESPONSE #100 + SetGlobal("CDIZOSA","GLOBAL",0) END \ No newline at end of file diff --git a/iwdification/obg2_res/blessh.bam b/iwdification/obg2_res/blessh.bam new file mode 100644 index 0000000..5a2b9d0 Binary files /dev/null and b/iwdification/obg2_res/blessh.bam differ diff --git a/iwdification/obg2_res/cast.eff b/iwdification/obg2_res/cast.eff new file mode 100644 index 0000000..46f8e85 Binary files /dev/null and b/iwdification/obg2_res/cast.eff differ diff --git a/iwdification/obg2_res/ccdamah.bam b/iwdification/obg2_res/ccdamah.bam new file mode 100644 index 0000000..1f7f6aa Binary files /dev/null and b/iwdification/obg2_res/ccdamah.bam differ diff --git a/iwdification/baf/cdi3sklm.baf b/iwdification/obg2_res/cd3sklm.baf similarity index 100% rename from iwdification/baf/cdi3sklm.baf rename to iwdification/obg2_res/cd3sklm.baf diff --git a/iwdification/obg2_res/cd_arcane_post.tpa b/iwdification/obg2_res/cd_arcane_post.tpa new file mode 100644 index 0000000..9ac0190 --- /dev/null +++ b/iwdification/obg2_res/cd_arcane_post.tpa @@ -0,0 +1,1230 @@ +/* +//temp for when testing this as a standalone file +OUTER_SPRINT spell_list arcane_resrefs.txt + +OUTER_SPRINT WIZARD_SNILLOCS_SNOWBALL_SWARM SPWI225 +OUTER_SPRINT WIZARD_DECASTAVE SPWI226 +OUTER_SPRINT WIZARD_ICELANCE SPWI323 +OUTER_SPRINT WIZARD_LANCE_OF_DISRUPTION SPWI327 +OUTER_SPRINT WIZARD_BELTYNS_BURNING_BLOOD SPWI422 +OUTER_SPRINT WIZARD_EMOTION_COURAGE SPWI426 +OUTER_SPRINT WIZARD_EMOTION_HOPE SPWI427 +OUTER_SPRINT WIZARD_EMOTION_FEAR SPWI428 +OUTER_SPRINT WIZARD_EMOTION_HOPELESSNESS SPWI411 +OUTER_SPRINT WIZARD_VITRIOLIC_SPHERE SPWI429 +OUTER_SPRINT WIZARD_SHROUD_OF_FLAME SPWI524 +OUTER_SPRINT WIZARD_OTILUKES_FREEZING_SPHERE SPWI626 +OUTER_SPRINT WIZARD_DARTS_OF_BONE SPWI627 +OUTER_SPRINT WIZARD_TROLLISH_FORTITUDE SPWI628 +OUTER_SPRINT WIZARD_ACID_STORM SPWI706 +OUTER_SPRINT WIZARD_SUFFOCATE SPWI724 +OUTER_SPRINT WIZARD_MIND_BLANK SPWI806 +OUTER_SPRINT WIZARD_IRON_BODY SPWI819 +OUTER_SPRINT WIZARD_SUMMON_SHADOW SPWI525 +OUTER_SPRINT WIZARD_MONSTER_SUMMONING_4 SPWI610 +OUTER_SPRINT WIZARD_MONSTER_SUMMONING_7 SPWI904 +OUTER_SPRINT WIZARD_MONSTER_SUMMONING_6 SPWI820 +OUTER_SPRINT WIZARD_MONSTER_SUMMONING_5 SPWI725 +OUTER_SPRINT WIZARD_MONSTER_SUMMONING_1 SPWI309 +OUTER_SPRINT WIZARD_MONSTER_SUMMONING_2 SPWI407 +OUTER_SPRINT WIZARD_MONSTER_SUMMONING_3 SPWI504 +OUTER_SPRINT WIZARD_CONJURE_LESSER_EARTH_ELEMENTAL SPWI521 +OUTER_SPRINT WIZARD_CONJURE_LESSER_FIRE_ELEMENTAL SPWI516 +OUTER_SPRINT WIZARD_CONJURE_LESSER_AIR_ELEMENTAL SPWI520 +OUTER_SPRINT WIZARD_CONJURE_LESSER_WATER_ELEMENTAL SPWI526 +OUTER_SPRINT WIZARD_MORDENKAINENS_SWORD_IWD SPWI726 +OUTER_SPRINT WIZARD_EXPEDITIOUS_RETREAT SPWI126 +OUTER_SPRINT WIZARD_SHADOW_MONSTERS SPWI430 +OUTER_SPRINT WIZARD_DEMI_SHADOW_MONSTERS SPWI527 +OUTER_SPRINT WIZARD_ANTIMAGIC_SHELL SPWI629 +OUTER_SPRINT WIZARD_LICH_TOUCH SPWI630 +OUTER_SPRINT WIZARD_SHADES SPWI631 +OUTER_SPRINT WIZARD_MALAVONS_RAGE SPWI727 +OUTER_SPRINT WIZARD_CONJURE_FIRE_ELEMENTAL SPWI620 +OUTER_SPRINT WIZARD_CONJURE_AIR_ELEMENTAL SPWI621 +OUTER_SPRINT WIZARD_CONJURE_EARTH_ELEMENTAL SPWI622 +OUTER_SPRINT WIZARD_CONJURE_WATER_ELEMENTAL SPWI632 +OUTER_SPRINT WIZARD_MORDENKAINENS_SWORD SPWI716 +OUTER_SPRINT WIZARD_CATS_GRACE SPWI227 +OUTER_SPRINT WIZARD_SHOUT SPWI430 +OUTER_SPRINT WIZARD_GREAT_SHOUT SPWI819 +OUTER_SPRINT WIZARD_MORDENKAINENS_FORCE_MISSILES SPWI429 +*/ + +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +///// \\\\\ +///// first, some legit post-process fixes \\\\\ +///// \\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ + +OUTER_SET num_cwe = ((IDS_OF_SYMBOL (~spell~ ~WIZARD_CONJURE_WATER_ELEMENTAL~)) - 2000) + +// missing resources +COPY_EXISTING ~%WIZARD_CONJURE_LESSER_WATER_ELEMENTAL%a.bam~ ~override/spwi%num_cwe%a.bam~ // make lesser bams > normal + ~%WIZARD_CONJURE_LESSER_WATER_ELEMENTAL%b.bam~ ~override/spwi%num_cwe%b.bam~ + ~%WIZARD_CONJURE_LESSER_WATER_ELEMENTAL%c.bam~ ~override/spwi%num_cwe%c.bam~ + +COPY_EXISTING ~spwi%num_cwe%.spl~ ~override~ // assign new bams + WRITE_ASCIIE 0x3a ~spwi%num_cwe%c~ #8 + LPF ALTER_SPELL_HEADER STR_VAR icon = EVAL ~spwi%num_cwe%b~ END + +COPY_EXISTING ~%WIZARD_CONJURE_WATER_ELEMENTAL_SCROLL%.itm~ ~override~ // assign new bams + WRITE_ASCIIE 0x3a ~spwi%num_cwe%a~ #8 + LPF ALTER_ITEM_HEADER STR_VAR icon = EVAL ~spwi%num_cwe%a~ END + IF_EXISTS // not present in bgee + +COPY ~%obg2_res_path%/aft_m04.wav~ ~override~ // for antimagic shell + ~%obg2_res_path%/aft_m18.wav~ ~override~ // for suffocate + ~%obg2_res_path%/eff_m107.wav~ ~override~ // for otiluke's freezing sphere + ~%obg2_res_path%/tra_18.wav~ ~override~ // for snilloc projectile, idpro217 + ~%obg2_res_path%/spwi516a.bam~ ~override~ // conjure lesser fire elemental + ~%obg2_res_path%/spwi516b.bam~ ~override~ + ~%obg2_res_path%/spwi516c.bam~ ~override~ + ~%obg2_res_path%/spwi520a.bam~ ~override~ // conjure lesser air elemental + ~%obg2_res_path%/spwi520b.bam~ ~override~ + ~%obg2_res_path%/spwi520c.bam~ ~override~ + ~%obg2_res_path%/spwi521a.bam~ ~override~ // conjure lesser earth elemental + ~%obg2_res_path%/spwi521b.bam~ ~override~ + ~%obg2_res_path%/spwi521c.bam~ ~override~ + ~%obg2_res_path%/clwatera.bam~ ~override/%WIZARD_CONJURE_LESSER_WATER_ELEMENTAL%a.bam~ // conjure lesser water elemental + ~%obg2_res_path%/clwaterb.bam~ ~override/%WIZARD_CONJURE_LESSER_WATER_ELEMENTAL%b.bam~ + ~%obg2_res_path%/clwaterc.bam~ ~override/%WIZARD_CONJURE_LESSER_WATER_ELEMENTAL%c.bam~ + ~%obg2_res_path%/spwi601a.bam~ ~override~ // green invisible stalker + ~%obg2_res_path%/spwi601b.bam~ ~override~ + ~%obg2_res_path%/spwi601c.bam~ ~override~ + +// old iwd resources +COPY_EXISTING ~%WIZARD_EXPEDITIOUS_RETREAT%.spl~ ~override~ + LPF DELETE_EFFECT INT_VAR match_opcode = 206 STR_VAR match_resource = spin146 END // blocking old slow innate + +COPY_EXISTING ~%WIZARD_EMOTION_HOPE%.spl~ ~override~ + LPF DELETE_EFFECT INT_VAR match_opcode = 321 STR_VAR match_resource = ~##in115~ END // blocking mournful wail + LPF DELETE_EFFECT INT_VAR match_opcode = 321 STR_VAR match_resource = ~##pr716~ END // blocking CLERIC_SYMBOL_HOPELESSNESS + +COPY_EXISTING ~%WIZARD_IRON_BODY%.spl~ ~override~ + PATCH_FOR_EACH res IN ~##wi904~ ~##wi035~ ~##wi030~ ~##in143~ ~##pr736~ ~##pr424~ ~##pr423~ ~##pr326~ BEGIN + LPF DELETE_EFFECT INT_VAR match_opcode = 318 STR_VAR match_resource = EVAL ~%res%~ END + END + LPF ALTER_EFFECT INT_VAR match_opcode = 318 STR_VAR match_resource = spwi726 resource = EVAL ~%WIZARD_SUFFOCATE%~ END + LPF ALTER_EFFECT INT_VAR match_opcode = 318 STR_VAR match_resource = spwi422 resource = EVAL ~%WIZARD_BELTYNS_BURNING_BLOOD%~ END + +COPY_EXISTING ~%WIZARD_ANTIMAGIC_SHELL%.spl~ ~override~ + PATCH_FOR_EACH res IN sppr738 sppr736 spwi631 sppr617 sppr519 sppr428 sppr427 sppr426 sppr419 sppr420 sppr423 sppr326 sppr324 BEGIN + LPF DELETE_EFFECT INT_VAR match_opcode = 206 STR_VAR match_resource = EVAL ~%res%~ END + END + LPF ALTER_EFFECT INT_VAR match_opcode = 206 STR_VAR match_resource = spwi726 resource = EVAL ~%WIZARD_SUFFOCATE%~ END + LPF ALTER_EFFECT INT_VAR match_opcode = 206 STR_VAR match_resource = spwi724 resource = EVAL ~%WIZARD_ACID_STORM%~ END + PATCH_IF VARIABLE_IS_SET $IWD_spell_installed("WIZARD_SOUL_EATER") BEGIN + LPF CLONE_EFFECT INT_VAR match_opcode = 206 STR_VAR match_resource = spwi911 resource = EVAL ~%WIZARD_SOUL_EATER%~ END + END + LPF ALTER_EFFECT INT_VAR match_opcode = 206 STR_VAR match_resource = spwi524 resource = EVAL ~%WIZARD_SHROUD_OF_FLAME%~ END + LPF ALTER_EFFECT INT_VAR match_opcode = 206 STR_VAR match_resource = spwi432 resource = EVAL ~%WIZARD_VITRIOLIC_SPHERE%~ END + +COPY_EXISTING ~%WIZARD_MIND_BLANK%.spl~ ~override~ + PATCH_FOR_EACH res IN sppr422 sppr716 BEGIN // blood rage, symbol hopelessness + LPF DELETE_EFFECT INT_VAR match_opcode = 206 STR_VAR match_resource = EVAL ~%res%~ END + END + +// scrolls still using IWD's opposition schools, not BG's +COPY_EXISTING_REGEXP GLOB ~^cdia[1-9][0-4][0-9]\.itm$~ ~override~ + READ_ASCII 0xf6 spell // abusing that the scrolls are static + PATCH_IF FILE_EXISTS_IN_GAME ~%spell%.spl~ BEGIN + INNER_ACTION BEGIN + COPY_EXISTING ~%spell%.spl~ ~override~ + READ_BYTE 0x1e kits1 + READ_BYTE 0x1f kits2 + SET kit_flags1 = (kits1 & 0b11000000) // sets bits 0-5 to zero (leaves abjurer, conjurer) + SET kit_flags2 = (kits2 & 0b01111111) // sets bit 7 to zero (leaves other kits, generalist) + BUT_ONLY + END // inner_action + WRITE_BYTE 0x2d ((THIS & 0b10000000) BOR kit_flags2) // clear existing, copy from item + WRITE_BYTE 0x2f ((THIS & 0b00111111) BOR kit_flags1) // clear existing, copy from item + END + BUT_ONLY + +// make sure summons have default scripting, don't drop items at a minimum +OUTER_SPRINT default wtasight +ACTION_IF FILE_EXISTS_IN_GAME bdsum00.bcs BEGIN OUTER_SPRINT default bdsum00 END // use ee's bdsum00 if available + +// build array of new summons; delete 2nd & 3rd columns for oBG2 summon tables, graphics will be specified as 215s in spells +ACTION_CLEAR_ARRAY cd_monster_summoning_script +COPY_EXISTING ~caelemw.2da~ ~override~ // conjure lesser air elemental + ~ceelemw.2da~ ~override~ // conjure lesser earth elemental + ~cfelemw.2da~ ~override~ // conjure lesser fire elemental + ~cwelemw.2da~ ~override~ // conjure lesser water elemental + ~dsmonst.2da~ ~override~ // demi-shadow monsters + ~msummo1.2da~ ~override~ // monster summoning i + ~msummo2.2da~ ~override~ // monster summoning ii + ~msummo3.2da~ ~override~ // monster summoning iii + ~msummo4.2da~ ~override~ // monster summoning iv + ~msummo5.2da~ ~override~ // monster summoning v + ~msummo6.2da~ ~override~ // monster summoning vi + ~msummo7.2da~ ~override~ // monster summoning vii + ~shades.2da~ ~override~ // shades + ~smonste.2da~ ~override~ // shadow monsters + ~sshadow.2da~ ~override~ // summon shadow + COUNT_2DA_ROWS 4 rows + FOR (index = 0 ; index < rows ; ++index) BEGIN + READ_2DA_ENTRY index 1 4 file + DEFINE_ASSOCIATIVE_ARRAY cd_monster_summoning_script BEGIN ~%file%~ => ~%default%~ END + END + PATCH_IF !enhanced_edition BEGIN + REPLACE_TEXTUALLY ~[ %TAB%]+Hit\(Animation\)?[ %TAB%]+AreaHitAnimation~ ~~ + REPLACE_TEXTUALLY ~^\([0-9]+[ %TAB%]+[^ %TAB%]+\)[ %TAB%].+$~ ~\1~ + END + BUT_ONLY + +ACTION_PHP_EACH cd_monster_summoning_script AS file => script BEGIN + + COPY_EXISTING ~%file%.cre~ ~override~ + WRITE_ASCIIE 0x268 ~%default%~ #8 // default script + LPF ALTER_CREATURE_ITEM INT_VAR flag_unstealable = 1 flag_undroppable = 1 STR_VAR match_item = all END // summons shouldn't drop items + PATCH_IF !enhanced_edition BEGIN + LPF ADD_CRE_EFFECT INT_VAR opcode = 215 target = 1 parameter2 = 1 duration = 1 STR_VAR resource = msumm1h END + END + BUT_ONLY IF_EXISTS + +END + +COPY_EXISTING ~idpro313.pro~ ~override~ + WRITE_ASCII 0x18 ~#tra_59~ #8 + +COPY_EXISTING ~dobone.itm~ ~override~ + LPF ALTER_EFFECT INT_VAR match_opcode = 1 savingthrow = 0 END + +// in EE, the trolgi01 script is harmless. In oBG2, this is the die-then-revive script which would return the troll +// a) hostile and b) as a different monster - no monhp1 so can already die w/o fire or acid +COPY_EXISTING ~dw#ms5tr.cre~ ~override~ // troll from MS5 + ~dw#ms6gt.cre~ ~override~ // giant troll from MS6 + WRITE_ASCII 0x248 ~~ #8 + LPF DELETE_EFFECT INT_VAR match_opcode = 206 END // don't need protection from trollreg, either + +// more trolls, same issue. regen item also provides EE death-and-revive sequence; kill item and apply regen directly to cre +COPY_EXISTING ~SS3trl7.cre~ ~override~ // troll + ~SS3trl8.cre~ ~override~ // troll + WRITE_ASCII 0x258 ~~ #8 // nuke eftrolg reference, even though script is blank + LPF DELETE_CRE_ITEM STR_VAR item_to_delete = reg1hp2 END // in helm slot + LPF ADD_CRE_EFFECT INT_VAR opcode = 98 parameter1 = 2 parameter2 = 3 timing = 1 END + +COPY_EXISTING ~MS6SALF.cre~ ~override~ // fire salamander from MS6 + ADD_CRE_ITEM ~fsalring~ #0 #0 #0 ~NONE~ ~LRING RRING AMULET~ // missing item to provide cosmetic flames + +COPY_EXISTING ~MS6SALC.cre~ ~override~ // frost salamander from MS6 + LPF DELETE_CRE_ITEM STR_VAR item_to_delete = immune1 END // should not be immune to normal weapons + LPF DELETE_CRE_ITEM STR_VAR item_to_delete = ring95 END // also should not have undead immunities + ADD_CRE_ITEM ~csalring~ #0 #0 #0 ~NONE~ ~LRING RRING AMULET~ // missing item to provide cosmetic cold + +COPY_EXISTING ~ss1liz3.cre~ ~override~ // lizard man + ~ss1liz4.cre~ ~override~ // lizard man + LPF DELETE_CRE_ITEM STR_VAR item_to_delete = ~##s1-12~ END // nonexistant, and in helm slot + ADD_CRE_ITEM ~#s1-12~ #0 #0 #0 ~NONE~ WEAPON1 EQUIP // add back as equipped weapon + +COPY_EXISTING ~SS2liz5.cre~ ~override~ // lizard man + ~SS2liz6.cre~ ~override~ // lizard man + ~SS2liz7.cre~ ~override~ // lizard man + LPF DELETE_CRE_ITEM STR_VAR item_to_delete = ~#s1-12~ END // right weapon, but in helm slot + ADD_CRE_ITEM ~#s1-12~ #0 #0 #0 ~NONE~ WEAPON1 EQUIP // add back as equipped weapon + +// clone IWD references into BG2; remove all bg2 shapeshifting references +COPY_EXISTING ~%WIZARD_ANTIMAGIC_SHELL%.spl~ ~override~ + LPF CLONE_EFFECT INT_VAR match_opcode = 123 STR_VAR match_resource = goodber resource = gberry END // good berries + LPF CLONE_EFFECT INT_VAR match_opcode = 123 STR_VAR match_resource = fseeds resource = fireseed END // fire seeds + PATCH_FOR_EACH file IN brblp wolfm brbrp plyjelly plyspid plyfist plymstar mindflay goliro trollall wolfgr firern earthrn + chillt cdia480 cdia481 cdia482 cdidree cdidrfe cdidrwe cdidrbr BEGIN // chill touch, new polys + LPF CLONE_EFFECT INT_VAR match_opcode = 112 STR_VAR match_resource = smcudge resource = EVAL ~%file%~ END // clone from star-metal cudgel + END + +COPY_EXISTING ~spwi114.spl~ ~override~ // update shield to block MFM, too + LPF CLONE_EFFECT INT_VAR match_opcode = 206 STR_VAR match_resource = ~spwi112~ resource = EVAL ~%WIZARD_MORDENKAINENS_FORCE_MISSILES%~ END + LPF CLONE_EFFECT INT_VAR match_opcode = 206 STR_VAR match_resource = ~spwi112~ resource = EVAL ~%WIZARD_MORDENKAINENS_FORCE_MISSILES%b~ END + +// iwdee fix: lich touch should paralyze, not hold +COPY_EXISTING ~ltouch.spl~ ~override~ + LPF ALTER_EFFECT INT_VAR match_opcode = 175 opcode = 109 END + +// iwdee fix: avoid dupe messgages/effects +COPY_EXISTING ~%WIZARD_GREAT_SHOUT%.spl~ ~override~ + LPF CLONE_EFFECT INT_VAR match_opcode = 142 match_duration = 12 + opcode = 206 parameter1 = 0 parameter2 = 0 duration = 1 STR_VAR resource = EVAL ~%WIZARD_GREAT_SHOUT%~ insert = below END + +// iwdee fix: emotion fear should only remove emotion courage if the normal save/MR checks work +COPY_EXISTING ~%WIZARD_EMOTION_FEAR%.spl~ ~override~ + LPF ALTER_EFFECT INT_VAR match_opcode = 321 resist_dispel = 1 savingthrow = BIT0 END + +// iwdee: not always checking MR correctly +COPY_EXISTING ~%WIZARD_BELTYNS_BURNING_BLOOD%.spl~ ~override~ + PATCH_FOR_EACH op IN 61 174 333 BEGIN // everything but the portrait icon is wrong except at header 0 + LPF ALTER_EFFECT INT_VAR match_opcode = op resist_dispel = 1 END + END + +// update wand of monster summoning to use new tables +// first, find table value +COPY_EXISTING ~%WIZARD_MONSTER_SUMMONING_2%.spl~ ~override~ + READ_LONG 0x6a fx_off + SET total_fx = ((SOURCE_SIZE - fx_off) / 0x30) + FOR (index = 0 ; index < total_fx ; ++index) BEGIN + READ_SHORT (fx_off + (index * 0x30)) opcode + PATCH_IF opcode = 331 BEGIN + READ_LONG (fx_off + 0x08 + (index * 0x30)) ms2table + SET index = total_fx // kill loop + END + END + BUT_ONLY + +COPY_EXISTING ~wand10.itm~ ~override~ + LPF ALTER_EFFECT INT_VAR match_opcode = 127 opcode = 331 parameter1 = 12 parameter2 = ms2table END // six creatures + +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +///// \\\\\ +///// and now, the non-ee conversions \\\\\ +///// \\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ + +ACTION_IF enhanced_edition BEGIN + + // missing resources + COPY ~%obg2_res_path%/abjurh_ee.bam~ ~override/abjurh.bam~ // for abjurh VVC + ~%obg2_res_path%/aft_m15.wav~ ~override~ // for seven eyes + ~%obg2_res_path%/aft_m16.wav~ ~override~ // for seven eyes + ~%obg2_res_path%/aft_m17.wav~ ~override~ // for seven eyes + ~%obg2_res_path%/tra_55.wav~ ~override~ // for mfmiss, mordenkainen's force missiles + ~%obg2_res_path%/paralh_ee.bam~ ~override/paralh.bam~ // for paralh VVC + + // don't have IWD's random treasure table to assign weapon + COPY_EXISTING ~ad3sklm.cre~ ~override~ // soul eater skeleton + LPF ALTER_CREATURE_ITEM INT_VAR flag_unstealable = 1 STR_VAR match_item = rndtre40 item = hamm01 END + WRITE_ASCII 0x248 ~cd3sklm~ #8 // override script; randomizes weapon + WRITE_ASCIIE 0x268 ~%default%~ #8 // default script + + COMPILE ~%obg2_res_path%/cd3sklm.baf~ + + ACTION_IF ((MOD_IS_INSTALLED ~iwdification/setup-iwdification.tp2~ ~120~) AND (FILE_EXISTS ~iwdification/evasion/evasion_arcane.2da~)) BEGIN + + INCLUDE ~iwdification/evasion/evasion.tpa~ + LAF cd_add_evasion STR_VAR 2da_file = ~iwdification/evasion/evasion_arcane.2da~ END + + END + +END ELSE BEGIN + +/* +Converting for non-EE is essentially two parts--exclusion of spells +that can't be converted (removed from arcane_resrefs.txt prior +to running this on oBG2) and then this, where we convert EE-only +opcodes to oBG2 counterparts. +*/ + + LAF CD_HANDLE_AUDIO_PREP END // ogg > wav conversions + +///// \\\\\ +///// creature animations \\\\\ +///// \\\\\ + + OUTER_SET anim_uhulk = 0x7f11 // sub bg2 umber hulk + OUTER_SET anim_welem = 0xef10 // iwd water elemental + OUTER_SET anim_lizman = 0xe500 // bg2 lacks alternative lizard man animation + OUTER_SET anim_shadow_lg = 0x7703 // sub bg2 shadow + + // if infinity animations has added iwd animations, use them + ACTION_IF MOD_IS_INSTALLED ~INFINITYANIMATIONS/SETUP-INFINITYANIMATIONS.TP2~ ~400~ BEGIN // 'distinctive undead' + + ACTION_IF IDS_OF_SYMBOL (~animate~ ~SHADOW_LARGE_IWD~) > 0 THEN BEGIN + OUTER_SET anim_shadow_lg = IDS_OF_SYMBOL (~animate~ ~SHADOW_LARGE_IWD~) + END + + END + + ACTION_IF MOD_IS_INSTALLED ~INFINITYANIMATIONS/SETUP-INFINITYANIMATIONS.TP2~ ~500~ BEGIN // 'more base animations' + + ACTION_IF IDS_OF_SYMBOL (~animate~ ~LIZARDMAN_GREEN~) > 0 THEN BEGIN + OUTER_SET anim_lizman = IDS_OF_SYMBOL (~animate~ ~LIZARDMAN_GREEN~) + END + + ACTION_IF IDS_OF_SYMBOL (~animate~ ~UMBERHULK_IWD~) > 0 THEN BEGIN + OUTER_SET anim_uhulk = IDS_OF_SYMBOL (~animate~ ~UMBERHULK_IWD~) + END + + END + + ACTION_IF MOD_IS_INSTALLED ~INFINITYANIMATIONS/SETUP-INFINITYANIMATIONS.TP2~ ~550~ BEGIN // 'more icewind dale animations' + + ACTION_IF IDS_OF_SYMBOL (~animate~ ~ELEMENTAL_WATER~) > 0 THEN BEGIN + OUTER_SET anim_welem = IDS_OF_SYMBOL (~animate~ ~ELEMENTAL_WATER~) + END + + END + + ACTION_CLEAR_ARRAY cd_cre_anim + ACTION_DEFINE_ASSOCIATIVE_ARRAY cd_cre_anim BEGIN + + ms7umbh => ~%anim_uhulk%~ + ss3umb8 => ~%anim_uhulk%~ + ss3umb9 => ~%anim_uhulk%~ + es8watr => ~%anim_welem%~ + ~dw#wate2~ => ~%anim_welem%~ + ~dw#wate3~ => ~%anim_welem%~ + ~dw#wate4~ => ~%anim_welem%~ + ms2lizm => ~%anim_lizman%~ + ss1liz3 => ~%anim_lizman%~ + ss1liz4 => ~%anim_lizman%~ + icliz02 => ~%anim_lizman%~ // not iwdification, but still broek + sumshad => ~%anim_shadow_lg%~ + + END + + ACTION_PHP_EACH cd_cre_anim AS file => anim BEGIN + + COPY_EXISTING ~%file%.cre~ ~override~ + WRITE_LONG 0x28 anim + + END + +///// \\\\\ +///// immunity effs \\\\\ +///// \\\\\ + + // generating immunity EFFs for various 324 replacements + ACTION_CLEAR_ARRAY cd_immunity_eff + ACTION_DEFINE_ASSOCIATIVE_ARRAY cd_immunity_eff BEGIN + + ~%WIZARD_EXPEDITIOUS_RETREAT%~ => cdixa126 + ~%WIZARD_SNILLOCS_SNOWBALL_SWARM%b~ => cdixa204 + cdideca => cdixa216 // for decastave's on-hit hp drain + ~%WIZARD_BELTYNS_BURNING_BLOOD%~ => cdixa422 + ~%WIZARD_EMOTION_FEAR%~ => cdixa428 + cdidob1 => cdixa630 // for darts of bone's on-hit effects + cdia726 => cdixa726 // for suffocate's shadow spell + ltouch => cdixa626 // for lich touch's on-hit effects + + END + + ACTION_PHP_EACH cd_immunity_eff AS imm => file BEGIN + + COPY ~%obg2_res_path%/immunity.eff~ ~override/%file%.eff~ + WRITE_ASCIIE 0x30 ~%imm%~ #8 + + END + +///// \\\\\ +///// self-stacking protection \\\\\ +///// \\\\\ + + // EE generally uses self-referential 321s for better spell stacking + // oBG2 has to use 206, which we clone from an existing opcode + ACTION_CLEAR_ARRAY cd_206_clone + ACTION_DEFINE_ASSOCIATIVE_ARRAY cd_206_clone BEGIN + + ~%WIZARD_CATS_GRACE%~ => 15 + ~%WIZARD_EMOTION_COURAGE%~ => 54 + ~%WIZARD_EMOTION_HOPE%~ => 54 + ~%WIZARD_TROLLISH_FORTITUDE%~ => 142 + ~%WIZARD_EMOTION_HOPE%~ => 54 + + END + + ACTION_PHP_EACH cd_206_clone AS file => clone_op BEGIN + + COPY_EXISTING ~%file%.spl~ ~override~ + LPF CLONE_EFFECT INT_VAR match_opcode = clone_op opcode = 206 parameter1 = 0 parameter2 = 0 STR_VAR insert = last resource = EVAL ~%file%~ END + IF_EXISTS // cat's grace won't be here w/o tobex + + END + +///// \\\\\ +///// op 61 \\\\\ +///// \\\\\ + + // op 61 crashes oBG2, so convert it to seven op 50s for body glow + COPY_EXISTING ~decasta.itm~ ~override~ // decastave + //~dobone.itm~ ~override~ // this just gets removed below + ~#soflamc.spl~ ~override~ + ~shadow1.spl~ ~override~ // shadow on-hit attack from summon shadow + ~%WIZARD_EXPEDITIOUS_RETREAT%.spl~ ~override~ + ~%WIZARD_DECASTAVE%.spl~ ~override~ + ~%WIZARD_CATS_GRACE%.spl~ ~override~ + ~%WIZARD_LANCE_OF_DISRUPTION%.spl~ ~override~ + ~%WIZARD_BELTYNS_BURNING_BLOOD%.spl~ ~override~ + ~%WIZARD_EMOTION_COURAGE%.spl~ ~override~ + ~%WIZARD_EMOTION_HOPE%.spl~ ~override~ + ~%WIZARD_EMOTION_FEAR%.spl~ ~override~ + ~%WIZARD_DARTS_OF_BONE%.spl~ ~override~ + ~%WIZARD_TROLLISH_FORTITUDE%.spl~ ~override~ + ~%WIZARD_LICH_TOUCH%.spl~ ~override~ + ~%WIZARD_MORDENKAINENS_SWORD_IWD%.spl~ ~override~ + ~%WIZARD_MIND_BLANK%.spl~ ~override~ + ~%WIZARD_IRON_BODY%.spl~ ~override~ + LPF CD_CONVERT_61 END + IF_EXISTS // cat's grace won't be here w/o tobex + +///// \\\\\ +///// portrait icons, op 142 \\\\\ +///// \\\\\ + + // portrait icons that use IWD-exclusive icons get remapped if + // an existing icon works, otherwise get deleted + ACTION_CLEAR_ARRAY cd_icon_map + ACTION_DEFINE_ASSOCIATIVE_ARRAY cd_icon_map BEGIN + + ~%WIZARD_CATS_GRACE%.spl~ => "-1" // cat's grace > delete + ~%WIZARD_BELTYNS_BURNING_BLOOD%.spl~ => "-1" // beltyn's burning blood > delete + ~%WIZARD_EMOTION_COURAGE%.spl~ => "-1" // courage > delete + ~%WIZARD_EMOTION_HOPE%.spl~ => 22 // hope > heroism + ~%WIZARD_SHROUD_OF_FLAME%.spl~ => "-1" // shroud of flame > delete + ~%WIZARD_MIND_BLANK%.spl~ => "-1" // mind blank > delete + ~%WIZARD_ANTIMAGIC_SHELL%.spl~ => 83 // antomagic shell > spell failure + ~%WIZARD_EXPEDITIOUS_RETREAT%.spl~ => 38 // expeditious retreat > haste + + END + + ACTION_PHP_EACH cd_icon_map AS file => icon BEGIN + + COPY_EXISTING ~%file%~ ~override~ + PATCH_IF icon < 0 BEGIN + LPF DELETE_EFFECT INT_VAR match_opcode = 142 END + END ELSE BEGIN + LPF ALTER_EFFECT INT_VAR match_opcode = 142 parameter2 = icon END + END + IF_EXISTS // cat's grace won't be here w/o tobex + + END + +///// \\\\\ +///// op 321 \\\\\ +///// \\\\\ + + // no op 321 (effect removal by spell) in oBG2; try to manually replace these with 206s elsewhere + COPY_EXISTING //~%WIZARD_EMOTION_HOPELESSNESS%.spl~ ~override~ + ~%WIZARD_EXPEDITIOUS_RETREAT%.spl~ ~override~ + ~%WIZARD_BELTYNS_BURNING_BLOOD%.spl~ ~override~ + ~%WIZARD_EMOTION_COURAGE%.spl~ ~override~ + ~%WIZARD_EMOTION_HOPE%.spl~ ~override~ + ~%WIZARD_EMOTION_FEAR%.spl~ ~override~ + ~spwi411.spl~ ~override~ // emotion: hopelessness + ~%WIZARD_SHROUD_OF_FLAME%.spl~ ~override~ + ~%WIZARD_CATS_GRACE%.spl~ ~override~ + ~%WIZARD_TROLLISH_FORTITUDE%.spl~ ~override~ + LPF DELETE_EFFECT INT_VAR match_opcode = 321 END + IF_EXISTS // cat's grace won't be here w/o tobex + +///// \\\\\ +///// op 324 \\\\\ +///// \\\\\ + + // try to convert 324s to 177s where possible, but evasion checks get deleted since there's no oBG2 counterpart + COPY_EXISTING ~%WIZARD_SNILLOCS_SNOWBALL_SWARM%.spl~ ~override~ // evasion + LPF DELETE_EFFECT INT_VAR match_opcode = 324 END + +///// \\\\\ +///// op 325 \\\\\ +///// \\\\\ + + // convert 325 to individual save opcodes + COPY_EXISTING ~%WIZARD_EMOTION_HOPE%.spl~ ~override~ + //~cdiwdtr1.spl~ ~override~ + LPF CD_CONVERT_325 END + +///// \\\\\ +///// op 328 \\\\\ +///// \\\\\ + + // no op 328 in oBG2 + COPY_EXISTING ~#soflamc.spl~ ~override~ + ~%WIZARD_CATS_GRACE%.spl~ ~override~ + ~%WIZARD_SHROUD_OF_FLAME%.spl~ ~override~ + LPF DELETE_EFFECT INT_VAR match_opcode = 328 END + IF_EXISTS // cat's grace won't be here w/o tobex + +///// \\\\\ +///// op 333 \\\\\ +///// \\\\\ + + // convert 333s to series of cast opcodes + COPY_EXISTING ~%WIZARD_BELTYNS_BURNING_BLOOD%.spl~ ~override~ + LPF CD_CONVERT_333 END + +///// \\\\\ +///// WIZARD_SNILLOCS_SNOWBALL_SWARM \\\\\ +///// \\\\\ + + // snilloc has different damage for fire resist > 100; can't convert this acurately + // class: fire elem gets routed through EFF to apply c and immunity to b + COPY_EXISTING ~%WIZARD_SNILLOCS_SNOWBALL_SWARM%.spl~ ~override~ + LPF ALTER_EFFECT INT_VAR match_opcode = 326 opcode = 177 parameter1 = 187 parameter2 = 5 STR_VAR match_resource = EVAL ~%WIZARD_SNILLOCS_SNOWBALL_SWARM%c~ resource = cdiaa204 END + LPF CLONE_EFFECT INT_VAR match_opcode = 177 STR_VAR insert = first resource = cdixa204 END + LPF ALTER_EFFECT INT_VAR match_opcode = 326 opcode = 146 parameter2 = 1 STR_VAR resource = EVAL ~%WIZARD_SNILLOCS_SNOWBALL_SWARM%b~ END + + // cast snilloc-c + COPY ~%obg2_res_path%/cast.eff~ ~override/cdiaa204.eff~ + WRITE_ASCIIE 0x30 ~%WIZARD_SNILLOCS_SNOWBALL_SWARM%c~ #8 + + // oBG2 does not support the save-for-half flag on op 12 + COPY_EXISTING ~%WIZARD_SNILLOCS_SNOWBALL_SWARM%b.spl~ ~override~ + ~%WIZARD_SNILLOCS_SNOWBALL_SWARM%c.spl~ ~override~ + LPF CD_SPLIT_SAVE_DAMAGE END + + // change snilloc projectile to known oBG2 type + COPY_EXISTING ~idpro217.pro~ ~override~ + WRITE_BYTE 0x217 14 + +///// \\\\\ +///// WIZARD_DECASTAVE \\\\\ +///// \\\\\ + + // oBG2 doesn't support the HP drain flag for damage, so route through external spell; add immunity for undead & golems + // summoning a 2h weapon in BG2 with a shield equipped = crash, so change ot to a 1h weapon like the staff-mace + COPY_EXISTING ~decasta.itm~ ~override~ + LPF CLONE_EFFECT INT_VAR match_opcode = 324 opcode = 177 parameter1 = 4 parameter2 = 3 STR_VAR resource = cdixa216 END // general = undead + LPF ALTER_EFFECT INT_VAR match_opcode = 324 opcode = 177 parameter1 = 144 parameter2 = 4 STR_VAR resource = cdixa216 END // race = golem + LPF ALTER_EFFECT INT_VAR match_opcode = 12 opcode = 146 parameter2 = 1 special = 0 dicenumber = 0 dicesize = 0 STR_VAR resource = cdideca END + WRITE_ASCII 0x22 ~MC~ #2 // use mace anim + WRITE_LONG 0x18 (THIS BAND `BIT1) // remove 2h flag + + COPY ~%obg2_res_path%/cdideca.spl~ ~override~ // decastave's non-EE hp drain + ~%obg2_res_path%/decasta.bam~ ~override~ // oBG2 needs two-cycle inv icons + +///// \\\\\ +///// WIZARD_LANCE_OF_DISRUPTION \\\\\ +///// \\\\\ + + // convert 318 to prevent self-damage, split damage + COPY_EXISTING ~%WIZARD_LANCE_OF_DISRUPTION%.spl~ ~override~ + LPF ALTER_EFFECT INT_VAR match_opcode = 318 opcode = 206 target = 1 parameter2 = 0 duration = 2 END // stop hitting yourself, stop hitting yourself, stop hitting yourself + LPF CD_SPLIT_SAVE_DAMAGE END + + COPY ~%obg2_res_path%/idpro313.pro~ ~override~ // oBG2 projectile + +///// \\\\\ +///// WIZARD_BELTYNS_BURNING_BLOOD \\\\\ +///// \\\\\ + + // change 324 to 177 for immunities + COPY_EXISTING ~%WIZARD_BELTYNS_BURNING_BLOOD%.spl~ ~override~ + LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 9 opcode = 177 parameter1 = 145 parameter2 = 4 STR_VAR resource = cdixa422 END // race = elemental + LPF CLONE_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 144 parameter2 = 4 STR_VAR resource = cdixa422 END // race = golem + LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 4 parameter2 = 3 STR_VAR resource = cdixa422 END // general = undead + +///// \\\\\ +///// WIZARD_EMOTION_COURAGE \\\\\ +///// \\\\\ + + // emotion courage already gets self-protection above, also protects from emotion fear + COPY_EXISTING ~%WIZARD_EMOTION_COURAGE%.spl~ ~override~ + LPF CLONE_EFFECT INT_VAR match_opcode = 206 STR_VAR resource = EVAL ~%WIZARD_EMOTION_FEAR%~ END + +///// \\\\\ +///// WIZARD_EMOTION_HOPE \\\\\ +///// \\\\\ + + // hope also protects against hoplessness + COPY_EXISTING ~%WIZARD_EMOTION_HOPE%.spl~ ~override~ + LPF CLONE_EFFECT INT_VAR match_opcode = 206 STR_VAR resource = EVAL ~%WIZARD_EMOTION_HOPELESSNESS%~ END + +///// \\\\\ +///// WIZARD_EMOTION_FEAR \\\\\ +///// \\\\\ + + // emotion fear also protects from emotion courage; add immunity for undead and golems + COPY_EXISTING ~%WIZARD_EMOTION_FEAR%.spl~ ~override~ + LPF CLONE_EFFECT INT_VAR match_opcode = 324 opcode = 177 parameter1 = 4 parameter2 = 3 STR_VAR resource = cdixa428 END // general = undead + LPF ALTER_EFFECT INT_VAR match_opcode = 324 opcode = 177 parameter1 = 144 parameter2 = 4 STR_VAR resource = cdixa428 END // race = golem + LPF CLONE_EFFECT INT_VAR match_opcode = 24 opcode = 206 STR_VAR resource = EVAL ~%WIZARD_EMOTION_COURAGE%~ END + +///// \\\\\ +///// WIZARD_EMOTION_HOPELESSNESS \\\\\ +///// \\\\\ + + // emotion hopelessness also protects from emotion hope + COPY_EXISTING ~spwi411.spl~ ~override~ + LPF CLONE_EFFECT INT_VAR match_opcode = 45 opcode = 206 STR_VAR resource = EVAL ~%WIZARD_EMOTION_HOPE%~ END + +///// \\\\\ +///// WIZARD_VITRIOLIC_SPHERE \\\\\ +///// \\\\\ + + // vit sphere needs a lot of restructuring to get the delayed saves working + COPY_EXISTING ~%WIZARD_VITRIOLIC_SPHERE%.spl~ ~override~ + LPF DELETE_EFFECT INT_VAR match_opcode = 12 match_timing = 4 END // delete any delayed damage + LPF DELETE_EFFECT INT_VAR match_opcode = 326 END // to be replaced with dual-146s + LPF ALTER_EFFECT INT_VAR match_opcode = 318 opcode = 146 parameter2 = 1 timing = 1 resist_dispel = 3 duration = 0 END // change to straight cast for splash damage + READ_SHORT 0x68 abil_num ELSE 0 + FOR (index = 0 ; index < abil_num ; ++index) BEGIN + LPF CLONE_EFFECT INT_VAR header = index match_opcode = 146 parameter1 = (index + 5) timing = 4 duration = 6 STR_VAR resource = EVAL ~%WIZARD_VITRIOLIC_SPHERE%z~ END + END + + // easier to bring over old iwdification subspells than restructure + COPY ~%obg2_res_path%/cdia432z.spl~ ~override/%WIZARD_VITRIOLIC_SPHERE%z.spl~ // recurring main target damage; recasts itself (w/save) at level-2 every iteration + LPF ALTER_EFFECT STR_VAR match_resource = cdia432z resource = EVAL ~%WIZARD_VITRIOLIC_SPHERE%z~ END + LPF ALTER_EFFECT STR_VAR match_resource = cdiacid resource = acidh END + + COPY ~%obg2_res_path%/acidh.bam~ ~override~ + ~%obg2_res_path%/acidh.vvc~ ~override~ + +///// \\\\\ +///// WIZARD_SHROUD_OF_FLAME \\\\\ +///// \\\\\ + + // Just grab name... + COPY_EXISTING ~%WIZARD_SHROUD_OF_FLAME%.spl~ ~override~ + READ_LONG 0x08 shroud_name1 + READ_LONG 0x0c shroud_name2 + READ_LONG 0x50 shroud_desc1 + READ_LONG 0x54 shroud_desc2 + + // the layered 318/321/333s just make this easier to drop in oBG2 versions + COPY ~%obg2_res_path%/cdia524.spl~ ~override/%WIZARD_SHROUD_OF_FLAME%.spl~ + ~%obg2_res_path%/cdia524b.spl~ ~override/%WIZARD_SHROUD_OF_FLAME%b.spl~ + ~%obg2_res_path%/cdia524c.spl~ ~override/%WIZARD_SHROUD_OF_FLAME%c.spl~ + WRITE_LONG 0x08 shroud_name1 + WRITE_LONG 0x0c shroud_name2 + WRITE_LONG 0x50 shroud_desc1 + WRITE_LONG 0x54 shroud_desc2 + WRITE_ASCIIE 0x3a ~%WIZARD_SHROUD_OF_FLAME%c~ #8 + LPF ALTER_SPELL_HEADER STR_VAR icon = EVAL ~%WIZARD_SHROUD_OF_FLAME%b~ END + LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = spwi524b resource = EVAL ~%WIZARD_SHROUD_OF_FLAME%b~ END + LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = spwi524c resource = EVAL ~%WIZARD_SHROUD_OF_FLAME%c~ END + +///// \\\\\ +///// WIZARD_DARTS_OF_BONE \\\\\ +///// \\\\\ + + // like decastave, have to farm out on-hit effects to spell so we can avoid stacking and so golems/undead can avoid outright + COPY_EXISTING ~dobone.itm~ ~override~ + LPF CLONE_EFFECT INT_VAR match_opcode = 324 opcode = 177 parameter1 = 4 parameter2 = 3 STR_VAR resource = cdixa630 END // general = undead + LPF ALTER_EFFECT INT_VAR match_opcode = 324 opcode = 177 parameter1 = 144 parameter2 = 4 STR_VAR resource = cdixa630 END // race = golem + LPF ALTER_EFFECT INT_VAR match_opcode = 12 opcode = 146 parameter2 = 1 special = 0 dicenumber = 0 dicesize = 0 STR_VAR resource = cdidob1 END + PATCH_FOR_EACH op IN 321 44 215 174 61 BEGIN + LPF DELETE_EFFECT INT_VAR match_opcode = op END + END + + COPY ~%obg2_res_path%/cdidob1.spl~ ~override~ + LPF CD_CONVERT_61 END // run this thorugh same conversion for consistency + + COPY ~%obg2_res_path%/cdidob2.spl~ ~override~ // farm str drain to second spell to prevent stacking + ~%obg2_res_path%/idobone.bam~ ~override~ // oBG2 needs two-cycle inv icons + +///// \\\\\ +///// WIZARD_ACID_STORM \\\\\ +///// \\\\\ + + // acid storm's main problem for oBG2 is its cloudish animation + // so we turn the projectile into a (mostly) invisible AoE and manually play 'random' cloud vvcs + ACTION_CLEAR_ARRAY cd_acid_cloud + ACTION_DEFINE_ASSOCIATIVE_ARRAY cd_acid_cloud BEGIN + + 0,0,0 => 0 + 87,145,2 => 1 + ~-93~,133,1 => 2 + ~-173~,~-10~,2 => 3 + ~-80~,~-160~,1 => 4 + 89,~-140~,2 => 5 + 43,172,1 => 6 + ~-47~,66,2 => 7 + ~-87~,~-5~,1 => 8 + 86,0,2 => 9 + ~-40~,~-80~,1 => x + 44,~-70~,2 => y + 171,0,1 => z + + END + + ACTION_PHP_EACH cd_acid_cloud AS coords => letter BEGIN + + COPY ~%obg2_res_path%/cdia7240.vvc~ ~override/cdia724%letter%.vvc~ + WRITE_LONG 0x28 ~%coords_0%~ // x position + WRITE_LONG 0x2c ~%coords_1%~ // y position + WRITE_LONG 0x68 ~%coords_2%~ // starting anim cycle + + END + + // need to adjust projectile for manual cloud simulation + COPY_EXISTING ~idpro211.pro~ ~override~ + WRITE_SHORT 0x00a 96 // speed + WRITE_LONG 0x00c 0 // remove use_height flag + WRITE_ASCII 0x100 ~~ #256 // zero projectile info fields + WRITE_SHORT 0x204 0 // trap size + WRITE_SHORT 0x206 192 // explosion size + WRITE_ASCII 0x208 ~~ #8 // sound + WRITE_SHORT 0x210 0 // explosion freq + WRITE_BYTE 0x216 0 // reps + WRITE_BYTE 0x217 255 // explosion effect + WRITE_BYTE 0x218 0 // explosion effect + WRITE_ASCII 0x21c ~~ #8 // animation + + // all damage is 1dX, so the CD_SPLIT_SAVE_DAMAGE can't split into separate dice; we manually halve the die size and dupe + COPY_EXISTING ~%WIZARD_ACID_STORM%.spl~ ~override~ + LPF ALTER_EFFECT INT_VAR match_opcode = 12 match_dicesize = 4 dicesize = 2 END + LPF ALTER_EFFECT INT_VAR match_opcode = 12 match_dicesize = 6 dicesize = 3 END + LPF ALTER_EFFECT INT_VAR match_opcode = 12 match_dicesize = 8 dicesize = 4 END + LPF CLONE_EFFECT INT_VAR match_opcode = 12 savingthrow = BIT24 END + PATCH_FOR_EACH res IN 0 1 2 3 4 5 6 7 8 9 x y z BEGIN // simulating clouds in bg2 sucks + LPF ADD_SPELL_EFFECT INT_VAR opcode = 215 target = 1 parameter2 = 2 resist_dispel = 3 STR_VAR resource = EVAL ~cdia724%res%~ END + END + + +///// \\\\\ +///// WIZARD_SUFFOCATE \\\\\ +///// \\\\\ + + // in oBG2 lingering clouds are basically an invisible creature generating the spell effects and visuals + + // need to adjust projectile for manual cloud simulation + COPY_EXISTING ~idpro317.pro~ ~override~ + WRITE_SHORT 0x00a 96 // speed + WRITE_ASCII 0x18 ~~ #8 // zero sound file + WRITE_SHORT 0x204 0 // trap size + WRITE_SHORT 0x206 256 // explosion size + WRITE_SHORT 0x210 0 // explosion freq + WRITE_BYTE 0x216 0 // reps + WRITE_BYTE 0x217 255 // explosion effect + WRITE_SHORT 0x21a 79 // explosion projectile + + // dupe suffocate into spell used by invisible creature + COPY_EXISTING ~%WIZARD_SUFFOCATE%.spl~ ~override/cdia726.spl~ + WRITE_LONG 0x08 "-1" // name + LPF CLONE_EFFECT INT_VAR match_opcode = 321 opcode = 206 timing = 0 duration = 6 STR_VAR insert = last END + LPF DELETE_EFFECT INT_VAR match_opcode = 321 END + LPF CLONE_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 9 opcode = 177 parameter1 = 145 parameter2 = 4 STR_VAR resource = cdixa726 END // race = elemental + LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 9 opcode = 177 parameter1 = 144 parameter2 = 4 STR_VAR resource = cdixa726 END // race = golem + LPF ALTER_EFFECT INT_VAR match_opcode = 324 opcode = 177 parameter1 = 4 parameter2 = 3 STR_VAR resource = cdixa726 END // general = undead + LPF ALTER_EFFECT INT_VAR match_opcode = 126 parameter2 = 2 END // mode 5 not available on oBG2 + LPF ALTER_EFFECT INT_VAR match_opcode = 206 STR_VAR resource = cdia726 END // update self-reference + LPF CD_SPLIT_SAVE_DAMAGE END + + // change actual suffocate used into just a summon for the invisible creature + COPY_EXISTING ~%WIZARD_SUFFOCATE%.spl~ ~override~ + LPF DELETE_EFFECT END + LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 1 timing = 1 parameter2 = 2 STR_VAR resource = cdia726 END + LPF ALTER_SPELL_HEADER INT_VAR projectile = 1 END + + LAUNCH_ACTION_FUNCTION cd_create_cloud INT_VAR visloop = 5 cloud_dur = 60 zosa = 1 STR_VAR code = CDIA726 anim = suffoca END + +///// \\\\\ +///// WIZARD_IRON_BODY \\\\\ +///// \\\\\ + +// sans tobex, items in the magical weapon slot will always be removed by dispel magic in oBG2. to avoid the incongruous +// state of having iron body in effect but without the melee bits, we move all effects to the paw as equipped effects + COPY_EXISTING ~%WIZARD_IRON_BODY%.spl~ ~override~ + PATCH_FOR_EACH res IN ~##wi904~ spwi726 BEGIN + LPF DELETE_EFFECT INT_VAR match_opcde = 318 STR_VAR match_resource = EVAL ~%res%~ END + END + // updating iwd > bg2 refs before moving + LPF ALTER_EFFECT INT_VAR match_opcode = 318 opcode = 206 END // make some adjustments before moving + LPF DELETE_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 172 END // delete iron body icon + LPF DELETE_EFFECT INT_VAR match_opcode = 321 END // delete self-cast protection + LPF DELETE_EFFECT INT_VAR match_opcode = 1 END // delete APR set (fist item already has it) + + COPY_EXISTING ~%WIZARD_IRON_BODY%.spl~ ~override~ // re-copy to reset SOURCE_SIZE + READ_LONG 0x6a fx_off + SET fx_num = ((SOURCE_SIZE - fx_off) / 0x30) + READ_ASCII fx_off fx (fx_num * 0x30) + PATCH_FOR_EACH op IN 7 29 30 44 87 101 126 142 145 169 173 206 267 BEGIN // delete stuff that's moving to the paw + LPF DELETE_EFFECT INT_VAR match_opcode = op END + END + + COPY_EXISTING ~ibody.itm~ ~override~ + READ_LONG 0x64 abil_off ELSE 0 + READ_SHORT 0x68 abil_num ELSE 0 + READ_LONG 0x6a fx_off + WRITE_SHORT 0x70 (THIS + fx_num) + FOR (index = 0 ; index < abil_num ; ++index) BEGIN // start iterating through abilities + WRITE_SHORT (abil_off + 0x20 + (0x28 * index)) (THIS + fx_num) + END + INSERT_BYTES fx_off (fx_num * 0x30) + WRITE_ASCIIE fx_off ~%fx%~ + PATCH_FOR_EACH op IN 50 61 111 174 215 BEGIN // remove audio/visual & item creation + LPF DELETE_EFFECT INT_VAR match_opcode = op END + END + LPF ALTER_EFFECT INT_VAR check_headers = 0 power = 0 resist_dispel = 0 timing = 2 duration = 0 END + LPF ALTER_EFFECT INT_VAR match_opcode = 126 parameter2 = 2 END // mode 5 not available on oBG2 + FOR (index = 0 ; index < 6 ; ++index) BEGIN + LPF CLONE_EFFECT INT_VAR check_headers = 0 match_opcode = 7 match_parameter2 = 255 parameter2 = index END + END + LPF ALTER_EFFECT INT_VAR check_headers = 0 match_opcode = 7 match_parameter2 = 255 parameter2 = 6 END + +///// \\\\\ +///// WIZARD_SUMMON_SHADOW \\\\\ +///// \\\\\ + + COPY_EXISTING ~%WIZARD_SUMMON_SHADOW%.spl~ ~override~ // shadows are level 4, so p1=12 should mean 3 shadows + LPF CLONE_EFFECT INT_VAR match_opcode = 331 opcode = 215 parameter2 = 2 timing = 0 duration = 1 STR_VAR resource = msumm1h END // add animation + LPF ALTER_EFFECT INT_VAR match_opcode = 331 opcode = 127 parameter1 = 12 parameter2 = 0 dicesize = 0 dicenumber = 0 STR_VAR resource = sshadow END + +///// \\\\\ +///// WIZARD_MONSTER_SUMMONING \\\\\ +///// \\\\\ + + ACTION_CLEAR_ARRAY cd_monster_summoning_cre + ACTION_CLEAR_ARRAY cd_monster_summoning + ACTION_DEFINE_ASSOCIATIVE_ARRAY cd_monster_summoning BEGIN + // spell, # of monsters summoned => table aka also used as generic power/HD substitute + ~%WIZARD_MONSTER_SUMMONING_1%~,5 => 1 + ~%WIZARD_MONSTER_SUMMONING_2%~,6 => 2 + ~%WIZARD_MONSTER_SUMMONING_3%~,4 => 3 + ~%WIZARD_MONSTER_SUMMONING_4%~,3 => 4 + ~%WIZARD_MONSTER_SUMMONING_5%~,3 => 5 + ~%WIZARD_MONSTER_SUMMONING_6%~,3 => 6 + ~%WIZARD_MONSTER_SUMMONING_7%~,2 => 7 + + END + + ACTION_PHP_EACH cd_monster_summoning AS spell => table BEGIN + + // turns single 331 into one 100% 127 plus multiple, staggered 127s to simulate dice rolls + COPY_EXISTING ~%spell_0%.spl~ ~override~ + LPF CLONE_EFFECT INT_VAR match_opcode = 331 opcode = 215 parameter2 = 2 timing = 0 duration = 2 resist_dispel = 0 dicenumber = 0 dicesize = 0 STR_VAR resource = msumm1x END // add animation + LPF ALTER_EFFECT INT_VAR match_opcode = 331 opcode = 127 parameter1 = table parameter2 = 0 dicesize = 0 dicenumber = 0 STR_VAR resource = EVAL ~msummo%table%~ END + FOR (index = 1 ; index < spell_1 ; ++index) BEGIN + LPF CLONE_EFFECT INT_VAR match_opcode = 127 match_probability1 = 100 probability1 = (((100 * index) / %spell_1%) - 1) END + END + + // this bit parses the summoning tables and changes the power level for consistent summoning numbers + COPY_EXISTING ~msummo%table%.2da~ ~override~ + REPLACE_EVALUATE ~^\([0-9]+[ %TAB%]+\)\(.+\)$~ BEGIN + DEFINE_ASSOCIATIVE_ARRAY cd_monster_summoning_cre BEGIN ~%MATCH2%~ => ~%table%~ END // build table for next step + END ~%MATCH1%%MATCH2%~ + BUT_ONLY + + END + + ACTION_PHP_EACH cd_monster_summoning_cre AS file => power BEGIN + + COPY_EXISTING ~%file%.cre~ ~override~ + WRITE_LONG 0x18 power // set "power level" for consistent summoning + BUT_ONLY IF_EXISTS + + END + + COPY_EXISTING ~%WIZARD_MONSTER_SUMMONING_1%.spl~ ~override~ // above shenigans turn MS1 into 1d5 monsters, now make it 1d5+1 (lazy 2d3 mimic) + LPF ALTER_EFFECT INT_VAR match_opcode = 127 parameter1 = 2 match_probability1 = 100 END + + // summons 6 creatures from MS2 table + COPY_EXISTING ~wand10.itm~ ~override~ + LPF CLONE_EFFECT INT_VAR match_opcode = 331 opcode = 215 parameter2 = 2 timing = 0 duration = 2 resist_dispel = 0 dicenumber = 0 dicesize = 0 STR_VAR resource = msumm1x END // add animation + LPF ALTER_EFFECT INT_VAR match_opcode = 331 opcode = 127 parameter1 = 12 parameter2 = 0 dicesize = 0 dicenumber = 0 STR_VAR resource = EVAL ~msummo2~ END + +///// \\\\\ +///// WIZARD_CONJURE_LESSER_X_ELEMENTAL \\\\\ +///// \\\\\ + + COPY_EXISTING ~%WIZARD_CONJURE_LESSER_EARTH_ELEMENTAL%.spl~ ~override~ + LPF CLONE_EFFECT INT_VAR match_opcode = 331 opcode = 215 parameter2 = 2 timing = 0 duration = 1 STR_VAR resource = ceelemx END // add animation + LPF ALTER_EFFECT INT_VAR match_opcode = 331 opcode = 127 parameter1 = 8 parameter2 = 0 dicesize = 0 dicenumber = 0 STR_VAR resource = ceelemw END + + COPY_EXISTING ~%WIZARD_CONJURE_LESSER_FIRE_ELEMENTAL%.spl~ ~override~ + LPF CLONE_EFFECT INT_VAR match_opcode = 331 opcode = 215 parameter2 = 2 timing = 0 duration = 1 STR_VAR resource = cfelemx END // add animation + LPF ALTER_EFFECT INT_VAR match_opcode = 331 opcode = 127 parameter1 = 8 parameter2 = 0 dicesize = 0 dicenumber = 0 STR_VAR resource = cfelemw END + + COPY_EXISTING ~%WIZARD_CONJURE_LESSER_AIR_ELEMENTAL%.spl~ ~override~ + LPF CLONE_EFFECT INT_VAR match_opcode = 331 opcode = 215 parameter2 = 2 timing = 0 duration = 1 STR_VAR resource = caelemx END // add animation + LPF ALTER_EFFECT INT_VAR match_opcode = 331 opcode = 127 parameter1 = 8 parameter2 = 0 dicesize = 0 dicenumber = 0 STR_VAR resource = caelemw END + + COPY_EXISTING ~%WIZARD_CONJURE_LESSER_WATER_ELEMENTAL%.spl~ ~override~ + LPF CLONE_EFFECT INT_VAR match_opcode = 331 opcode = 215 parameter2 = 2 timing = 0 duration = 1 STR_VAR resource = cwelemx END // add animation + LPF ALTER_EFFECT INT_VAR match_opcode = 331 opcode = 127 parameter1 = 8 parameter2 = 0 dicesize = 0 dicenumber = 0 STR_VAR resource = cwelemw END + +///// \\\\\ +///// WIZARD_MORDENKAINENS_SWORD_IWD \\\\\ +///// \\\\\ + + // like iron body, transfer spell effects (in this case, just thac0) to sword + // because the thac0 is level-dependent, it means we need multiple summoned swords + COPY_EXISTING ~%WIZARD_MORDENKAINENS_SWORD_IWD%.spl~ ~override~ + LPF DELETE_EFFECT INT_VAR match_opcode = 54 END // moving this to the summoned weapon + READ_SHORT 0x68 abil_num + FOR (index = 2 ; index < abil_num ; ++index) BEGIN // skip first two, as msword becomes msword14 + PATCH_IF index > 27 BEGIN SET sword = 0 END ELSE BEGIN SET sword = ((28 - index) / 2) END + LPF ALTER_EFFECT INT_VAR header = index match_opcode = 111 STR_VAR resource = EVAL ~msword%sword%~ END // should be 14x2 + END + + COPY_EXISTING ~msword.itm~ ~override~ + LPF ADD_ITEM_EQEFFECT INT_VAR opcode = 54 target = 1 parameter1 = 14 parameter2 = 1 timing = 2 END + + OUTER_FOR (index = sword ; index < 14 ; ++index) BEGIN + + COPY_EXISTING ~msword.itm~ ~override/msword%index%.itm~ + LPF ALTER_EFFECT INT_VAR match_opcode = 54 parameter1 = index END + + END + + // antimagic shell also needs to refer to new mordy swords + COPY_EXISTING ~%WIZARD_ANTIMAGIC_SHELL%.spl~ ~override~ + FOR (index = sword ; index < 14 ; ++index) BEGIN + LPF CLONE_EFFECT INT_VAR match_opcode = 112 STR_VAR match_resource = msword resource = EVAL ~msword%index%~ END + END + +///// \\\\\ +///// WIZARD_EXPEDITIOUS_RETREAT \\\\\ +///// \\\\\ + + // change 324 to 177 for immunities + COPY_EXISTING ~%WIZARD_EXPEDITIOUS_RETREAT%.spl~ ~override~ + LPF ALTER_EFFECT INT_VAR match_opcode = 324 opcode = 177 parameter1 = 20 parameter2 = 5 STR_VAR resource = cdixa126 END // class = monk + LPF ALTER_EFFECT INT_VAR match_opcode = 126 parameter2 = 2 END // mode 5 not available on oBG2 + +///// \\\\\ +///// WIZARD_SHADOW_MONSTERS \\\\\ +///// \\\\\ + + // change to oBG2 summoning, add graphical effect + COPY_EXISTING ~%WIZARD_SHADOW_MONSTERS%.spl~ ~override~ + LPF CLONE_EFFECT INT_VAR match_opcode = 331 opcode = 215 parameter2 = 2 timing = 0 duration = 1 STR_VAR resource = msumm1h END // add animation + READ_SHORT 0x68 abil_num + LPF ALTER_EFFECT INT_VAR header = 0 match_opcode = 331 opcode = 127 parameter1 = 1 parameter2 = 0 dicesize = 0 dicenumber = 0 STR_VAR resource = smonste END + FOR (index = 1 ; index < abil_num ; ++index) BEGIN + LPF ALTER_EFFECT INT_VAR header = index match_opcode = 331 opcode = 127 parameter1 = (index + 7) parameter2 = 0 dicesize = 0 dicenumber = 0 STR_VAR resource = smonste END + END + +///// \\\\\ +///// WIZARD_DEMI_SHADOW_MONSTERS \\\\\ +///// \\\\\ + + // change to oBG2 summoning, add graphical effect + COPY_EXISTING ~%WIZARD_DEMI_SHADOW_MONSTERS%.spl~ ~override~ + LPF CLONE_EFFECT INT_VAR match_opcode = 331 opcode = 215 parameter2 = 2 timing = 0 duration = 1 STR_VAR resource = msumm1h END // add animation + READ_SHORT 0x68 abil_num + LPF ALTER_EFFECT INT_VAR header = 0 match_opcode = 331 opcode = 127 parameter1 = 1 parameter2 = 0 dicesize = 0 dicenumber = 0 STR_VAR resource = dsmonst END + FOR (index = 1 ; index < abil_num ; ++index) BEGIN + LPF ALTER_EFFECT INT_VAR header = index match_opcode = 331 opcode = 127 parameter1 = (index + 9) parameter2 = 0 dicesize = 0 dicenumber = 0 STR_VAR resource = dsmonst END + END + +///// \\\\\ +///// WIZARD_LICH_TOUCH \\\\\ +///// \\\\\ + + // undead immune to extra cold damage/hold from lich touch + COPY_EXISTING ~ltouch.itm~ ~override~ + LPF ALTER_EFFECT INT_VAR match_opcode = 324 opcode = 177 parameter1 = 4 parameter2 = 3 STR_VAR resource = cdixa626 END // general = undead + +///// \\\\\ +///// WIZARD_SHADES \\\\\ +///// \\\\\ + + // change to oBG2 summoning, add graphical effect + COPY_EXISTING ~%WIZARD_SHADES%.spl~ ~override~ + LPF CLONE_EFFECT INT_VAR match_opcode = 331 opcode = 215 parameter2 = 2 timing = 0 duration = 1 STR_VAR resource = msumm1h END // add animation + READ_SHORT 0x68 abil_num + LPF ALTER_EFFECT INT_VAR header = 0 match_opcode = 331 opcode = 127 parameter1 = 1 parameter2 = 0 dicesize = 0 dicenumber = 0 STR_VAR resource = shades END + FOR (index = 1 ; index < abil_num ; ++index) BEGIN + LPF ALTER_EFFECT INT_VAR header = index match_opcode = 331 opcode = 127 parameter1 = (index + 12) parameter2 = 0 dicesize = 0 dicenumber = 0 STR_VAR resource = shades END + END + +///// \\\\\ +///// WIZARD_MALAVONS_RAGE \\\\\ +///// \\\\\ + + COPY_EXISTING ~%WIZARD_MALAVONS_RAGE%.spl~ ~override~ + LPF CD_SPLIT_SAVE_DAMAGE END + +///// \\\\\ +///// WIZARD_MORDENKAINENS_FORCE_MISSILES \\\\\ +///// \\\\\ + +COPY_EXISTING ~%WIZARD_MORDENKAINENS_FORCE_MISSILES%.spl~ ~override~ + LPF ALTER_EFFECT INT_VAR match_opcode = 333 opcode = 146 parameter1 = 0 parameter2 = 1 END // change to concussive AoE cast + READ_SHORT 0x68 abil_num // now swap over to magic missile projectile + SET proj = 68 + SET proj_inc = 0 + FOR (index = 0 ; index < abil_num ; ++index) BEGIN + PATCH_IF proj < 72 BEGIN + SET proj_inc += 1 + PATCH_IF proj_inc = 4 BEGIN SET proj_inc = 1 SET proj += 1 END + END + LPF ALTER_SPELL_HEADER INT_VAR header = (index +1) projectile = proj END + END + +///// \\\\\ +///// WIZARD_SHOUT \\\\\ +///// \\\\\ + + ADD_PROJECTILE ~%obg2_res_path%/cdi315a.pro~ // Animation at speed = 25 + ADD_PROJECTILE ~%obg2_res_path%/cdi315b.pro~ // Animation at speed = 15 + COPY_EXISTING ~idpro315.pro~ ~override~ + WRITE_BYTE 0x217 255 + + COPY_EXISTING ~%WIZARD_SHOUT%.spl~ ~override/cdia431c.spl~ // move main spell to c + WRITE_LONG 0x08 "-1" // name + WRITE_LONG 0x50 "-1" // desc + LPF CD_SPLIT_SAVE_DAMAGE END + + COPY_EXISTING ~%WIZARD_SHOUT%.spl~ ~override~ // main spell now just casts three subspells + LPF ALTER_SPELL_HEADER INT_VAR projectile = 1 END + LPF DELETE_EFFECT END // delete all existing effects + PATCH_FOR_EACH letter IN a b c BEGIN + LPF ADD_SPELL_EFFECT INT_VAR opcode = 148 target = 1 parameter2 = 1 STR_VAR resource = EVAL ~cdia431%letter%~ END + END + + COPY ~%obg2_res_path%/cdia431a.spl~ ~override~ + LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi315a END + + COPY ~%obg2_res_path%/cdia431a.spl~ ~override/cdia431b.spl~ + LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi315b END + +///// \\\\\ +///// WIZARD_GREAT_SHOUT \\\\\ +///// \\\\\ + + COPY_EXISTING ~idpro319.pro~ ~override~ + WRITE_BYTE 0x217 255 + + COPY_EXISTING ~cdi315a.pro~ ~override/cdi319a.pro~ + ~cdi315b.pro~ ~override/cdi319b.pro~ + WRITE_ASCII 0x10 ~#ff_m101~ #8 + + ADD_PROJECTILE ~override/cdi319a.pro~ + ADD_PROJECTILE ~override/cdi319b.pro~ + + COPY_EXISTING ~%WIZARD_GREAT_SHOUT%.spl~ ~override/cdia806c.spl~ // move main spell to c + WRITE_LONG 0x08 "-1" // name + WRITE_LONG 0x50 "-1" // desc + LPF CD_SPLIT_SAVE_DAMAGE END + + COPY_EXISTING ~%WIZARD_GREAT_SHOUT%.spl~ ~override~ // main spell now just casts three subspells + LPF ALTER_SPELL_HEADER INT_VAR projectile = 1 END + LPF DELETE_EFFECT END // delete all existing effects + PATCH_FOR_EACH letter IN a b c BEGIN + LPF ADD_SPELL_EFFECT INT_VAR opcode = 148 target = 1 parameter2 = 1 STR_VAR resource = EVAL ~cdia806%letter%~ END + END + + COPY ~%obg2_res_path%/cdia431a.spl~ ~override/cdia806a.spl~ + LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi319a END + + COPY ~%obg2_res_path%/cdia431a.spl~ ~override/cdia806b.spl~ + LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi319b END + +///// \\\\\ +///// obg2 graphical fixes \\\\\ +///// \\\\\ + + COPY_EXISTING ~msumm1x.vvc~ ~override~ + WRITE_LONG 0x2c "-100" // y-coordinate + WRITE_LONG 0x4c "-1" // z-coordinate + + + // 3d blend flag in VVCs cause them to be virtually transparent in oBG2 + ACTION_FOR_EACH file IN + ~#antishl~ ~#fireau~ ~#frostau~ ~#genench~ ~#malrage~ ~#ssswarm~ abjurh acidh alterh caelemx + ceelemx cfelemx cwelemx enchah invoch mfmissx msumm1x mswordh necroh ofspheh paralh soflamc vspherx + BEGIN + + COPY_EXISTING ~%file%.vvc~ ~override~ + WRITE_SHORT 0x18 (THIS BAND `BIT9) + + END + + // ee BAMs have horrible black auras on everything that show up w/o 3d enabled in oBG2; use original IWD BAMs instead + ACTION_FOR_EACH file IN + abjurh acidh alterh amshelc astorma astormx ceelemx cfelemx cwelemx enchah enchanx fiaurac + fraurac gshoutt icelant invoch lodisrt mfmisst mfmissx mrageh mragex msumm1h msumm1x mswordh + necroh ofsphet shoutt soflamc ssswarr ssswart ssswarx suffoca vsphert vspherx + BEGIN + + COPY ~%obg2_res_path%/%file%.bam~ ~override~ + + END + +END + +///// \\\\\ +///// compatibility w/ SR NWN-style Deflection \\\\\ +///// \\\\\ + +// courtesy of subtledoctor +OUTER_SET $arcane_aoe_spell(~WIZARD_SNILLOCS_SNOWBALL_SWARM~)=1 +OUTER_SET $arcane_aoe_spell(~WIZARD_EMOTION_FEAR~)=1 +OUTER_SET $arcane_aoe_spell(~WIZARD_MALAVONS_RAGE~)=1 +OUTER_SET $arcane_aoe_spell(~WIZARD_ACID_STORM~)=1 +OUTER_SET $arcane_aoe_spell(~WIZARD_SHOUT~)=1 +OUTER_SET $arcane_aoe_spell(~WIZARD_GREAT_SHOUT~)=1 + +ACTION_IF enhanced_edition BEGIN + + OUTER_SET $arcane_aoe_spell(~WIZARD_SOUL_EATER~)=1 + +END + +ACTION_IF MOD_IS_INSTALLED ~spell_rev.tp2~ ~55~ BEGIN + + ACTION_PHP_EACH arcane_aoe_spell AS spell_name => r2 BEGIN + + OUTER_SET spell_num = (IDS_OF_SYMBOL (~spell~ ~%spell_name%~)) + ACTION_IF spell_num > 0 BEGIN + OUTER_SNPRINT 1 spell_type ~%spell_num%~ + OUTER_SNPRINT (0 - 3) type_num ~%spell_num%~ + ACTION_IF spell_type = 2 BEGIN + OUTER_SPRINT i2 ~spwi%type_num%~ + + OUTER_SET found=0 + OUTER_SPRINT letter ~d~ + ACTION_FOR_EACH char_check IN d e f g h i j k l m BEGIN + ACTION_IF found=0 BEGIN + ACTION_IF NOT FILE_EXISTS_IN_GAME ~%i2%%char_check%.spl~ BEGIN + OUTER_SET found=1 + OUTER_SPRINT letter ~%char_check%~ + END + END + END + + ACTION_IF found && r2 && (FILE_EXISTS_IN_GAME ~%i2%.spl~) BEGIN + PRINT ~%i2% is arcane AoE~ + COPY_EXISTING ~%i2%.spl~ ~override/%i2%%letter%.spl~ // cloning original into the secondary spell + WRITE_ASCII 0x8 ~~ (8) // clearing out the name + GET_OFFSET_ARRAY headers 0x64 4 0x68 2 0 0 0x28 + PHP_EACH headers AS i => r BEGIN + WRITE_SHORT (r+0x0c) 1 // target = creature + WRITE_SHORT (r+0x26) 1 // projectile = none + END + BUT_ONLY + + COPY_EXISTING ~%i2%.spl~ ~override~ // modifying the original + READ_LONG 0x34 level + READ_LONG 0x64 ab_off + READ_SHORT 0x68 ab_num + READ_LONG 0x6a ef_off + READ_SHORT 0x70 cast_num // global effects aka casting features + + total_eff=cast_num + FOR (i=0;i demilich howl + LPF ALTER_EFFECT INT_VAR match_opcode = 206 STR_VAR match_resource = spwi806 resource = spin891 END // great shout > moon dog howl + LPF ALTER_EFFECT INT_VAR match_opcode = 206 STR_VAR match_resource = spin119 resource = spcl908 END // iwd great roar > war cry + +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +///// \\\\\ +///// and now, the non-ee conversions \\\\\ +///// \\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ + +ACTION_IF !enhanced_edition BEGIN + + //LAF CD_HANDLE_AUDIO_PREP END // at present, no new audio for bard songs + + // obg2 w/o fixpack's optional bard song fixes + ACTION_IF !FILE_EXISTS_IN_GAME ~fjbard.spl~ BEGIN + + COPY ~%obg2_res_path%/cdibard.spl~ ~override~ + WRITE_ASCIIE 0xae ~%BARD_SONG_BALLAD%~ #8 + + APPEND ~clabba01.2da~ ~ABILITYX AP_CDIBARD CDREPLACE~ + + COPY_EXISTING ~clabba01.2da~ ~override~ + COUNT_2DA_COLS cols + FOR (index = 1 ; index < cols ; ++index) BEGIN + REPLACE_TEXTUALLY ~CDREPLACE~ ~**** CDREPLACE~ + END + REPLACE_TEXTUALLY ~CDREPLACE~ ~****~ + PRETTY_PRINT_2DA + + END + + OUTER_SET icons = 0 + ACTION_IF MOD_IS_INSTALLED ~iwdification/setup-iwdification.tp2~ ~80~ BEGIN OUTER_SET icons = 1 END + + ACTION_CLEAR_ARRAY cd_bard_icons + ACTION_DEFINE_ASSOCIATIVE_ARRAY cd_bard_icons BEGIN + + ~%BARD_SONG_BALLAD%.spl~ => 183 + ~%BARD_SONG_CURRAN%.spl~ => 184 + ~%BARD_SONG_TYMORA%.spl~ => 185 + ~%BARD_SONG_KAUDIES%.spl~ => 186 + ~%BARD_SONG_SIREN%.spl~ => 187 + ~%BARD_SONG_SITH%.spl~ => 188 + + END + + ACTION_PHP_EACH cd_bard_icons AS song => new_icon BEGIN + + COPY_EXISTING ~%song%~ ~override~ + PATCH_IF icons BEGIN SET icon = new_icon END ELSE BEGIN SET icon = 40 END + LPF DELETE_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 66 END // oBG2 can't stop deafened characters from hearing + LPF DELETE_EFFECT INT_VAR match_opcode = 321 STR_VAR resource = EVAL ~%SOURCE_RES%~ END // remove EE no-stacking + LPF ALTER_EFFECT INT_VAR match_timing = 0 match_duration = 7 timing = 10 duration = 100 END // oBG2 round times + LPF CLONE_EFFECT INT_VAR match_opcode = 142 opcode = 206 parameter2 = 0 STR_VAR insert = last resource = EVAL ~%SOURCE_RES%~ END // re-apply no stacking + LPF ALTER_EFFECT INT_VAR match_opcode = 142 parameter2 = icon END // bard song icons + + END + + COPY_EXISTING ~%BARD_SONG_CURRAN%.spl~ ~override~ + LPF ALTER_EFFECT INT_VAR match_opcode = 318 opcode = 206 END // protections + LPF DELETE_EFFECT INT_VAR match_opcode = 321 END + + COPY_EXISTING ~%BARD_SONG_TYMORA%.spl~ ~override~ + LPF CD_CONVERT_325 END + + COPY ~%obg2_res_path%/immunity.eff~ ~override/cdixb118.eff~ + WRITE_ASCIIE 0x30 ~%BARD_SONG_SIREN%~ #8 + + COPY_EXISTING ~%BARD_SONG_SIREN%.spl~ ~override~ + LPF CLONE_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 4 parameter2 = 3 STR_VAR resource = cdixb118 END // general = undead + LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 144 parameter2 = 4 STR_VAR resource = cdixb118 END // race = golem + LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 19 opcode = 177 parameter1 = 3 parameter2 = 4 probability1 = 29 STR_VAR resource = cdixb118 END // half-elf charm protection + LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 15 opcode = 177 parameter1 = 2 parameter2 = 4 probability1 = 69 STR_VAR resource = cdixb118 END // elf charm protection + LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_target = 2 parameter2 = 55 END // stunned icon + LPF DELETE_EFFECT INT_VAR match_opcode = 232 END // no wake-on-hit + +END \ No newline at end of file diff --git a/iwdification/obg2_res/cd_divine_post.tpa b/iwdification/obg2_res/cd_divine_post.tpa new file mode 100644 index 0000000..61c29fa --- /dev/null +++ b/iwdification/obg2_res/cd_divine_post.tpa @@ -0,0 +1,1258 @@ +/* +//temp for when testing this as a standalone file + +OUTER_SET anim_beetle = 30720 +OUTER_SET truncate_at_level = 20 +OUTER_SPRINT spell_list divine_resrefs.txt + +OUTER_SPRINT CLERIC_CURSE SPPR116 +OUTER_SPRINT CLERIC_CAUSE_LIGHT_WOUNDS SPPR117 +OUTER_SPRINT CLERIC_SUNSCORCH SPPR118 +OUTER_SPRINT CLERIC_CURE_MODERATE_WOUNDS SPPR216 +OUTER_SPRINT CLERIC_ALICORN_LANCE SPPR217 +OUTER_SPRINT CLERIC_BEAST_CLAW SPPR218 +OUTER_SPRINT CLERIC_CAUSE_MODERATE_WOUNDS SPPR219 +OUTER_SPRINT CLERIC_PRAYER SPPR320 +OUTER_SPRINT CLERIC_CAUSE_DISEASE SPPR321 +OUTER_SPRINT CLERIC_EXALTATION SPPR322 +OUTER_SPRINT CLERIC_MOONBLADE SPPR323 +OUTER_SPRINT CLERIC_CIRCLE_OF_BONES SPPR324 +OUTER_SPRINT CLERIC_SPIKE_GROWTH SPPR325 +OUTER_SPRINT CLERIC_CLOUDBURST SPPR326 +OUTER_SPRINT CLERIC_STORM_SHELL SPPR327 +OUTER_SPRINT CLERIC_CAUSE_MEDIUM_WOUNDS SPPR328 +OUTER_SPRINT CLERIC_PRODUCE_FIRE SPPR418 +OUTER_SPRINT CLERIC_STATIC_CHARGE SPPR419 +OUTER_SPRINT CLERIC_RECITATION SPPR420 +OUTER_SPRINT CLERIC_BLOOD_RAGE SPPR421 +OUTER_SPRINT CLERIC_CLOUD_OF_PESTILENCE SPPR422 +OUTER_SPRINT CLERIC_UNFAILING_ENDURANCE SPPR423 +OUTER_SPRINT CLERIC_STAR_METAL_CUDGEL SPPR424 +OUTER_SPRINT CLERIC_THORN_SPRAY SPPR425 +OUTER_SPRINT CLERIC_RIGHTEOUS_WRATH_OF_THE_FAITHFUL SPPR518 +OUTER_SPRINT CLERIC_SPIKE_STONES SPPR519 +OUTER_SPRINT CLERIC_SHIELD_OF_LATHANDER SPPR520 +OUTER_SPRINT CLERIC_UNDEAD_WARD SPPR521 +OUTER_SPRINT CLERIC_ANIMAL_RAGE SPPR522 +OUTER_SPRINT CLERIC_MASS_CAUSE_LIGHT_WOUNDS SPPR523 +OUTER_SPRINT CLERIC_ENTROPY_SHIELD SPPR615 +OUTER_SPRINT CLERIC_WHIRLWIND SPPR616 +OUTER_SPRINT CLERIC_SYMBOL_PAIN SPPR733 +OUTER_SPRINT CLERIC_SYMBOL_HOPELESSNESS SPPR734 +OUTER_SPRINT CLERIC_IMPERVIOUS_SANCTITY_OF_MIND SPPR735 +OUTER_SPRINT CLERIC_DESTRUCTION SPPR736 +OUTER_SPRINT CLERIC_GREATER_SHIELD_OF_LATHANDER SPPR737 +OUTER_SPRINT CLERIC_MIST_OF_ELDATH SPPR738 +OUTER_SPRINT CLERIC_STALKER SPPR739 +OUTER_SPRINT CLERIC_ENERGY_DRAIN SPPR714 +OUTER_SPRINT CLERIC_CAUSE_SERIOUS_WOUNDS_IWD SPPR426 +OUTER_SPRINT CLERIC_CAUSE_CRITICAL_WOUNDS_IWD SPPR524 +OUTER_SPRINT CLERIC_GIANT_INSECT SPPR427 +OUTER_SPRINT CLERIC_WITHER SPPR740 +OUTER_SPRINT INNATE_BOMBARDIER_BEETLE_CLOUD SPIN128 +OUTER_SPRINT CLERIC_PHYSICAL_MIRROR SPPR525 +OUTER_SPRINT CLERIC_MOLD_TOUCH SPPR326 +*/ + +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +///// \\\\\ +///// first, some legit post-process fixes \\\\\ +///// \\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ + +// missing resources +COPY ~%obg2_res_path%/abjurh.bam~ ~override~ // for abjurh VVC + ~%obg2_res_path%/aft_p03.wav~ ~override~ // for entropy shield vvs + ~%obg2_res_path%/aft_p20.wav~ ~override~ // for shield of lathander vvc + ~%obg2_res_path%/aft_p25.wav~ ~override~ // for stormshell vvc + ~%obg2_res_path%/aft_p26.wav~ ~override~ // for greater shield of lathander vvc + ~%obg2_res_path%/eff_p101.wav~ ~override~ // for circle of bones vvc + ~%obg2_res_path%/eff_p104.wav~ ~override~ // for idpro307 projectile + ~%obg2_res_path%/eff_p105.wav~ ~override~ // for whirlwind projectile + ~%obg2_res_path%/eff_p107.wav~ ~override~ // for mold touch + ~%obg2_res_path%/eff_p32.wav~ ~override~ // for curseh vvc + ~%obg2_res_path%/eff_p42.wav~ ~override~ // for static charge subspell + ~%obg2_res_path%/eff_p48.wav~ ~override~ // for idpro213 projectile + ~%obg2_res_path%/eff_p50.wav~ ~override~ // for idpro277 projectile + ~%obg2_res_path%/paralh.bam~ ~override~ // for paralh VVC + +ACTION_IF enhanced_edition OR anim_beetle BEGIN // missing weapon for boring beetle + + COPY ~%obg2_res_path%/pincers.bam~ ~override~ + ~%obg2_res_path%/s5-20.itm~ ~override~ + +END + +// scrolls casting AoE via 148 need target = self +COPY_EXISTING ~%CLERIC_CURSE_SCROLL%.itm~ ~override~ + ~%CLERIC_SPIKE_GROWTH_SCROLL%.itm~ ~override~ + ~%CLERIC_CLOUDBURST_SCROLL%.itm~ ~override~ + ~%CLERIC_PRODUCE_FIRE_SCROLL%.itm~ ~override~ + ~%CLERIC_CLOUD_OF_PESTILENCE_SCROLL%.itm~ ~override~ + ~%CLERIC_THORN_SPRAY_SCROLL%.itm~ ~override~ + ~%CLERIC_GIANT_INSECT_SCROLL%.itm~ ~override~ + ~%CLERIC_SPIKE_STONES_SCROLL%.itm~ ~override~ + ~%CLERIC_WHIRLWIND_SCROLL%.itm~ ~override~ + ~%CLERIC_SYMBOL_PAIN_SCROLL%.itm~ ~override~ + ~%CLERIC_SYMBOL_HOPELESSNESS_SCROLL%.itm~ ~override~ + ~%CLERIC_MIST_OF_ELDATH_SCROLL%.itm~ ~override~ + ~%CLERIC_STALKER_SCROLL%.itm~ ~override~ + LPF ALTER_EFFECT INT_VAR match_opcode = 148 target = 1 END + IF_EXISTS // giant insect may not be here + +// energy drain scroll lacks icons +COPY_EXISTING ~%CLERIC_ENERGY_DRAIN_SCROLL%.itm~ ~override~ + WRITE_ASCII 0x3a ~spwi914a~ #8 + WRITE_ASCII 0x76 ~spwi914a~ #8 + +COPY_EXISTING ~%CLERIC_MASS_CAUSE_LIGHT_WOUNDS%.spl~ ~override~ + WRITE_LONG 0x1e (THIS BOR BIT31) // adds druid flag + +COPY_EXISTING ~%CLERIC_CLOUD_OF_PESTILENCE%.spl~ ~override~ + WRITE_LONG 0x1e (THIS BOR (BIT2 + BIT3)) // adds good, neutral flags + +COPY_EXISTING ~%CLERIC_SHIELD_OF_LATHANDER%.spl~ ~override~ + ~%CLERIC_GREATER_SHIELD_OF_LATHANDER%.spl~ ~override~ + WRITE_LONG 0x1e (THIS BOR BIT1) // adds evil flag + +// read in spell restrictions, apply to scrolls +COPY_EXISTING_REGEXP GLOB ~^cdid[1-7][0-4][0-9]\.itm$~ ~override~ + READ_ASCII 0xbe spell // abusing that the scrolls are static + PATCH_IF FILE_EXISTS_IN_GAME ~%spell%.spl~ BEGIN + INNER_ACTION BEGIN + COPY_EXISTING ~%spell%.spl~ ~override~ + READ_BYTE 0x1e align_flags + READ_BYTE 0x21 class_flags + SET druid = (class_flags & BIT7) // 0 if missing, BIT31 if not + SET cleric = (class_flags & BIT6) + SET align = (align_flags & 0b00111111) // sets bits 6 & 7 to zero + BUT_ONLY + END // inner_action + SET new_flags = align // alignment bits 0-5 are the same + PATCH_IF cleric BEGIN new_flags += (BIT7 + BIT8 + BIT9 + BIT14 + BIT15 + BIT20) END // cleric, c/m, c/t, f/c, f/m/c, pal + PATCH_IF druid BEGIN new_flags += (BIT12 + BIT21 + BIT30) END // druid, f/d, ranger + WRITE_LONG 0x1e (THIS BOR new_flags) + END + BUT_ONLY + +// removing arcane refs, re-added in cross-patch if needed +COPY_EXISTING ~%CLERIC_BLOOD_RAGE%.spl~ ~override~ + LPF DELETE_EFFECT INT_VAR match_opcode = 318 STR_VAR match_resource = spwi427 END // emotion hopelessness + LPF DELETE_EFFECT INT_VAR match_opcode = 318 STR_VAR match_resource = spwi428 END // emotion fear + LPF DELETE_EFFECT INT_VAR match_opcode = 318 STR_VAR match_resource = spwi429 END // emotion hope + +// removing arcane refs, re-added in cross-patch if needed +COPY_EXISTING ~%CLERIC_CLOUDBURST%.spl~ ~override~ + LPF ALTER_EFFECT INT_VAR match_opcode = 321 STR_VAR match_resource = firau1d6 resource = spwi403 END // fireshield blue + LPF ALTER_EFFECT INT_VAR match_opcode = 321 STR_VAR match_resource = firau1d2 resource = spwi418 END // fireshield red + LPF ALTER_EFFECT INT_VAR match_opcode = 206 STR_VAR match_resource = firau1d2 resource = sppr730d END // immue to aura of flaming death damage + LPF DELETE_EFFECT INT_VAR match_opcode = 321 END // old iwd refs + shroud of flame + +// removing arcane refs, re-added in cross-patch if needed +COPY_EXISTING ~%CLERIC_ENTROPY_SHIELD%.spl~ ~override~ + PATCH_FOR_EACH res IN sppr984 ~##wi033~ spwi327 BEGIN // old iwd flamestrike, 'generic abjuration' and icelance + LPF DELETE_EFFECT INT_VAR match_opcode = 318 STR_VAR match_resource = EVAL ~%res%~ END // old iwd refs + shroud of flame + END + +// bgee 2.6 includes this file, even though it's unused, so we patch just in case +COPY_EXISTING ~asumm1x.vvc~ ~override~ + WRITE_ASCII 0x78 ~#eff_m13~ + +// make sure summons have default scripting, don't drop items at a minimum +OUTER_SPRINT default wtasight +ACTION_IF FILE_EXISTS_IN_GAME bdsum00.bcs BEGIN OUTER_SPRINT default bdsum00 END // use ee's bdsum00 if available + +// build array of new summons; delete 2nd & 3rd columns for oBG2 summon tables, graphics will be specified as 215s in spells +ACTION_CLEAR_ARRAY cd_monster_summoning_script +COPY_EXISTING ~ginsect.2da~ ~override~ // giant insect + ~sshamb.2da~ ~override~ // stalker + COUNT_2DA_ROWS 4 rows + FOR (index = 0 ; index < rows ; ++index) BEGIN + READ_2DA_ENTRY index 1 4 file + DEFINE_ASSOCIATIVE_ARRAY cd_monster_summoning_script BEGIN ~%file%~ => ~%default%~ END + END + PATCH_IF !enhanced_edition BEGIN + REPLACE_TEXTUALLY ~[ %TAB%]+Hit\(Animation\)?[ %TAB%]+AreaHitAnimation~ ~~ + REPLACE_TEXTUALLY ~^\([0-9]+[ %TAB%]+[^ %TAB%]+\)[ %TAB%].+$~ ~\1~ + END + BUT_ONLY IF_EXISTS + +ACTION_PHP_EACH cd_monster_summoning_script AS file => script BEGIN + + COPY_EXISTING ~%file%.cre~ ~override~ + WRITE_ASCIIE 0x268 ~%default%~ #8 // default script + LPF ALTER_CREATURE_ITEM INT_VAR flag_unstealable = 1 flag_undroppable = 1 STR_VAR match_item = all END // summons shouldn't drop items + PATCH_IF !enhanced_edition BEGIN + LPF ADD_CRE_EFFECT INT_VAR opcode = 215 target = 1 parameter2 = 1 duration = 1 STR_VAR resource = msumm1h END + END + BUT_ONLY IF_EXISTS + +END + +// IWDEE bug: tie mold touch portrait to disease effect; +COPY_EXISTING ~%CLERIC_MOLD_TOUCH%.spl~ ~override~ + ~%CLERIC_MOLD_TOUCH%b.spl~ ~override~ + LPF DELETE_EFFECT INT_VAR match_opcode = 142 special = 7 END // delete portrait icons because... + LPF ALTER_EFFECT INT_VAR match_opcode = 78 special = 7 END // we're attaching them directly to the disease effect + LPF ALTER_EFFECT INT_VAR match_opcode = 78 match_parameter2 = 12 timing = 3 duration = 0 END // we're attaching them directly to the disease effect + +// IWDEE bug: tie mold touch portrait to disease effect; +COPY_EXISTING ~%CLERIC_MOLD_TOUCH%.spl~ ~override~ + LPF CLONE_EFFECT INT_VAR match_opcode = 78 match_parameter1 = 2 + opcode = 206 parameter1 = 0 parameter2 = 0 timing = 0 duration = 1 STR_VAR resource = EVAL ~%CLERIC_MOLD_TOUCH%~ END // we're attaching them directly to the disease effect + +// iwdee bug: blood rage can avoid fatigue with a re-cast - clone 321 into 206 then delete it; also block ops 18 and 98 +COPY_EXISTING ~%CLERIC_BLOOD_RAGE%.spl~ ~override~ + LPF CLONE_EFFECT INT_VAR match_opcode = 101 match_parameter2 = 17 STR_VAR insert = last END + LPF DELETE_EFFECT INT_VAR match_opcode = 101 match_parameter2 = 17 multi_match = 1 END + LPF CLONE_EFFECT INT_VAR match_opcode = 101 match_parameter2 = 17 parameter2 = 18 END + LPF CLONE_EFFECT INT_VAR match_opcode = 101 match_parameter2 = 17 parameter2 = 98 END + LPF CLONE_EFFECT INT_VAR match_opcode = 321 opcode = 206 timing = 0 duration = 120 STR_VAR match_resource = EVAL ~%CLERIC_BLOOD_RAGE%~ insert = last END + LPF DELETE_EFFECT INT_VAR match_opcode = 321 STR_VAR match_resource = EVAL ~%CLERIC_BLOOD_RAGE%~ END + +// iwdee fix: remove extraneous 321 +COPY_EXISTING ~%CLERIC_ANIMAL_RAGE%.spl~ ~override~ + LPF DELETE_EFFECT INT_VAR match_opcode = 321 match_timing = 4 END + +// iwdee fix: fix power levels +COPY_EXISTING ~%CLERIC_ANIMAL_RAGE%b.spl~ ~override~ + LPF ALTER_EFFECT INT_VAR power = 0 END + +// iwdee fix: static charge dispellable, but the icon lives on +COPY_EXISTING ~%CLERIC_STATIC_CHARGE%.spl~ ~override~ + LPF ALTER_EFFECT INT_VAR match_opcode = 142 resist_dispel = 3 END + +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +///// \\\\\ +///// and now, the non-ee conversions \\\\\ +///// \\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ + +ACTION_IF enhanced_edition BEGIN + + COPY ~%obg2_res_path%/aft_p21.wav~ ~override~ // for womoonx, wall of moonlight + ~%obg2_res_path%/tra_56.wav~ ~override~ // for idpro302, smashing wave + ~%obg2_res_path%/tra_59.wav~ ~override~ // for idpro312, spiritual wrath + ~%obg2_res_path%/sppr616a.bam~ ~override/%CLERIC_SPIRITUAL_WRATH%a.bam~ // spiritual wrath bam + + ACTION_IF ((MOD_IS_INSTALLED ~iwdification/setup-iwdification.tp2~ ~120~) AND (FILE_EXISTS ~iwdification/evasion/evasion_divine.2da~)) BEGIN + + INCLUDE ~iwdification/evasion/evasion.tpa~ + LAF cd_add_evasion STR_VAR 2da_file = ~iwdification/evasion/evasion_divine.2da~ END + + END + + // IWDEE bug wall of moonlight shouldn't have powers set on its damage since its AoE + COPY_EXISTING ~%CLERIC_WALL_OF_MOONLIGHT%.spl~ ~override~ + LPF ALTER_EFFECT INT_VAR resist_dispel = 1 END + + COPY_EXISTING ~%CLERIC_WALL_OF_MOONLIGHT%a.spl~ ~override~ + ~%CLERIC_WALL_OF_MOONLIGHT%b.spl~ ~override~ + LPF ALTER_EFFECT INT_VAR match_opcode = 12 power = 0 resist_dispel = 0 END + +END ELSE BEGIN + +/* +Converting for non-EE is essentially two parts--exclusion of spells +that can't be converted (removed from arcane_resrefs.txt prior +to running this on oBG2) and then this, where we convert EE-only +opcodes to oBG2 counterparts. +*/ + + LAF CD_HANDLE_AUDIO_PREP END // ogg > wav conversions + +///// \\\\\ +///// moved spells \\\\\ +///// \\\\\ + + // these are hidden on EE via hidespel; have to use flags on oBG2 + COPY_EXISTING ~sppr414.spl~ ~override~ // cause serious wounds (using IWD alt) + ~sppr510.spl~ ~override~ // cause critical wounds (using IWD alt) + ~sppr613.spl~ ~override~ // physical mirror (now at level 5) + WRITE_LONG 0x1e (THIS BOR (BIT30 + BIT31)) // adds cleric/pal and druid/ran flags, effectively excluding it from all divine casters + + +///// \\\\\ +///// creature animations \\\\\ +///// \\\\\ + + ACTION_IF MOD_IS_INSTALLED ~INFINITYANIMATIONS/SETUP-INFINITYANIMATIONS.TP2~ ~500~ BEGIN // 'more base animations' + + ACTION_IF IDS_OF_SYMBOL (~animate~ ~BEETLE_BLACK~) > 0 THEN BEGIN + OUTER_SET anim_beetle = IDS_OF_SYMBOL (~animate~ ~BEETLE_BLACK~) + END + + END + + ACTION_IF anim_beetle BEGIN // only set if animation is present, otherwise never installed + + COPY_EXISTING ~gisbomb.cre~ ~override~ + ~gisborb.cre~ ~override~ + WRITE_LONG 0x28 anim_beetle + + END + +///// \\\\\ +///// immunity effs \\\\\ +///// \\\\\ + + // generating immunity EFFs for various 324 replacements + ACTION_CLEAR_ARRAY cd_immunity_eff + ACTION_DEFINE_ASSOCIATIVE_ARRAY cd_immunity_eff BEGIN + + ~%CLERIC_SUNSCORCH%c~ => cdixd116 // undead/myconids immune to normie sunscorch + ~%CLERIC_MOLD_TOUCH%~ => cdix326 + ~%CLERIC_MOLD_TOUCH%b~ => cdix326b + ~%CLERIC_BLOOD_RAGE%~ => cdixd422 + ~%CLERIC_CLOUD_OF_PESTILENCE%b~ => cdixd423 + ~%CLERIC_SHIELD_OF_LATHANDER%~ => cdixd520 + cdid617b => cdixd617 // whirlwind + ~%CLERIC_SYMBOL_PAIN%~ => cdixd714 + ~%CLERIC_SYMBOL_HOPELESSNESS%~ => cdixd716 + ~%CLERIC_DESTRUCTION%~ => cdixd734 + ~%CLERIC_GREATER_SHIELD_OF_LATHANDER%~ => cdixd735 + cdishmbl => cdixd737 // entangle from smabling mound (via stalker) + ~%CLERIC_ENERGY_DRAIN%~ => cdixd739 + + END + + ACTION_PHP_EACH cd_immunity_eff AS imm => file BEGIN + + COPY ~%obg2_res_path%/immunity.eff~ ~override/%file%.eff~ + WRITE_ASCIIE 0x30 ~%imm%~ #8 + + END + +///// \\\\\ +///// self-stacking protection \\\\\ +///// \\\\\ + + // EE generally uses self-referential 321s for better spell stacking + // oBG2 has to use 206, which we clone from an existing opcode + ACTION_CLEAR_ARRAY cd_206_clone + ACTION_DEFINE_ASSOCIATIVE_ARRAY cd_206_clone BEGIN + + ~%CLERIC_CURSE%~ => 54 // thac0 bonus + ~#prayerb~ => 54 // thac0 bonus + ~#prayerg~ => 54 // thac0 bonus + ~#reciteb~ => 54 // thac0 bonus + ~#reciteg~ => 54 // thac0 bonus + ~%CLERIC_CIRCLE_OF_BONES%~ => 176 // movement speed + ~%CLERIC_BLOOD_RAGE%~ => 3 // berserk + ~%CLERIC_SHIELD_OF_LATHANDER%~ => 101 // immunity to damage + ~%CLERIC_ANIMAL_RAGE%~ => 3 // berserk + ~sppr203d~ => 131 // chant + ~sppr203e~ => 137 // bad chant + ~%CLERIC_SYMBOL_PAIN%~ => 54 // thac0 bonus + + END + + ACTION_PHP_EACH cd_206_clone AS file => clone_op BEGIN + + COPY_EXISTING ~%file%.spl~ ~override~ + LPF CLONE_EFFECT INT_VAR match_opcode = clone_op opcode = 206 parameter1 = 0 parameter2 = 0 STR_VAR insert = last resource = EVAL ~%file%~ END + + END + +///// \\\\\ +///// op 8/9 with 255 \\\\\ +///// \\\\\ + + // EEs allow these ops to target 255 'full body'; need to convert to series of smaller targets + COPY_EXISTING ~#prayerb.spl~ ~override~ + ~#prayerg.spl~ ~override~ + ~#reciteb.spl~ ~override~ + ~#reciteg.spl~ ~override~ + ~%CLERIC_CURSE%.spl~ ~override~ + ~sppr203d.spl~ ~override~ + ~sppr203e.spl~ ~override~ + ~%CLERIC_ALICORN_LANCE%.spl~ ~override~ + ~%CLERIC_BLOOD_RAGE%.spl~ ~override~ + ~%CLERIC_RIGHTEOUS_WRATH_OF_THE_FAITHFUL%a.spl~ ~override~ + ~%CLERIC_RIGHTEOUS_WRATH_OF_THE_FAITHFUL%b.spl~ ~override~ + ~%CLERIC_ANIMAL_RAGE%.spl~ ~override~ + ~%CLERIC_ENTROPY_SHIELD%.spl~ ~override~ + ~%CLERIC_IMPERVIOUS_SANCTITY_OF_MIND%.spl~ ~override~ + LPF CD_CONVERT_9_255 END + +///// \\\\\ +///// op 61 \\\\\ +///// \\\\\ + + // op 61 crashes oBG2, so convert it to seven op 50s for body glow + COPY_EXISTING ~%CLERIC_CAUSE_LIGHT_WOUNDS%.spl~ ~override~ + ~%CLERIC_BEAST_CLAW%.spl~ ~override~ + ~%CLERIC_CAUSE_MODERATE_WOUNDS%.spl~ ~override~ + ~%CLERIC_CAUSE_DISEASE%.spl~ ~override~ + ~%CLERIC_MOONBLADE%.spl~ ~override~ + ~%CLERIC_CAUSE_MEDIUM_WOUNDS%.spl~ ~override~ + ~%CLERIC_BLOOD_RAGE%.spl~ ~override~ + ~%CLERIC_UNFAILING_ENDURANCE%.spl~ ~override~ + ~%CLERIC_STAR_METAL_CUDGEL%.spl~ ~override~ + ~%CLERIC_CAUSE_SERIOUS_WOUNDS_IWD%.spl~ ~override~ + ~%CLERIC_ANIMAL_RAGE%.spl~ ~override~ + ~%CLERIC_MASS_CAUSE_LIGHT_WOUNDS%.spl~ ~override~ + ~%CLERIC_CAUSE_CRITICAL_WOUNDS_IWD%.spl~ ~override~ + ~%CLERIC_ENTROPY_SHIELD%.spl~ ~override~ + ~%CLERIC_ENERGY_DRAIN%.spl~ ~override~ + ~%CLERIC_SYMBOL_PAIN%.spl~ ~override~ + ~%CLERIC_IMPERVIOUS_SANCTITY_OF_MIND%.spl~ ~override~ + ~%CLERIC_WITHER%.spl~ ~override~ + ~moonbla.itm~ ~override~ + ~smcudge.itm~ ~override~ + LPF CD_CONVERT_61 END + +///// \\\\\ +///// portrait icons, op 142 \\\\\ +///// \\\\\ + + // portrait icons that use IWD-exclusive icons get remapped if + // an existing icon works, otherwise get deleted + ACTION_CLEAR_ARRAY cd_icon_map + ACTION_DEFINE_ASSOCIATIVE_ARRAY cd_icon_map BEGIN + + ~#prayerg.spl~ => 18 // prayer > chant + ~#reciteg.spl~ => 18 // recitation > chant + ~%CLERIC_EXALTATION%.spl~ => "-1" // exaltation > delete + ~%CLERIC_CIRCLE_OF_BONES%.spl~ => "-1" // circle of bones > delete + ~%CLERIC_STORM_SHELL%.spl~ => "-1" // storm shield > delete + ~%CLERIC_STATIC_CHARGE%.spl~ => "-1" // static charge > delete + ~%CLERIC_BLOOD_RAGE%.spl~ => 4 // blood rage to berserk + ~%CLERIC_SHIELD_OF_LATHANDER%.spl~ => "-1" // shield o' lathander > delete + ~%CLERIC_ANIMAL_RAGE%.spl~ => 83 // animal rage > spell failure + ~%CLERIC_ENTROPY_SHIELD%.spl~ => 56 // entropy shield > regeneration + ~%CLERIC_SYMBOL_PAIN%.spl~ => "-1" // pain > delete + ~%CLERIC_GREATER_SHIELD_OF_LATHANDER%.spl~ => "-1" // greater shield o' lathander > delete + + END + + ACTION_PHP_EACH cd_icon_map AS file => icon BEGIN + + COPY_EXISTING ~%file%~ ~override~ + PATCH_IF icon < 0 BEGIN + LPF DELETE_EFFECT INT_VAR match_opcode = 142 END + END ELSE BEGIN + LPF ALTER_EFFECT INT_VAR match_opcode = 142 parameter2 = icon END + END + + END + +///// \\\\\ +///// op 325 \\\\\ +///// \\\\\ + + // convert 325 to individual save opcodes + COPY_EXISTING ~#prayerb.spl~ ~override~ + ~#prayerg.spl~ ~override~ + ~#reciteb.spl~ ~override~ + ~#reciteg.spl~ ~override~ + ~%CLERIC_CURSE%.spl~ ~override~ + ~sppr203d.spl~ ~override~ + ~sppr203e.spl~ ~override~ + ~%CLERIC_RIGHTEOUS_WRATH_OF_THE_FAITHFUL%a.spl~ ~override~ + ~%CLERIC_RIGHTEOUS_WRATH_OF_THE_FAITHFUL%b.spl~ ~override~ + ~%CLERIC_ANIMAL_RAGE%.spl~ ~override~ + ~%CLERIC_ENTROPY_SHIELD%.spl~ ~override~ + LPF CD_CONVERT_325 END + +///// \\\\\ +///// CAUSE_BAD_THINGS \\\\\ +///// \\\\\ + + // grouping these together as the preventions all work similarly + ACTION_CLEAR_ARRAY cd_immunity_cause + ACTION_DEFINE_ASSOCIATIVE_ARRAY cd_immunity_cause BEGIN + + ~%CLERIC_CAUSE_LIGHT_WOUNDS%~ => cdixd114 + ~%CLERIC_CAUSE_MODERATE_WOUNDS%~ => cdixd220 + ~%CLERIC_CAUSE_DISEASE%~ => cdixd320 + ~%CLERIC_CAUSE_MEDIUM_WOUNDS%~ => cdixd330 + ~%CLERIC_CAUSE_SERIOUS_WOUNDS_IWD%~ => cdixd414 + ~%CLERIC_CAUSE_CRITICAL_WOUNDS_IWD%~ => cdixd510 + ~%CLERIC_MASS_CAUSE_LIGHT_WOUNDS%~ => cdixd523 + + END + + ACTION_PHP_EACH cd_immunity_cause AS spell => eff BEGIN + + // create the eff + COPY ~%obg2_res_path%/immunity.eff~ ~override/%eff%.eff~ + WRITE_ASCIIE 0x30 ~%spell%~ #8 + + COPY_EXISTING ~%spell%.spl~ ~override~ + LPF CLONE_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 144 parameter2 = 4 STR_VAR resource = EVAL ~%eff%~ END // race = golem + LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 4 parameter2 = 3 STR_VAR resource = EVAL ~%eff%~ END // general = undead + LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 104 opcode = 177 parameter2 = 4 STR_VAR resource = EVAL ~%eff%~ END // race = parameter1 + LPF CD_SPLIT_SAVE_DAMAGE END + + END + +///// \\\\\ +///// CLERIC_CURSE \\\\\ +///// \\\\\ + + COPY_EXISTING ~%CLERIC_CURSE%.spl~ ~override~ + LPF DELETE_EFFECT INT_VAR match_opcode = 321 END + +///// \\\\\ +///// CLERIC_SUNSCORCH \\\\\ +///// \\\\\ + + // sunscorch d is for undead/myconids, sunscorch-c for the normies + COPY_EXISTING ~%CLERIC_SUNSCORCH%.spl~ ~override~ + LPF ALTER_EFFECT INT_VAR match_opcode = 326 opcode = 177 parameter1 = 164 parameter2 = 4 STR_VAR match_resource = EVAL ~%CLERIC_SUNSCORCH%c~ resource = cdixd116 END + LPF CLONE_EFFECT INT_VAR match_opcode = 177 STR_VAR resource = cdiad116 END + LPF CLONE_EFFECT INT_VAR match_opcode = 177 match_parameter1 = 164 match_parameter2 = 4 parameter1 = 4 parameter2 = 3 END + LPF ALTER_EFFECT INT_VAR match_opcode = 326 opcode = 146 parameter2 = 1 STR_VAR resource = EVAL ~%CLERIC_SUNSCORCH%c~ END + LPF ALTER_SPELL_HEADER INT_VAR projectile = 1 END + PATCH_FOR_EACH res IN cdid1151 cdid1152 cdid1153 cdid1154 BEGIN + LPF ADD_SPELL_EFFECT INT_VAR opcode = 215 target = 2 power = 1 timing = 1 resist_dispel = 3 STR_VAR resource = EVAL ~%res%~ END + END + + // cast sunscorsch-d + COPY ~%obg2_res_path%/cast.eff~ ~override/cdiad116.eff~ + WRITE_ASCIIE 0x30 ~%CLERIC_SUNSCORCH%d~ #8 + + COPY_EXISTING ~%CLERIC_SUNSCORCH%c.spl~ ~override~ + ~%CLERIC_SUNSCORCH%d.spl~ ~override~ + LPF CD_SPLIT_SAVE_DAMAGE END + + COPY ~%obg2_res_path%/cdid1151.vvc~ ~override~ + ~%obg2_res_path%/cdid1152.vvc~ ~override~ + ~%obg2_res_path%/cdid1153.vvc~ ~override~ + ~%obg2_res_path%/cdid1154.vvc~ ~override~ + ~%obg2_res_path%/cdisunsc.bam~ ~override~ + + // see if this projectile actually works in oBG2 + +///// \\\\\ +///// CLERIC_ALICORN_LANCE \\\\\ +///// \\\\\ + + // make subspell to prevent AC penalty stacking + COPY_EXISTING ~%CLERIC_ALICORN_LANCE%.spl~ ~override/%CLERIC_ALICORN_LANCE%b.spl~ + WRITE_LONG 0x08 "-1" // name + LPF ALTER_SPELL_HEADER INT_VAR projectile = 1 END + LPF DELETE_EFFECT INT_VAR match_opcode = 12 END + LPF DELETE_EFFECT INT_VAR match_opcode = 321 END + LPF CLONE_EFFECT INT_VAR match_opcode = 0 opcode = 206 parameter1 = 0 parameter2 = 0 STR_VAR insert = last resource = EVAL ~%CLERIC_ALICORN_LANCE%b~ END + + // farm out everything but damage to subspell + COPY_EXISTING ~%CLERIC_ALICORN_LANCE%.spl~ ~override~ + LPF ALTER_EFFECT INT_VAR match_opcode = 0 opcode = 146 parameter1 = 0 parameter2 = 1 timing = 1 duration = 0 STR_VAR resource = EVAL ~%CLERIC_ALICORN_LANCE%b~ END + PATCH_FOR_EACH op IN 8 139 174 321 BEGIN + LPF DELETE_EFFECT INT_VAR match_opcode = op END + END + LPF CD_SPLIT_SAVE_DAMAGE END + +///// \\\\\ +///// CLERIC_PRAYER \\\\\ +///// \\\\\ + + COPY_EXISTING ~#prayerb.spl~ ~override~ + ~#prayerg.spl~ ~override~ + LPF DELETE_EFFECT INT_VAR match_opcode = 321 END + +///// \\\\\ +///// CLERIC_EXALTATION \\\\\ +///// \\\\\ + + COPY_EXISTING ~%CLERIC_EXALTATION%.spl~ ~override~ + LPF DELETE_EFFECT INT_VAR match_opcode = 321 END + LPF ALTER_EFFECT INT_VAR match_opcode = 324 opcode = 206 target = 1 parameter1 = 0 parameter2 = 0 END // prevent self-cast + +///// \\\\\ +///// CLERIC_MOONBLADE \\\\\ +///// \\\\\ + + COPY_EXISTING ~moonbla.itm~ ~override~ + LPF DELETE_EFFECT INT_VAR match_opcode = 12 match_parameter1 = 0 END // delete undead damage, since it's going through an EFF + LPF ALTER_EFFECT INT_VAR match_opcode = 318 opcode = 177 parameter1 = 4 parameter2 = 3 timing = 1 duration = 0 STR_VAR resource = cdimoonb END + + COPY ~%obg2_res_path%/cdimoonb.eff~ ~override~ + +///// \\\\\ +///// CLERIC_CIRCLE_OF_BONES \\\\\ +///// \\\\\ + + COPY_EXISTING ~%CLERIC_CIRCLE_OF_BONES%.spl~ ~override~ + LPF DELETE_EFFECT INT_VAR match_opcode = 321 END // add self-stacking elsewhere + LPF ALTER_EFFECT INT_VAR match_opcode = 176 parameter2 = 2 END // mode 5 not available on oBG2 + + COPY_EXISTING ~%CLERIC_CIRCLE_OF_BONES%d.spl~ ~override~ + LPF DELETE_EFFECT INT_VAR match_opcode = 318 END // evasion + +///// \\\\\ +///// CLERIC_SPIKE_GROWTH \\\\\ +///// \\\\\ + + // make into a subspell for cloud treatment + COPY_EXISTING ~%CLERIC_SPIKE_GROWTH%.spl~ ~override/cdid324.spl~ + WRITE_LONG 0x08 "-1" // name + LPF ADD_SPELL_EFFECT INT_VAR opcode = 206 target = 2 duration = 6 STR_VAR resource = cdid324 END + + COPY_EXISTING ~%CLERIC_SPIKE_GROWTH%.spl~ ~override~ + LPF DELETE_EFFECT END + LPF ALTER_SPELL_HEADER INT_VAR projectile = 1 END + LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 1 parameter2 = 2 timing = 1 parameter2 = 2 STR_VAR resource = cdid324 END + LPF ADD_SPELL_EFFECT INT_VAR opcode = 215 target = 2 duration = 3 STR_VAR resource = sgrowtx END + + COPY_EXISTING ~idpro300.pro~ ~override~ // remove graphics, repetitions from projectile + WRITE_SHORT 0x204 0 // trap size + WRITE_SHORT 0x210 0 // explosion freq + WRITE_BYTE 0x216 0 // reps + WRITE_BYTE 0x217 255 // explosion effect (none) + WRITE_BYTE 0x218 0 // explosion color + WRITE_ASCII 0x21c ~~ #8 // blank animation + + LAUNCH_ACTION_FUNCTION cd_create_cloud INT_VAR visloop = 5 cloud_dur = 60 STR_VAR code = cdid324 anim = sgrowta END + +///// \\\\\ +///// CLERIC_CLOUDBURST \\\\\ +///// \\\\\ + + // make into a subspell for cloud treatment + COPY_EXISTING ~%CLERIC_CLOUDBURST%.spl~ ~override/cdid325.spl~ + WRITE_LONG 0x08 "-1" // name + LPF DELETE_EFFECT INT_VAR match_opcode = 206 END // this prevents the final dam 12 for + LPF DELETE_EFFECT INT_VAR match_opcode = 324 END // evasion check + LPF DELETE_EFFECT INT_VAR match_opcode = 318 END // replaced as 177s below + LPF DELETE_EFFECT INT_VAR match_opcode = 12 dicesize = 3 END // magic damage routed through eff instead + LPF CD_SPLIT_SAVE_DAMAGE END + LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 2 power = 3 parameter1 = 187 parameter2 = 5 timing = 1 resist_dispel = 1 STR_VAR resource = cdid325c END // extra dam for class: fire elemental + LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 2 power = 3 parameter1 = 146 parameter2 = 5 timing = 1 resist_dispel = 1 STR_VAR resource = cdid325c END // extra dam for class: winter wolf + LPF ADD_SPELL_EFFECT INT_VAR opcode = 206 target = 2 duration = 6 STR_VAR resource = cdid325 END + + COPY_EXISTING ~%CLERIC_CLOUDBURST%.spl~ ~override~ + LPF DELETE_EFFECT END + LPF ALTER_SPELL_HEADER INT_VAR projectile = 1 END + LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 1 parameter2 = 2 timing = 1 parameter2 = 2 STR_VAR resource = cdid325 END + + COPY_EXISTING ~idpro301.pro~ ~override~ // remove graphics, repetitions from projectile + WRITE_SHORT 0x00a 20 // speed + WRITE_BYTE 0x133 0 // face target + WRITE_SHORT 0x204 0 // trap size + WRITE_SHORT 0x210 0 // explosion freq + WRITE_BYTE 0x216 0 // reps + WRITE_BYTE 0x217 255 // explosion effect (none) + WRITE_BYTE 0x218 0 // explosion color + + LAUNCH_ACTION_FUNCTION cd_create_cloud INT_VAR visloop = 1 cloud_dur = 12 zosa = 1 STR_VAR code = cdid325 anim = cloudbh ssound = "are_p24" END + + COPY ~%obg2_res_path%/cdid325c.eff~ ~override~ // eff for 'fire- and cold-using' creature damage + + // since cloudburst is a mix of lightning and rain, adjust the visuals + COPY_EXISTING ~cdid325v.spl~ ~override~ + LPF ALTER_EFFECT INT_VAR match_probability1 = 100 probability1 = 19 probability2 = 0 END // 51-100 becomes 0-19 (3251) + LPF ALTER_EFFECT INT_VAR match_probability1 = 50 probability1 = 100 probability2 = 20 END // 0-50 becomes 20-100 (3250) + + COPY_EXISTING ~cdid3250.vvc~ ~override~ // 3250 becomes rain; 3251 already lightning + WRITE_ASCII 0x08 ~cloudba~ #8 + +///// \\\\\ +///// CLERIC_PRODUCE_FIRE \\\\\ +///// \\\\\ + + COPY_EXISTING ~%CLERIC_PRODUCE_FIRE%.spl~ ~override~ + LPF ADD_SPELL_EFFECT INT_VAR insert_point = 0 opcode = 215 target = 1 parameter2 = 2 timing = 1 resist_dispel = 3 STR_VAR resource = pfirex END + + COPY_EXISTING ~idpro215.pro~ ~override~ + WRITE_BYTE 0x133 0 // face target + WRITE_BYTE 0x217 255 // explosion effect (none) + +///// \\\\\ +///// CLERIC_STATIC_CHARGE \\\\\ +///// \\\\\ + + // in ee/oIWD static charge is a self-targeted recurring effect; best we + // can do for oBG2 is make it a single-target recurring damage spell + COPY_EXISTING ~%CLERIC_STATIC_CHARGE%.spl~ ~override~ + LPF ALTER_SPELL_HEADER INT_VAR target = 1 projectile = 1 range = 30 END + LPF DELETE_EFFECT INT_VAR match_opcode = 321 END + LPF ALTER_EFFECT INT_VAR target = 2 dicenumber = 0 dicesize = 0 END + LPF CD_CONVERT_333 STR_VAR 333spell = EVAL ~%CLERIC_STATIC_CHARGE%b~ END + + COPY_EXISTING ~%CLERIC_STATIC_CHARGE%b.spl~ ~override~ + LPF ALTER_SPELL_HEADER INT_VAR target = 1 projectile = 1 range = 30 END + LPF ALTER_EFFECT INT_VAR match_opcode = 12 dicenumber = 4 dicesize = 8 special = 0 END + LPF CLONE_EFFECT INT_VAR match_opcode = 12 dicenumber = 5 savingthrow = BIT24 END + LPF CD_EXTEND-O-MATIC INT_VAR base_dur = 0 step_dur = 0 level_cap = 20 min_lev_alt = 7 END + READ_SHORT 0x68 abil_num + FOR (index = 0 ; index < abil_num ; ++index) BEGIN + LPF ALTER_EFFECT INT_VAR header = index match_opcode = 12 match_savingthrow = BIT24 dicenumber = ((index + 9) / 2) END + LPF ALTER_EFFECT INT_VAR header = index match_opcode = 12 match_savingthrow = (BIT0 + BIT24) dicenumber = ((index + 10) / 2) END + END + + COPY_EXISTING ~cdid419.itm~ ~override~ + LPF ALTER_ITEM_HEADER INT_VAR target = 1 range = 30 END + +///// \\\\\ +///// CLERIC_RECITATION \\\\\ +///// \\\\\ + + COPY_EXISTING ~#reciteb.spl~ ~override~ + ~#reciteg.spl~ ~override~ + LPF DELETE_EFFECT INT_VAR match_opcode = 321 END + +///// \\\\\ +///// CLERIC_BLOOD_RAGE \\\\\ +///// \\\\\ + + COPY_EXISTING ~%CLERIC_BLOOD_RAGE%.spl~ ~override~ + LPF DELETE_EFFECT INT_VAR match_opcode = 321 END + LPF DELETE_EFFECT INT_VAR match_opcode = 324 END + LPF DELETE_EFFECT INT_VAR match_opcode = 328 END + LPF ALTER_EFFECT INT_VAR match_opcode = 318 opcode = 206 parameter1 = 0 parameter2 = 0 END + LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 2 power = 4 parameter1 = 16 parameter2 = 8 resist_dispel = 3 duration = 120 insert_point = 0 STR_VAR resource = cdixd422 END // lawful + PATCH_FOR_EACH ea IN 1 28 29 30 31 126 128 BEGIN // all ea values except charmed, controlled, ally, familiar, pc + LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 2 power = 4 parameter1 = ea parameter2 = 2 resist_dispel = 3 duration = 120 insert_point = 0 STR_VAR resource = cdixd42 END + END + +///// \\\\\ +///// CLERIC_CLOUD_OF_PESTILENCE \\\\\ +///// \\\\\ + + // copy meat to subspell that does the work + COPY_EXISTING ~%CLERIC_CLOUD_OF_PESTILENCE%.spl~ ~override/cdid423.spl~ + WRITE_LONG 0x08 "-1" // name + LPF ADD_SPELL_EFFECT INT_VAR opcode = 206 target = 2 duration = 6 STR_VAR resource = cdid423 END + LPF DELETE_EFFECT INT_VAR match_opcode = 318 END + LPF DELETE_EFFECT INT_VAR match_opcode = 321 END + LPF DELETE_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 39 END // class = paladin, but bg2 paladins don't have disease immunity + LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 9 opcode = 177 parameter1 = 145 parameter2 = 4 STR_VAR resource = cdixd423 END // race = elemental + LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 27 opcode = 177 parameter1 = 144 parameter2 = 4 STR_VAR resource = cdixd423 END // race = golem + LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 1 opcode = 177 parameter1 = 4 parameter2 = 3 STR_VAR resource = cdixd423 END // general = undead + + // strip main spell to caster-immunity and cloud creature creation + COPY_EXISTING ~%CLERIC_CLOUD_OF_PESTILENCE%.spl~ ~override~ + LPF ALTER_SPELL_HEADER INT_VAR projectile = 1 END + LPF DELETE_EFFECT END + LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 1 timing = 1 parameter2 = 2 STR_VAR resource = cdid423 END + LPF ADD_SPELL_EFFECT INT_VAR opcode = 206 target = 1 duration = 24 STR_VAR resource = cdid423 END + + LAUNCH_ACTION_FUNCTION cd_create_cloud INT_VAR visloop = 9 cloud_dur = 24 zosa = 1 STR_VAR code = cdid423 anim = copesta dsound = "are_p25" END + + COPY_EXISTING ~idpro309.pro~ ~override~ // remove graphics, repetitions from projectile + WRITE_SHORT 0x00a 96 // speed + WRITE_LONG 0x100 0 // blank flags + WRITE_SHORT 0x204 0 // trap size + WRITE_SHORT 0x210 0 // explosion freq + WRITE_BYTE 0x216 0 // reps + WRITE_BYTE 0x217 255 // explosion effect (none) + WRITE_BYTE 0x218 0 // explosion color + +///// \\\\\ +///// CLERIC_THORN_SPRAY \\\\\ +///// \\\\\ + + COPY_EXISTING ~%CLERIC_THORN_SPRAY%.spl~ ~override~ + LPF CD_SPLIT_SAVE_DAMAGE END + + COPY_EXISTING ~idpro303.pro~ ~override~ + WRITE_BYTE 0x217 11 // re-use cone of cold + WRITE_BYTE 0x218 0 + +///// \\\\\ +///// CLERIC_RIGHTEOUS_WRATH_OF_THE_FAITHFUL \\\\\ +///// \\\\\ + + COPY_EXISTING ~%CLERIC_RIGHTEOUS_WRATH_OF_THE_FAITHFUL%.spl~ ~override~ + LPF DELETE_EFFECT INT_VAR match_opcode = 318 END + LPF DELETE_EFFECT INT_VAR match_opcode = 146 STR_VAR match_resource = EVAL ~%CLERIC_RIGHTEOUS_WRATH_OF_THE_FAITHFUL%a~ END + PATCH_FOR_EACH align IN 17 18 19 33 34 35 49 50 51 BEGIN + LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 1 power = 5 parameter1 = align parameter2 = 8 timing = 1 resist_dispel = 3 STR_VAR resource = EVAL ~cdirwf%align%~ END + END + READ_LONG 0x64 abil_off + READ_SHORT abil_off + 0x26 proj + + COPY_EXISTING ~%CLERIC_RIGHTEOUS_WRATH_OF_THE_FAITHFUL%b.spl~ ~override~ // allies + LPF DELETE_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 184 END + PATCH_FOR_EACH op IN 321 8 174 215 18 93 BEGIN // cosmetics, sound, fatigue, hp bonus + LPF DELETE_EFFECT INT_VAR match_opcode = op END + END + PATCH_FOR_EACH op IN 54 33 34 35 36 37 BEGIN // already get +1 from 99, so only bump another +1 here + LPF ALTER_EFFECT INT_VAR match_opcode = op parameter1 = 1 END + END + LPF CLONE_EFFECT INT_VAR match_opcode = 54 opcode = 206 parameter1 = 0 parameter2 = 0 STR_VAR insert = last resource = EVAL ~%CLERIC_RIGHTEOUS_WRATH_OF_THE_FAITHFUL%b~ END + + COPY_EXISTING ~%CLERIC_RIGHTEOUS_WRATH_OF_THE_FAITHFUL%a.spl~ ~override~ // same alignment + LPF DELETE_EFFECT INT_VAR match_opcode = 321 END + LPF DELETE_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 184 END + LPF CLONE_EFFECT INT_VAR match_opcode = 54 opcode = 206 parameter1 = 0 parameter2 = 0 STR_VAR insert = last resource = EVAL ~%CLERIC_RIGHTEOUS_WRATH_OF_THE_FAITHFUL%a~ END + LPF CD_CONVERT_9_255 END + + COPY ~%obg2_res_path%/cast.eff~ ~override/cdirwf00.eff~ + WRITE_ASCIIE 0x30 ~%CLERIC_RIGHTEOUS_WRATH_OF_THE_FAITHFUL%a~ + + ACTION_FOR_EACH align IN 17 18 19 33 34 35 49 50 51 BEGIN + + COPY ~%obg2_res_path%/cast.eff~ ~override/cdirwf%align%.eff~ + WRITE_ASCIIE 0x30 ~cdirwf%align%~ + + COPY ~%obg2_res_path%/cdirwf17.spl~ ~override/cdirwf%align%.spl~ + WRITE_LONG 0x9e align + LPF ALTER_SPELL_HEADER INT_VAR projectile = proj END + + END + +///// \\\\\ +///// CLERIC_SPIKE_STONES \\\\\ +///// \\\\\ + + COPY_EXISTING ~%CLERIC_SPIKE_STONES%.spl~ ~override/cdid519.spl~ + WRITE_LONG 0x08 "-1" // name + LPF DELETE_EFFECT INT_VAR match_opcode = 321 END + LPF ALTER_EFFECT INT_VAR match_opcode = 126 parameter2 = 2 END // mode 5 not available on oBG2 + LPF ADD_SPELL_EFFECT INT_VAR opcode = 206 target = 2 duration = 6 STR_VAR resource = cdid519 END + + COPY_EXISTING ~%CLERIC_SPIKE_STONES%.spl~ ~override~ + LPF DELETE_EFFECT END + LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 1 timing = 1 parameter2 = 2 STR_VAR resource = cdid519 END + + LAUNCH_ACTION_FUNCTION cd_create_cloud INT_VAR visloop = 5 cloud_dur = 72 STR_VAR code = cdid519 anim = sstonea dsound = are_p04 END + + COPY_EXISTING ~idpro213.pro~ ~override~ // remove graphics, repetitions from projectile + WRITE_SHORT 0x00a 96 // speed + WRITE_LONG 0x100 0 // blank flags + WRITE_SHORT 0x204 0 // trap size + WRITE_SHORT 0x210 0 // explosion freq + WRITE_BYTE 0x216 0 // reps + WRITE_BYTE 0x217 255 // explosion effect (none) + WRITE_BYTE 0x218 0 // explosion color + + COPY ~%obg2_res_path%/sstonea.bam~ ~override~ + +///// \\\\\ +///// CLERIC_SHIELD_OF_LATHANDER \\\\\ +///// \\\\\ + + COPY_EXISTING ~%CLERIC_SHIELD_OF_LATHANDER%.spl~ ~override~ + LPF ALTER_EFFECT INT_VAR match_opcode = 324 opcode = 177 parameter1 = 3 parameter2 = 8 STR_VAR resource = cdixd520 END + +///// \\\\\ +///// CLERIC_UNDEAD_WARD \\\\\ +///// \\\\\ + + // simple enough, summons an invisible cleric to turn undead + COPY_EXISTING ~%CLERIC_UNDEAD_WARD%.spl~ ~override~ + LPF ALTER_SPELL_HEADER INT_VAR projectile = 1 END + LPF DELETE_EFFECT END + LPF ADD_SPELL_EFFECT INT_VAR opcode = 215 target = 1 power = 5 resist_dispel = 2 duration = 60 STR_VAR resource = uwardx END + LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 1 power = 5 parameter2 = 2 resist_dispel = 2 duration = 60 END + LPF CD_EXTEND-O-MATIC INT_VAR base_dur = 60 step_dur = 0 level_cap = truncate_at_level min_lev_alt = 9 END + READ_SHORT 0x68 abil_num + FOR (index = 9 ; index < (abil_num + 9) ; ++index) BEGIN + LPF ALTER_EFFECT INT_VAR header = (index - 9) match_opcode = 177 STR_VAR resource = EVAL ~cdiuwr%index%~ END + END + + COMPILE ~%obg2_res_path%/cdid521.baf~ + + OUTER_FOR (index = 9 ; index < (truncate_at_level + 1) ; ++index) BEGIN + + COPY ~%obg2_res_path%/cdiuwr9.eff~ ~override/cdiuwr%index%.eff~ + WRITE_ASCIIE 0x30 "%DEST_RES%" #8 + + COPY ~%obg2_res_path%/cdiuwr9.cre~ ~override/cdiuwr%index%.cre~ + WRITE_BYTE 0x234 index + + END + +///// \\\\\ +///// CLERIC_ANIMAL_RAGE \\\\\ +///// \\\\\ + + COPY_EXISTING ~%CLERIC_ANIMAL_RAGE%.spl~ ~override~ + LPF DELETE_EFFECT INT_VAR match_opcode = 321 END + LPF DELETE_EFFECT INT_VAR match_opcode = 324 END + LPF CD_CONVERT_333 END + PATCH_FOR_EACH ea IN 0 1 28 29 30 31 126 128 199 200 201 202 254 255 BEGIN // all ea values except charmed, controlled, ally, familiar, pc + LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 2 power = 4 parameter1 = ea parameter2 = 2 resist_dispel = 3 duration = 120 insert_point = 0 STR_VAR resource = cdixd42 END + END + +///// \\\\\ +///// CLERIC_ENTROPY_SHIELD \\\\\ +///// \\\\\ + + COPY_EXISTING ~%CLERIC_ENTROPY_SHIELD%.spl~ ~override~ + LPF DELETE_EFFECT INT_VAR match_opcode = 321 END + LPF ALTER_EFFECT INT_VAR match_opcode = 318 opcode = 206 END + // iwdee/bgee/bg2ee/vanilla all match in projectiles until the 1pp slots for EE, so remove 1pp refs for vanilla (EEs all match, fortunately) + FOR (index = 282 ; index < 319 ; ++index) BEGIN + LPF DELETE_EFFECT INT_VAR match_opcode = 83 match_parameter2 = index END + END + LPF DELETE_EFFECT INT_VAR match_opcode = 83 match_parameter2 = 331 END + LPF DELETE_EFFECT INT_VAR match_opcode = 83 match_parameter2 = 332 END + PATCH_IF FILE_EXISTS_IN_GAME ~1arow01.pro~ BEGIN // if 1pp is installed, re-add the references manually since they still may not sync with EE + PATCH_FOR_EACH proj IN // 1pp stuff + 1stafm0c 1arow01 1arow02 1arow03 1arow04 1arow05 1arow07 1arow10 1arow11 1arow15 1axe05 1axe08 1axe09 1axe10 1axe16 1bolt01 1bolt02 1bolt03 1bolt04 + 1bolt05 1bolt06 1bolt09 1bull02 1bull03 1bull04 1bull05 1bull06 1dagg05 1dagg11 1dagg12 1dagg16 1dart01 1dart02 1dart03 1dart04 1dart05 1dart08 + BEGIN + SET projids = IDS_OF_SYMBOL (~projectl~ ~%proj%~) + PATCH_IF projids > 0 BEGIN + LPF CLONE_EFFECT INT_VAR match_opcode = 83 match_parameter2 = 1 parameter2 = projids END + END + END + END + +///// \\\\\ +///// CLERIC_WHIRLWIND \\\\\ +///// \\\\\ + + // use circle of bones projectile, but increase AoE slightly + COPY_EXISTING ~smllarnc.pro~ ~override/cdwhirl.pro~ + WRITE_SHORT 0x204 100 + WRITE_SHORT 0x206 100 + ADD_PROJECTILE ~override/cdwhirl.pro~ + + // whirlwind is basically simulated by an invisible creature that random walks and applies visuals, cdid617b + COPY_EXISTING ~%CLERIC_WHIRLWIND%.spl~ ~override/cdid617b.spl~ + WRITE_LONG 0x08 "-1" + LPF ALTER_SPELL_HEADER INT_VAR projectile = cdwhirl END // use smallarc from circle of bones + LPF DELETE_EFFECT INT_VAR match_opcode = 318 END + LPF DELETE_EFFECT INT_VAR match_opcode = 324 END + LPF ADD_SPELL_EFFECT INT_VAR opcode = 265 target = 1 parameter1 = 1 timing = 1 insert_point = 0 STR_VAR resource = cdizosa END + LPF ADD_SPELL_EFFECT INT_VAR opcode = 273 target = 1 timing = 1 resist_dispel = 3 insert_point = 0 STR_VAR resource = cdizosa END + PATCH_FOR_EACH race IN 146 118 119 142 101 102 145 144 127 199 BEGIN // dragon, syverns, slimes, giants, ankheg, basilisk, elemental, golem, otyugh, ettin + LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 2 parameter1 = race parameter2 = 4 duration = 1 insert_point = 0 STR_VAR resource = cdixd617 END + END + + COPY_EXISTING ~%CLERIC_WHIRLWIND%.spl~ ~override~ + LPF ALTER_SPELL_HEADER INT_VAR projectile = 1 END + LPF DELETE_EFFECT END + LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 1 parameter2 = 2 resist_dispel = 2 duration = 120 STR_VAR resource = cdid617 END + + COMPILE ~%obg2_res_path%/cdid617.baf~ + + COPY ~%obg2_res_path%/cdid617.cre~ ~override~ + ~%obg2_res_path%/cdid617.eff~ ~override~ + ~%obg2_res_path%/cdid617b.eff~ ~override~ + ~%obg2_res_path%/whirlwx.vvc~ ~override~ + +///// \\\\\ +///// CLERIC_SYMBOL_PAIN \\\\\ +///// \\\\\ + + COPY_EXISTING ~%CLERIC_SYMBOL_PAIN%.spl~ ~override~ + LPF DELETE_EFFECT INT_VAR match_opcode = 321 END + LPF DELETE_EFFECT INT_VAR match_opcode = 328 END + LPF CLONE_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 144 parameter2 = 4 STR_VAR resource = cdixd714 END // race = golem + LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 4 parameter2 = 3 STR_VAR resource = cdixd714 END // general = undead + +///// \\\\\ +///// CLERIC_SYMBOL_HOPELESSNESS \\\\\ +///// \\\\\ + + COPY_EXISTING ~%CLERIC_SYMBOL_HOPELESSNESS%.spl~ ~override~ + LPF CLONE_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 144 parameter2 = 4 STR_VAR resource = cdixd716 END // race = golem + LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 4 parameter2 = 3 STR_VAR resource = cdixd716 END // general = undead + + COPY ~%obg2_res_path%/paralh.bam~ ~override~ + +///// \\\\\ +///// CLERIC_IMPERVIOUS_SANCTITY_OF_MIND \\\\\ +///// \\\\\ + + COPY_EXISTING ~%CLERIC_IMPERVIOUS_SANCTITY_OF_MIND%.spl~ ~override~ + LPF DELETE_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 170 END // do it here since there are multiple 142s + LPF DELETE_EFFECT INT_VAR match_opcode = 321 END + LPF ALTER_EFFECT INT_VAR match_opcode = 318 opcode = 206 parameter1 = 0 parameter2 = 0 END + +///// \\\\\ +///// CLERIC_DESTRUCTION \\\\\ +///// \\\\\ + + COPY_EXISTING ~%CLERIC_DESTRUCTION%.spl~ ~override~ + LPF ALTER_EFFECT INT_VAR match_opcode = 324 opcode = 177 parameter1 = 4 parameter2 = 3 STR_VAR resource = cdixd734 END // undead are immune + +///// \\\\\ +///// CLERIC_GREATER_SHIELD_OF_LATHANDER \\\\\ +///// \\\\\ + + COPY_EXISTING ~%CLERIC_GREATER_SHIELD_OF_LATHANDER%.spl~ ~override~ + LPF ALTER_EFFECT INT_VAR match_opcode = 324 opcode = 177 parameter1 = 3 parameter2 = 8 STR_VAR resource = cdixd735 END // evil are immune + +///// \\\\\ +///// CLERIC_MIST_OF_ELDATH \\\\\ +///// \\\\\ + + COPY_EXISTING ~%CLERIC_MIST_OF_ELDATH%.spl~ ~override/cdid736.spl~ + WRITE_LONG 0x08 "-1" // name + LPF ADD_SPELL_EFFECT INT_VAR opcode = 206 target = 2 duration = 6 STR_VAR resource = cdid736 END + + COPY_EXISTING ~%CLERIC_MIST_OF_ELDATH%.spl~ ~override~ + LPF ALTER_SPELL_HEADER INT_VAR projectile = 1 END + LPF DELETE_EFFECT END + LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 1 timing = 1 parameter2 = 2 STR_VAR resource = cdid736 END + + LAUNCH_ACTION_FUNCTION cd_create_cloud INT_VAR visloop = 7 cloud_dur = 6 zosa = 1 STR_VAR code = cdid736 anim = moeldaa dsound = eff_p104 END + + COPY_EXISTING ~idpro307.pro~ ~override~ + WRITE_SHORT 0x00a 96 // speed + WRITE_BYTE 0x133 0 // face target + WRITE_SHORT 0x204 0 // trap size + WRITE_SHORT 0x206 128 // explosion size + WRITE_SHORT 0x210 0 // explosion freq + WRITE_BYTE 0x216 0 // reps + WRITE_BYTE 0x217 255 // explosion effect + WRITE_BYTE 0x218 0 // explosion color + +///// \\\\\ +///// CLERIC_STALKER \\\\\ +///// \\\\\ + + COPY_EXISTING ~%CLERIC_STALKER%.spl~ ~override~ + + LPF CLONE_EFFECT INT_VAR match_opcode = 331 opcode = 215 parameter2 = 2 timing = 0 duration = 2 resist_dispel = 0 dicenumber = 0 dicesize = 0 STR_VAR resource = asumm1x END // add animation + LPF ALTER_EFFECT INT_VAR match_opcode = 331 opcode = 127 parameter1 = 22 parameter2 = 0 dicesize = 0 dicenumber = 0 STR_VAR resource = sshamb END + + COPY_EXISTING ~shmblr.itm~ ~override~ // remove all effects and move to spell + READ_LONG 0x64 abil_off + READ_LONG 0x6a fx_off + READ_SHORT abil_off + 0x1e abil_fx_num + READ_SHORT abil_off + 0x20 abil_fx_idx + READ_ASCII (fx_off + (abil_fx_idx * 0x30)) fx (abil_fx_num * 0x30) + LPF DELETE_EFFECT INT_VAR check_globals = 0 END + LPF ADD_ITEM_EFFECT INT_VAR type = 1 opcode = 177 target = 2 parameter1 = 4 parameter2 = 3 STR_VAR resource = cdixd737 END // general = undead + LPF ADD_ITEM_EFFECT INT_VAR type = 1 opcode = 177 target = 2 parameter1 = 144 parameter2 = 4 STR_VAR resource = cdixd737 END // race = golem + LPF ADD_ITEM_EFFECT INT_VAR type = 1 opcode = 177 target = 2 parameter1 = 145 parameter2 = 4 STR_VAR resource = cdixd737 END // race = elemental + LPF ADD_ITEM_EFFECT INT_VAR type = 1 opcode = 177 target = 2 parameter1 = 164 parameter2 = 4 STR_VAR resource = cdixd737 END // race = myconid + LPF ADD_ITEM_EFFECT INT_VAR type = 1 opcode = 146 target = 2 parameter2 = 1 STR_VAR resource = cdishmbl insert = last END + + COPY ~%obg2_res_path%/cdishmbl.spl~ ~override~ + READ_LONG 0x64 abil_off + READ_LONG 0x6a fx_off + READ_SHORT abil_off + 0x20 abil_fx_idx + WRITE_SHORT abil_off + 0x1e THIS + abil_fx_num + INSERT_BYTES (fx_off + (abil_fx_idx * 0x30)) (abil_fx_num * 0x30) + WRITE_ASCIIE (fx_off + (abil_fx_idx * 0x30)) ~%fx%~ + LPF DELETE_EFFECT INT_VAR match_opcode = 318 END + LPF DELETE_EFFECT INT_VAR match_opcode = 324 END + LPF ALTER_EFFECT INT_VAR match_opcode = 126 parameter2 = 2 END // mode 5 not available on oBG2 + +///// \\\\\ +///// CLERIC_ENERGY_DRAIN \\\\\ +///// \\\\\ + + COPY_EXISTING ~%CLERIC_ENERGY_DRAIN%.spl~ ~override~ + LPF CLONE_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 144 parameter2 = 4 STR_VAR resource = cdixd739 END // race = golem + LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 4 parameter2 = 3 STR_VAR resource = cdixd739 END // general = undead + LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 104 opcode = 177 parameter2 = 4 STR_VAR resource = cdixd739 END // race = parameter1 + +///// \\\\\ +///// CLERIC_GIANT_INSECT \\\\\ +///// \\\\\ + + ACTION_IF anim_beetle BEGIN // only proceed if animation is present, otherwise spell never installed + + COPY_EXISTING ~gisbomb.cre~ ~override~ + ~gisborb.cre~ ~override~ + WRITE_LONG 0x28 anim_beetle + + COPY_EXISTING ~%CLERIC_GIANT_INSECT%.spl~ ~override~ + LPF CLONE_EFFECT INT_VAR match_opcode = 331 opcode = 215 parameter2 = 2 timing = 0 duration = 2 resist_dispel = 0 dicenumber = 0 dicesize = 0 STR_VAR resource = asumm1x END // add animation + LPF CLONE_EFFECT INT_VAR match_opcode = 331 opcode = 127 parameter1 = 4 parameter2 = 0 dicesize = 0 dicenumber = 0 STR_VAR resource = ginsect END // two beetles + LPF ALTER_EFFECT INT_VAR match_opcode = 331 opcode = 127 parameter1 = 2 parameter2 = 0 probability1 = 49 dicesize = 0 dicenumber = 0 STR_VAR resource = ginsect END // +1 + + COPY_EXISTING ~%INNATE_BOMBARDIER_BEETLE_CLOUD%.spl~ ~override~ + LPF ADD_SPELL_EFFECT INT_VAR opcode = 215 target = 2 timing = 1 resist_dispel = 2 STR_VAR resource = sclouda END + LPF ADD_SPELL_EFFECT INT_VAR opcode = 215 target = 2 timing = 4 duration = 2 resist_dispel = 2 STR_VAR resource = scloudr END + + COPY_EXISTING ~fartrng.itm~ ~override~ + LPF ALTER_EFFECT INT_VAR match_opcode = 318 opcode = 206 END // bombardier immune to their own spells + + COPY_EXISTING ~idpro282.pro~ ~override~ + WRITE_BYTE 0x217 255 + + END + +///// \\\\\ +///// CLERIC_CHANT \\\\\ +///// \\\\\ + + COPY_EXISTING ~sppr203d.spl~ ~override~ + ~sppr203e.spl~ ~override~ + LPF DELETE_EFFECT INT_VAR match_opcode = 321 END + +///// \\\\\ +///// CLERIC_WITHER \\\\\ +///// \\\\\ + + COPY_EXISTING ~%CLERIC_WITHER%.spl~ ~override~ + LPF DELETE_EFFECT INT_VAR match_opcode = 321 END + LPF CLONE_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 144 parameter2 = 4 STR_VAR resource = EVAL ~%eff%~ END // race = golem + LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 4 parameter2 = 3 STR_VAR resource = EVAL ~%eff%~ END // general = undead + LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 104 opcode = 177 parameter2 = 4 STR_VAR resource = EVAL ~%eff%~ END // race = parameter1 + +///// \\\\\ +///// CLERIC_MOLD_TOUCH \\\\\ +///// \\\\\ + +COPY_EXISTING ~%CLERIC_MOLD_TOUCH%.spl~ ~override~ + PATCH_FOR_EACH op IN 78 206 318 328 BEGIN + LPF DELETE_EFFECT INT_VAR match_opcode = op END + END + LPF CLONE_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 144 parameter2 = 4 STR_VAR resource = cdix326 END // race = golem + LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 4 parameter2 = 3 STR_VAR resource = cdix326 END // general = undead + FOR (index = 0 ; index < 4 ; ++index) BEGIN + LPF ADD_SPELL_EFFECT INT_VAR opcode = 78 target = 2 power = 3 parameter1 = 2 parameter2 = 3 resist_dispel = 1 duration = ((index + 1) * 6) savingthrow = BIT0 END // 1d6/round over four rounds + LPF ADD_SPELL_EFFECT INT_VAR opcode = 146 target = 2 parameter2 = 1 timing = 4 duration = (index * 6) STR_VAR resource = EVAL ~%CLERIC_MOLD_TOUCH%b~ END + END + LPF ALTER_EFFECT INT_VAR match_opcode = 146 match_duration = 0 timing = 1 END + LPF ALTER_EFFECT INT_VAR match_opcode = 146 match_duration = 18 timing = 1 savingthrow = BIT0 END // only get fourth round of spread on failed save + LPF ADD_SPELL_EFFECT INT_VAR opcode = 142 target = 2 power = 3 parameter2 = 7 resist_dispel = 1 duration = 24 savingthrow = BIT0 END + LPF ADD_SPELL_EFFECT INT_VAR opcode = 206 target = 2 power = 3 resist_dispel = 1 duration = 24 savingthrow = BIT0 STR_VAR resource = EVAL ~%CLERIC_MOLD_TOUCH%~ END + LPF ADD_SPELL_EFFECT INT_VAR opcode = 78 target = 2 power = 3 parameter1 = 2 parameter2 = 3 resist_dispel = 1 duration = 18 END // 1d6/round over + LPF ADD_SPELL_EFFECT INT_VAR opcode = 78 target = 2 power = 3 parameter1 = 2 parameter2 = 3 resist_dispel = 1 duration = 6 END // 1d6/round over + LPF ADD_SPELL_EFFECT INT_VAR opcode = 142 target = 2 power = 3 parameter2 = 7 resist_dispel = 1 duration = 18 END + LPF ADD_SPELL_EFFECT INT_VAR opcode = 206 target = 2 power = 3 resist_dispel = 1 duration = 18 STR_VAR resource = EVAL ~%CLERIC_MOLD_TOUCH%~ END + +COPY_EXISTING ~%CLERIC_MOLD_TOUCH%b.spl~ ~override~ + LPF DELETE_EFFECT INT_VAR match_opcode = 327 END + LPF DELETE_EFFECT INT_VAR match_opcode = 328 END + LPF CLONE_EFFECT INT_VAR match_opcode = 318 match_parameter2 = 55 opcode = 177 parameter1 = 144 parameter2 = 4 STR_VAR resource = cdix326b END // race = golem + LPF ALTER_EFFECT INT_VAR match_opcode = 318 match_parameter2 = 55 opcode = 177 parameter1 = 4 parameter2 = 3 STR_VAR resource = cdix326b END // general = undead + LPF ALTER_EFFECT INT_VAR match_opcode = 78 parameter1 = 2 parameter2 = 3 timing = 0 duration = 24 END + LPF CLONE_EFFECT INT_VAR match_opcode = 78 match_duration = 24 duration = 18 END + LPF CLONE_EFFECT INT_VAR match_opcode = 78 match_duration = 24 duration = 12 END + LPF CLONE_EFFECT INT_VAR match_opcode = 78 match_duration = 24 duration = 6 END + LPF ADD_SPELL_EFFECT INT_VAR opcode = 142 target = 2 power = 3 parameter2 = 7 resist_dispel = 1 duration = 24 savingthrow = BIT0 END + +///// \\\\\ +///// obg2 graphical fixes \\\\\ +///// \\\\\ + + COPY_EXISTING ~asumm1x.vvc~ ~override~ + WRITE_LONG 0x2c "-100" // y-coordinate + WRITE_LONG 0x4c "-1" // z-coordinate + + // 3d blend flag in VVCs cause them to be virtually transparent in oBG2 + ACTION_FOR_EACH file IN + ~#bless~ ~#entropy~ ~#genabju~ ~#grnring~ ~#latshg1~ ~#latshg2~ ~#latshl1~ ~#latshl2~ ~#storm~ + abjurh alterh asumm1x blessh ccdamah cdiseah cidamah cldamah cloudbh cmdamah cmwounh conjuh csdamah + curseh destruh enchah exaltah harmh invoch msumm1h necroh paralh prayerb prayerg recitab recitag + rwotfag rwotfah schargh sohopex uwardx witherh mtouchh + BEGIN + + COPY_EXISTING ~%file%.vvc~ ~override~ + WRITE_SHORT 0x18 (THIS BAND `BIT9) + + END + + // ee BAMs have horrible black auras on everything that show up w/o 3d enabled in oBG2; use original IWD BAMs instead + ACTION_FOR_EACH file IN + abjurax abjurh alancet alterh area1x area4x asumm1x blessh ccdamah cdiseah cldamah cloudbh + cmdamah cmwounh conjuh copesta csdamah curseh destruh enchah eshielc exaltah gsolac1 gsolac2 + harmh invoch moeldaa msumm1h msumm1x necroh pfirea pfirex rwotfah schargh sclouda scloudr sgrowta + sgrowtx sohopex solatc1 solatc2 sshellc sunscoh tsprayt uwardx mtouchh + BEGIN + + COPY ~%obg2_res_path%/%file%.bam~ ~override~ + + END + +END + +///// \\\\\ +///// compatibility w/ SR NWN-style Deflection \\\\\ +///// \\\\\ + +// courtesy of subtledoctor +OUTER_SET $divine_aoe_spell(~CLERIC_CURSE~)=1 +OUTER_SET $divine_aoe_spell(~CLERIC_SPIKE_GROWTH~)=1 +OUTER_SET $divine_aoe_spell(~CLERIC_PRODUCE_FIRE~)=1 +OUTER_SET $divine_aoe_spell(~CLERIC_CLOUD_OF_PESTILENCE~)=1 +OUTER_SET $divine_aoe_spell(~CLERIC_THORN_SPRAY~)=1 +OUTER_SET $divine_aoe_spell(~CLERIC_SPIKE_STONES~)=1 +OUTER_SET $divine_aoe_spell(~CLERIC_MASS_CAUSE_LIGHT_WOUNDS~)=1 +OUTER_SET $divine_aoe_spell(~CLERIC_WHIRLWIND~)=1 + +ACTION_IF enhanced_edition BEGIN + + OUTER_SET $divine_aoe_spell(~CLERIC_SMASHING_WAVE~)=1 + OUTER_SET $divine_aoe_spell(~CLERIC_SPIRITUAL_WRATH~)=1 + +END + +ACTION_IF MOD_IS_INSTALLED ~spell_rev.tp2~ ~55~ BEGIN + + ACTION_PHP_EACH divine_aoe_spell AS spell_name => r2 BEGIN + + OUTER_SET spell_num = (IDS_OF_SYMBOL (~spell~ ~%spell_name%~)) + ACTION_IF spell_num > 0 BEGIN + OUTER_SNPRINT 1 spell_type ~%spell_num%~ + OUTER_SNPRINT (0 - 3) type_num ~%spell_num%~ + ACTION_IF spell_type = 1 BEGIN + OUTER_SPRINT i2 ~sppr%type_num%~ + + OUTER_SET found=0 + OUTER_SPRINT letter ~d~ + ACTION_FOR_EACH char_check IN d e f g h i j k l m BEGIN + ACTION_IF found=0 BEGIN + ACTION_IF NOT FILE_EXISTS_IN_GAME ~%i2%%char_check%.spl~ BEGIN + OUTER_SET found=1 + OUTER_SPRINT letter ~%char_check%~ + END + END + END + + ACTION_IF found && r2 && (FILE_EXISTS_IN_GAME ~%i2%.spl~) BEGIN + PRINT ~%i2% is divine AoE~ + COPY_EXISTING ~%i2%.spl~ ~override/%i2%%letter%.spl~ // cloning original into the secondary spell + WRITE_ASCII 0x8 ~~ (8) // clearing out the name + GET_OFFSET_ARRAY headers 0x64 4 0x68 2 0 0 0x28 + PHP_EACH headers AS i => r BEGIN + WRITE_SHORT (r+0x0c) 1 // target = creature + WRITE_SHORT (r+0x26) 1 // projectile = none + END + BUT_ONLY + + COPY_EXISTING ~%i2%.spl~ ~override~ // modifying the original + READ_LONG 0x34 level + READ_LONG 0x64 ab_off + READ_SHORT 0x68 ab_num + READ_LONG 0x6a ef_off + READ_SHORT 0x70 cast_num // global effects aka casting features + + total_eff=cast_num + FOR (i=0;i 0 BEGIN // song of kaudies + + // shout, great shout + COPY_EXISTING ~spcl%NUM_b117%.spl~ ~override~ + PATCH_FOR_EACH var IN ~%NUM_a431%~ ~%NUM_a806%~ BEGIN + PATCH_IF var > 0 BEGIN + LPF CLONE_EFFECT INT_VAR match_opcode = 206 STR_VAR match_resource = sppr211 resource = EVAL ~spwi%var%~ END + END + END + BUT_ONLY + +END \ No newline at end of file diff --git a/iwdification/obg2_res/cross_patch_both.tpa b/iwdification/obg2_res/cross_patch_both.tpa new file mode 100644 index 0000000..8201e93 --- /dev/null +++ b/iwdification/obg2_res/cross_patch_both.tpa @@ -0,0 +1,127 @@ +// since this is meant to be run after both arcane & divine components, we cannot rely on +// e.g. %WIZARD_MIND_BLANK% being set. so it's a bit tedious, but use spell.ids lookups instead + +OUTER_SET NUM_a327 = ((IDS_OF_SYMBOL (~spell~ ~WIZARD_ICELANCE~)) - 2000) +OUTER_SET NUM_a427 = ((IDS_OF_SYMBOL (~spell~ ~WIZARD_EMOTION_COURAGE~)) - 2000) +OUTER_SET NUM_a428 = ((IDS_OF_SYMBOL (~spell~ ~WIZARD_EMOTION_FEAR~)) - 2000) +OUTER_SET NUM_a429 = ((IDS_OF_SYMBOL (~spell~ ~WIZARD_EMOTION_HOPE~)) - 2000) +OUTER_SET NUM_a524 = ((IDS_OF_SYMBOL (~spell~ ~WIZARD_SHROUD_OF_FLAME~)) - 2000) +OUTER_SET NUM_a610 = ((IDS_OF_SYMBOL (~spell~ ~WIZARD_ANTIMAGIC_SHELL~)) - 2000) +OUTER_SET NUM_a802 = ((IDS_OF_SYMBOL (~spell~ ~WIZARD_MIND_BLANK~)) - 2000) +OUTER_SET NUM_a814 = ((IDS_OF_SYMBOL (~spell~ ~WIZARD_IRON_BODY~)) - 2000) +OUTER_SET NUM_d324 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_SPIKE_GROWTH~)) - 1000) +OUTER_SET NUM_d325 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_CLOUDBURST~)) - 1000) +OUTER_SET NUM_d326 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_MOLD_TOUCH~)) - 1000) +OUTER_SET NUM_d419 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_PRODUCE_FIRE~)) - 1000) +OUTER_SET NUM_d420 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_STATIC_CHARGE~)) - 1000) +OUTER_SET NUM_d422 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_BLOOD_RAGE~)) - 1000) +OUTER_SET NUM_d423 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_CLOUD_OF_PESTILENCE~)) - 1000) +OUTER_SET NUM_d424 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_UNFAILING_ENDURANCE~)) - 1000) +OUTER_SET NUM_d426 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_SMASHING_WAVE~)) - 1000) +OUTER_SET NUM_d427 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_THORN_SPRAY~)) - 1000) +OUTER_SET NUM_d428 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_WALL_OF_MOONLIGHT~)) - 1000) +OUTER_SET NUM_d519 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_SPIKE_STONES~)) - 1000) +OUTER_SET NUM_d615 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_ENTROPY_SHIELD~)) - 1000) +OUTER_SET NUM_d617 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_WHIRLWIND~)) - 1000) +OUTER_SET NUM_d716 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_SYMBOL_HOPELESSNESS~)) - 1000) +OUTER_SET NUM_d734 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_DESTRUCTION~)) - 1000) +OUTER_SET NUM_d736 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_MIST_OF_ELDATH~)) - 1000) + +OUTER_SET op_318 = 206 +OUTER_SET op_321 = 206 +ACTION_IF enhanced_edition BEGIN OUTER_SET op_318 = 318 OUTER_SET op_321 = 321 END + +COPY_EXISTING ~7eyes.2da~ ~override~ + PATCH_IF NUM_d716 > 0 BEGIN + REPLACE_TEXTUALLY ~\(SPPR311[ %TAB%]+\)[^ %TAB%%LNL%%MNL%%WNL%]+~ ~\1sppr%NUM_d716%~ + END ELSE BEGIN + REPLACE_TEXTUALLY ~\(SPPR311[ %TAB%]+\)[^ %TAB%%LNL%%MNL%%WNL%]+~ ~\1*~ + END + PATCH_IF NUM_d734 > 0 BEGIN + REPLACE_TEXTUALLY ~\(SPPR511[ %TAB%]+\)[^ %TAB%]+~ ~\1sppr%NUM_d734%~ + END ELSE BEGIN + REPLACE_TEXTUALLY ~\(SPPR511[ %TAB%]+\)[^ %TAB%]+~ ~\1*~ + END + BUT_ONLY IF_EXISTS + +ACTION_IF ((NUM_a429 > 0) AND (NUM_d716 > 0)) BEGIN // emotion hope + + // symbol of hopelessness + COPY_EXISTING ~spwi%NUM_a429%.spl~ ~override~ + LPF CLONE_EFFECT INT_VAR match_opcode = op_321 STR_VAR match_resource = spwi411 resource = EVAL ~sppr%NUM_d716%~ END + BUT_ONLY + +END + +ACTION_IF NUM_a802 > 0 BEGIN // mind blank + + // blood rage, symbol hopelessness + COPY_EXISTING ~spwi%NUM_a802%.spl~ ~override~ + PATCH_FOR_EACH var IN ~%NUM_d422%~ ~%NUM_d716%~ BEGIN + PATCH_IF var > 0 BEGIN + LPF CLONE_EFFECT INT_VAR match_opcode = 206 STR_VAR match_resource = spwi813 resource = EVAL ~sppr%var%~ END + END + END + BUT_ONLY + +END + +ACTION_IF NUM_a610 > 0 BEGIN // antimagic shell + + // mist of eldath, whirlwind, spike stones, wall of moonlight, thorn spray, smashing wave, produce fire, static charge, cloud of pestilence, mold touch, spike growth + COPY_EXISTING ~spwi%NUM_a610%.spl~ ~override~ + PATCH_FOR_EACH var IN ~%NUM_d736%~ ~%NUM_d617%~ ~%NUM_d519%~ ~%NUM_d428%~ ~%NUM_d427%~ ~%NUM_d426%~ ~%NUM_d419%~ ~%NUM_d420%~ ~%NUM_d423%~ ~%NUM_d326%~ ~%NUM_d324%~ BEGIN + PATCH_IF var > 0 BEGIN + LPF CLONE_EFFECT INT_VAR match_opcode = 206 STR_VAR match_resource = spwi911 resource = EVAL ~sppr%var%~ END + END + END + BUT_ONLY + +END + +ACTION_IF NUM_a814 > 0 BEGIN // iron body + + // mold touch, cloud of pestilence, unfailing endurance, mist of eldath + COPY_EXISTING ~spwi%NUM_a814%.spl~ ~override~ // ee games + ~ibody.itm~ ~override~ // obg2 games + PATCH_FOR_EACH var IN ~%NUM_d326%~ ~%NUM_d423%~ ~%NUM_d424%~ ~%NUM_d736%~ BEGIN + PATCH_IF var > 0 BEGIN // use silent since one of the items copied won't be patched + LPF CLONE_EFFECT INT_VAR silent = 1 match_opcode = op_318 STR_VAR match_resource = spwi812 resource = EVAL ~sppr%var%~ END + END + END + BUT_ONLY + +END + +ACTION_IF NUM_d422 > 0 BEGIN // blood rage + + // emotions courage, fear, hope + COPY_EXISTING ~sppr%NUM_d422%.spl~ ~override~ + PATCH_FOR_EACH var IN ~%NUM_a427%~ ~%NUM_a428%~ ~%NUM_a429%~ BEGIN + PATCH_IF var > 0 BEGIN + LPF CLONE_EFFECT INT_VAR match_opcode = op_318 STR_VAR match_resource = spwi411 resource = EVAL ~spwi%var%~ END + END + END + BUT_ONLY + +END + +ACTION_IF ((NUM_a524 > 0) AND (NUM_d325 > 0)) BEGIN // cloudburst prot/remove shroud of flame + + COPY_EXISTING ~sppr%NUM_d325%.spl~ ~override~ + PATCH_IF enhanced_edition BEGIN + LPF ADD_SPELL_EFFECT INT_VAR insert_point = 0 opcode = 321 target = 2 power = 3 timing = 1 resist_dispel = 2 STR_VAR resource = EVAL ~spwi%NUM_a524%~ END + END ELSE BEGIN + LPF ADD_SPELL_EFFECT INT_VAR insert_point = 0 opcode = 206 target = 2 power = 3 duration = 6 resist_dispel = 2 STR_VAR resource = EVAL ~spwi%NUM_a524%~ END + END + BUT_ONLY + +END + +ACTION_IF ((NUM_a327 > 0) AND (NUM_d615 > 0)) BEGIN // entropy shield blocking icelance + + COPY_EXISTING ~sppr%NUM_d615%.spl~ ~override~ + LPF CLONE_EFFECT INT_VAR match_opcode = op_318 STR_VAR match_resource = sppr106 resource = EVAL ~spwi%NUM_a327%~ END + BUT_ONLY + +END \ No newline at end of file diff --git a/iwdification/obg2_res/csdamah.bam b/iwdification/obg2_res/csdamah.bam new file mode 100644 index 0000000..f410b38 Binary files /dev/null and b/iwdification/obg2_res/csdamah.bam differ diff --git a/iwdification/obg2_res/curseh.bam b/iwdification/obg2_res/curseh.bam new file mode 100644 index 0000000..25eeb03 Binary files /dev/null and b/iwdification/obg2_res/curseh.bam differ diff --git a/iwdification/obg2_res/cwelemx.bam b/iwdification/obg2_res/cwelemx.bam new file mode 100644 index 0000000..ac5a365 Binary files /dev/null and b/iwdification/obg2_res/cwelemx.bam differ diff --git a/iwdification/obg2_res/decasta.bam b/iwdification/obg2_res/decasta.bam new file mode 100644 index 0000000..4e563cd Binary files /dev/null and b/iwdification/obg2_res/decasta.bam differ diff --git a/iwdification/obg2_res/destruh.bam b/iwdification/obg2_res/destruh.bam new file mode 100644 index 0000000..02a523a Binary files /dev/null and b/iwdification/obg2_res/destruh.bam differ diff --git a/iwdification/obg2_res/eff_m107.wav b/iwdification/obg2_res/eff_m107.wav new file mode 100644 index 0000000..ce66be1 Binary files /dev/null and b/iwdification/obg2_res/eff_m107.wav differ diff --git a/iwdification/obg2_res/eff_p101.wav b/iwdification/obg2_res/eff_p101.wav new file mode 100644 index 0000000..eb97e7d Binary files /dev/null and b/iwdification/obg2_res/eff_p101.wav differ diff --git a/iwdification/obg2_res/eff_p104.wav b/iwdification/obg2_res/eff_p104.wav new file mode 100644 index 0000000..f23fae5 Binary files /dev/null and b/iwdification/obg2_res/eff_p104.wav differ diff --git a/iwdification/obg2_res/eff_p105.wav b/iwdification/obg2_res/eff_p105.wav new file mode 100644 index 0000000..f91fa3d Binary files /dev/null and b/iwdification/obg2_res/eff_p105.wav differ diff --git a/iwdification/obg2_res/eff_p107.wav b/iwdification/obg2_res/eff_p107.wav new file mode 100644 index 0000000..8857523 Binary files /dev/null and b/iwdification/obg2_res/eff_p107.wav differ diff --git a/iwdification/obg2_res/eff_p32.wav b/iwdification/obg2_res/eff_p32.wav new file mode 100644 index 0000000..0f34328 Binary files /dev/null and b/iwdification/obg2_res/eff_p32.wav differ diff --git a/iwdification/obg2_res/eff_p42.wav b/iwdification/obg2_res/eff_p42.wav new file mode 100644 index 0000000..0746490 Binary files /dev/null and b/iwdification/obg2_res/eff_p42.wav differ diff --git a/iwdification/obg2_res/eff_p48.wav b/iwdification/obg2_res/eff_p48.wav new file mode 100644 index 0000000..b84c7d1 Binary files /dev/null and b/iwdification/obg2_res/eff_p48.wav differ diff --git a/iwdification/obg2_res/eff_p50.wav b/iwdification/obg2_res/eff_p50.wav new file mode 100644 index 0000000..883f62e Binary files /dev/null and b/iwdification/obg2_res/eff_p50.wav differ diff --git a/iwdification/obg2_res/enchah.bam b/iwdification/obg2_res/enchah.bam new file mode 100644 index 0000000..5e11d2d Binary files /dev/null and b/iwdification/obg2_res/enchah.bam differ diff --git a/iwdification/obg2_res/enchanx.bam b/iwdification/obg2_res/enchanx.bam new file mode 100644 index 0000000..2d4fe1c Binary files /dev/null and b/iwdification/obg2_res/enchanx.bam differ diff --git a/iwdification/obg2_res/eshielc.bam b/iwdification/obg2_res/eshielc.bam new file mode 100644 index 0000000..84de005 Binary files /dev/null and b/iwdification/obg2_res/eshielc.bam differ diff --git a/iwdification/obg2_res/exaltah.bam b/iwdification/obg2_res/exaltah.bam new file mode 100644 index 0000000..054705b Binary files /dev/null and b/iwdification/obg2_res/exaltah.bam differ diff --git a/iwdification/obg2_res/fiaurac.bam b/iwdification/obg2_res/fiaurac.bam new file mode 100644 index 0000000..c3904b8 Binary files /dev/null and b/iwdification/obg2_res/fiaurac.bam differ diff --git a/iwdification/obg2_res/fraurac.bam b/iwdification/obg2_res/fraurac.bam new file mode 100644 index 0000000..edd6a5f Binary files /dev/null and b/iwdification/obg2_res/fraurac.bam differ diff --git a/iwdification/obg2_res/functions.tpa b/iwdification/obg2_res/functions.tpa new file mode 100644 index 0000000..b705800 --- /dev/null +++ b/iwdification/obg2_res/functions.tpa @@ -0,0 +1,602 @@ +///// \\\\\ +///// simulate cloud projectiles for vanilla \\\\\ +///// \\\\\ + +/* +Original idea from DavidW for IWD-in-BG2. Basic idea: cloud spells summon an invisible creature, fooM. In turn +fooM runs cycles of spawning several fooV, who teleport a short distance away, play a visual, and then disappear. +fooM also repeatedly casts the actual working spell (with an invisible AoE projectile) to do the work. The working +spell also includes a one-round 206 against itself to prevent applying effects to targets more than once a round. + +Visual randomness is achieved by fooV using teleport field to jump away from fooM at the center of the cloud, and +then randomly playing one of the VVCs available. Functionality is achieved by fooM casting the working spell. + +If the spell should be cleared out from Zone of Sweet Air, additional steps are taken. Any spell that provides a +ZoSA effect is patched to set a global, CDIZOSA. All of the invisible cloud creatures destroy themselves if this +variable gets set, and then the main baldur game script resets the variable after a round. + +EEs are so, so, SO much easier here. Thanks Laszlo! +*/ + +DEFINE_ACTION_FUNCTION cd_create_cloud + INT_VAR cloud_dur = 6 + visloop = 5 + zosa = 0 + STR_VAR code = null + anim = null + dsound = "" + ssound = "" +BEGIN + + ACTION_IF ("%anim%" STRING_COMPARE_CASE "null" = 0) BEGIN + + OUTER_SPRINT anim ~%code%V~ + + END + + COPY ~%obg2_res_path%/cloud.eff~ ~override/%code%.eff~ + WRITE_ASCIIE 0x30 ~%code%M~ + + COPY ~%obg2_res_path%/cloud.cre~ ~override/%code%M.cre~ + ~%obg2_res_path%/cloud.cre~ ~override/%code%V.cre~ + WRITE_ASCIIE 0x248 ~%DEST_RES%~ + WRITE_ASCIIE 0x280 ~%DEST_RES%~ + + EXTEND_TOP ~%code%M.bcs~ ~%obg2_res_path%/cloudmn.baf~ EVALUATE_BUFFER + EXTEND_TOP ~%code%V.bcs~ ~%obg2_res_path%/cloudvs.baf~ EVALUATE_BUFFER + + ACTION_IF zosa BEGIN + + ACTION_IF NOT FILE_EXISTS ~%obg2_res_path%/cdzosa.baf~ THEN BEGIN // run only once across both components + + COPY_EXISTING_REGEXP GLOB ~^.+\.spl$~ ~override~ + LPF CLONE_EFFECT INT_VAR silent = 1 match_opcode = 273 opcode = 265 parameter1 = 1 timing = 1 STR_VAR resource = cdizosa END + BUT_ONLY + + COPY ~%obg2_res_path%/zosa.baf~ ~%obg2_res_path%/cdzosa.baf~ + + ACTION_FOR_EACH file IN baldur baldur25 BEGIN + + ACTION_IF FILE_EXISTS_IN_GAME ~%file%.bcs~ THEN BEGIN + + EXTEND_BOTTOM ~%file%.bcs~ ~%obg2_res_path%/baldur.baf~ + + END + + END + + END + + EXTEND_TOP ~%code%M.bcs~ ~%obg2_res_path%/cdzosa.baf~ + EXTEND_TOP ~%code%V.bcs~ ~%obg2_res_path%/cdzosa.baf~ + + END + + ACTION_IF NOT FILE_EXISTS_IN_GAME cdiclout.spl THEN BEGIN + COPY ~%obg2_res_path%/cdiclout.spl~ ~override~ // minions jump away + END + + COPY ~%obg2_res_path%/cloudv.spl~ ~override/%code%v.spl~ + SET step = (100 / (visloop + 1)) + LPF ADD_SPELL_EFFECT INT_VAR opcode = 215 target = 1 parameter2 = 2 probability1 = step STR_VAR resource = EVALUATE_BUFFER ~%code%0~ END + FOR (index = 1 ; index <= visloop ; ++index) BEGIN + READ_BYTE 0xac temp_prob + LPF ADD_SPELL_EFFECT INT_VAR insert_point = 0 opcode = 215 target = 1 parameter2 = 2 + probability2 = (temp_prob + 1) probability1 = (temp_prob + step) STR_VAR resource = EVALUATE_BUFFER ~%code%%index%~ END + END + WRITE_BYTE 0xac 100 + + OUTER_FOR (index = 0 ; index <= visloop ; ++index) BEGIN + COPY ~%obg2_res_path%/%code%%index%.vvc~ ~override~ + WRITE_ASCIIE 0x08 ~%anim%~ #8 + WRITE_ASCIIE 0x78 ~%ssound%~ #8 + WRITE_ASCIIE 0x80 ~%dsound%~ #8 + END +// COPY ~iwdification/bam/%anim%.bam~ ~override~ + +END + +///// \\\\\ +///// ogg > wav conversions \\\\\ +///// \\\\\ + +DEFINE_ACTION_FUNCTION CD_HANDLE_AUDIO_PREP BEGIN + + OUTER_SPRINT output ~weidu_external/workspace/%spell_list%_audio_temp~ + MKDIR ~%output%~ + + // turn spell copy list into series of A_B_Fs that walk the directories + COPY ~%resource_loc%/%spell_list%~ ~%output%/audio.tpa~ + REPLACE_TEXTUALLY + "^\([^ %LNL%%MNL%%WNL%]+\) .+$" + "ACTION_BASH_FOR ~%resource_loc%/\1~ ~^.+\.wav$~ BEGIN COPY ~%resource_loc%/\1/percentBASH_FOR_RESpercent.wav~ ~%output%~ END" + + COPY ~%output%/audio.tpa~ ~%output%/audio.tpa~ + REPLACE_TEXTUALLY ~percent~ ~%~ + + INCLUDE ~%output%/audio.tpa~ // now we run it, copying all wavs to the output folder + + LAF CD_HANDLE_AUDIO STR_VAR audio_path = ~%output%~ output_path = ~%output%~ END // now we convert to true wavs + DELETE ~%output%/audio.tpa~ + COPY ~%output%~ ~override~ // and dump them into the override + +END + +///// \\\\\ +///// bastardized handle_audio variant \\\\\ +///// \\\\\ + +// I just made some changes because I want WeiDU to convert (or rename) ogg > wav once, and then leave the resulting wav files to +// be copied (or not) by the respective components. Basically anything tha moves or copies the files has been removed, so that +// WeiDU won't remove the wav files if the component that invoked this function gets uninstalled. + +DEFINE_ACTION_FUNCTION CD_HANDLE_AUDIO + INT_VAR + music = 0 + STR_VAR + audio_path = ~iwdification/wav~ + oggdec_path = ~iwdification/wav~ + sox_path = ~iwdification/wav~ + output_path = ~iwdification/wav~ +BEGIN + /* Early versions of BG:EE do not include bgee.lua and + * PST:EE does not include monkfist.2da + */ + ACTION_IF !enhanced_edition + BEGIN + ACTION_MATCH "%WEIDU_OS%" WITH + win32 + BEGIN + ACTION_IF FILE_EXISTS "%oggdec_path%/oggdec.exe" BEGIN + ACTION_BASH_FOR ~%audio_path%~ ~.+\.wav$~ BEGIN +// OUTER_SPRINT wavfile ~%audio_path%/%BASH_FOR_RES%.wav~ +// COPY ~.../fl#inlined/null.file~ ~%wavfile%~ + AT_NOW ~%oggdec_path%/oggdec.exe "%BASH_FOR_FILESPEC%"~ +// MOVE ~%wavfile%~ ~%output_path%~ + END + END ELSE BEGIN + WARN ~WARNING: audio was not installed because oggdec.exe could not be found in %oggdec_path%~ + END + END + + osx + BEGIN + ACTION_IF FILE_EXISTS ~%sox_path%/sox~ BEGIN + AT_NOW ~chmod +x '%sox_path%/sox'~ + ACTION_BASH_FOR ~%audio_path%~ ~.+\.wav$~ BEGIN + OUTER_SPRINT wavfile ~%audio_path%/%BASH_FOR_RES%.wav~ +// COPY ~.../fl#inlined/null.file~ ~%wavfile%~ + AT_NOW ~'%sox_path%/sox' '%BASH_FOR_FILESPEC%' '%wavfile%'~ +// MOVE ~%wavfile%~ ~%output_path%~ + END + END ELSE BEGIN + WARN ~WARNING: audio was not installed because sox could not be found in %sox_path%~ + END + END + + unix + BEGIN + OUTER_SET installed = 1 + ACTION_BASH_FOR ~%audio_path%~ ~.+\.wav$~ BEGIN + OUTER_SPRINT wavfile ~%audio_path%/%BASH_FOR_RES%.wav~ +// COPY ~.../fl#inlined/null.file~ ~%wavfile%~ + AT_NOW ~oggdec '%BASH_FOR_FILESPEC%'~ + ACTION_IF FILE_EXISTS ~%wavfile%~ AND !FILE_SIZE ~%wavfile%~ 0 BEGIN +// MOVE ~%wavfile%~ ~%output_path%~ + END ELSE OUTER_SET installed = 0 + END + ACTION_IF !installed BEGIN + WARN "WARNING: audio was not installed because WAV files were not found. Are you sure you have oggdec installed?" + END + END + DEFAULT + END + END ELSE BEGIN + ACTION_IF !music BEGIN + OUTER_SPRINT ext "wav" + END ELSE BEGIN + OUTER_SPRINT ext "acm" + END + ACTION_BASH_FOR ~%audio_path%~ ~.+\.ogg$~ BEGIN + COPY_LARGE + ~%BASH_FOR_FILESPEC%~ ~%output_path%/%BASH_FOR_RES%.%ext%~ + END + END +END + +///// \\\\\ +///// CD_SPLIT_SAVE_DAMAGE \\\\\ +///// \\\\\ + +DEFINE_PATCH_FUNCTION CD_SPLIT_SAVE_DAMAGE // turns damage using ee's save-for-half bit into two damage opcodes + + // defines what we're going to check + INT_VAR header = "-1" + header_type = "-1" + m_power = "-1" + m_type = "-1" + m_damtype = "-1" + m_timing = "-1" + m_dispel = "-1" + m_duration = "-1" + m_prob1 = "-1" + m_prob2 = "-1" + m_dicesize = "-1" + m_flags = "-1" +BEGIN + + READ_ASCII 0x00 sig (3) + SET abil_length = 0x28 + PATCH_IF ("%sig%" STRING_COMPARE_CASE "ITM" = 0) BEGIN + SET abil_length = 0x38 + END + READ_LONG 0x64 abil_off ELSE 0 + READ_SHORT 0x68 abil_num ELSE 0 + READ_LONG 0x6a fx_off ELSE 0 + SET fx_delta = 0 + FOR (index = 0 ; index < abil_num ; ++index) BEGIN // start iterating through abilities + WRITE_SHORT (abil_off + 0x20 + (abil_length * index)) (THIS + fx_delta) + READ_SHORT (abil_off + (abil_length * index)) o_header_type + PATCH_IF (((header = index) OR (header < 0)) AND + ((header_type = o_header_type) OR (header_type < 0))) BEGIN + READ_SHORT (abil_off + 0x1e + (abil_length * index)) abil_fx_num + READ_SHORT (abil_off + 0x20 + (abil_length * index)) abil_fx_idx + FOR (index2 = 0 ; index2 < abil_fx_num ; ++index2) BEGIN + READ_SHORT (fx_off + (0x30 * (abil_fx_idx + index2))) opcode + READ_LONG (fx_off + 0x2c + (0x30 * (abil_fx_idx + index2))) o_flags + PATCH_IF (((opcode = 12) AND (o_flags & BIT8) = BIT8)) BEGIN + READ_BYTE (fx_off + 0x02 + (0x30 * (abil_fx_idx + index2))) o_power + READ_LONG (fx_off + 0x04 + (0x30 * (abil_fx_idx + index2))) o_amount + READ_SHORT (fx_off + 0x08 + (0x30 * (abil_fx_idx + index2))) o_type + READ_SHORT (fx_off + 0x0a + (0x30 * (abil_fx_idx + index2))) o_damtype + READ_BYTE (fx_off + 0x0c + (0x30 * (abil_fx_idx + index2))) o_timing + READ_BYTE (fx_off + 0x0d + (0x30 * (abil_fx_idx + index2))) o_dispel + READ_LONG (fx_off + 0x0e + (0x30 * (abil_fx_idx + index2))) o_duration + READ_BYTE (fx_off + 0x12 + (0x30 * (abil_fx_idx + index2))) o_prob1 + READ_BYTE (fx_off + 0x13 + (0x30 * (abil_fx_idx + index2))) o_prob2 + READ_LONG (fx_off + 0x1c + (0x30 * (abil_fx_idx + index2))) o_dicenum + READ_LONG (fx_off + 0x20 + (0x30 * (abil_fx_idx + index2))) o_dicesize + READ_LONG (fx_off + 0x24 + (0x30 * (abil_fx_idx + index2))) o_save + READ_LONG (fx_off + 0x28 + (0x30 * (abil_fx_idx + index2))) o_savebonus +// READ_LONG (fx_off + 0x2c + (0x30 * (abil_fx_idx + index2))) o_flags + PATCH_IF (((o_power = m_power) OR (m_power < 0)) AND + ((o_type = m_type) OR (m_type < 0)) AND + ((o_damtype = m_damtype) OR (m_damtype < 0)) AND + ((o_timing = m_timing) OR (m_timing < 0)) AND + ((o_dispel = m_dispel) OR (m_dispel < 0)) AND + ((o_duration = m_duration) OR (m_duration < 0)) AND + ((o_prob1 = m_prob1) OR (m_prob1 < 0)) AND + ((o_prob2 = m_prob2) OR (m_prob2 < 0)) AND + ((o_dicesize = m_dicesize) OR (m_dicesize < 0)) AND + ((o_flags = m_flags) OR (m_flags < 0))) BEGIN + WRITE_LONG (fx_off + 0x2c + (0x30 * (abil_fx_idx + index2))) (THIS BAND `BIT8) // remove save-for-half flag + READ_ASCII (fx_off + (0x30 * (abil_fx_idx + index2))) clone (48) // read info for new effect + INSERT_BYTES (fx_off + (0x30 * (abil_fx_idx + index2))) 0x30 // insert new effect + WRITE_ASCIIE (fx_off + (0x30 * (abil_fx_idx + index2))) ~%clone%~ // copy existing effect into new bytes + WRITE_LONG (fx_off + 0x04 + (0x30 * (abil_fx_idx + index2))) ((o_amount + 1) / 2) // set original damage to half + WRITE_LONG (fx_off + 0x1c + (0x30 * (abil_fx_idx + index2))) ((o_dicenum + 0) / 2) + WRITE_LONG (fx_off + 0x34 + (0x30 * (abil_fx_idx + index2))) ((o_amount + 0) / 2) // set new damage to half + WRITE_LONG (fx_off + 0x4c + (0x30 * (abil_fx_idx + index2))) ((o_dicenum + 1) / 2) // +1 is fudge factor for rounding odd numbers + WRITE_LONG (fx_off + 0x24 + (0x30 * (abil_fx_idx + index2))) (((((THIS BAND `BIT0) BAND `BIT1) BAND `BIT2) BAND `BIT3) BAND `BIT4) // remove save flags from new effect +// WRITE_LONG (fx_off + 0x24 + (0x30 * (abil_fx_idx + index2))) ((THIS BAND `(BIT0 + BIT1 + BIT2 + BIT3 + BIT4)) // remove save flags from new effect + SET index2 += 1 + SET fx_delta += 1 + SET abil_fx_num += 1 + END // param check + END // damage, flag check + END // abil fx loop + WRITE_SHORT (abil_off + 0x1e + (abil_length * index)) abil_fx_num + END // abil type check + END // abil loop + +END + +///// \\\\\ +///// CD_CONVERT_333 \\\\\ +///// \\\\\ + +DEFINE_PATCH_FUNCTION CD_CONVERT_333 + + STR_VAR + 333spell = "" + +BEGIN // converts recurring 333s to simple 146s + + READ_ASCII 0x00 sig (3) + SET abil_length = 0x28 + PATCH_IF ("%sig%" STRING_COMPARE_CASE "ITM" = 0) BEGIN + SET abil_length = 0x38 + END + READ_LONG 0x64 abil_off ELSE 0 + READ_SHORT 0x68 abil_num ELSE 0 + READ_LONG 0x6a fx_off ELSE 0 + SET fx_delta = 0 + FOR (index = 0 ; index < abil_num ; ++index) BEGIN // start iterating through abilities + WRITE_SHORT (abil_off + 0x20 + (abil_length * index)) (THIS + fx_delta) + READ_SHORT (abil_off + 0x1e + (abil_length * index)) abil_fx_num + READ_SHORT (abil_off + 0x20 + (abil_length * index)) abil_fx_idx + FOR (index2 = 0 ; index2 < abil_fx_num ; ++index2) BEGIN + READ_SHORT (fx_off + (0x30 * (abil_fx_idx + index2))) opcode + PATCH_IF opcode = 333 BEGIN + READ_ASCII (fx_off + 0x14 + (0x30 * (abil_fx_idx + index2))) resref + PATCH_IF ("%333spell%" STRING_COMPARE_CASE "" = 0) BEGIN // set 333spell if argument blank + PATCH_IF ("%resref%" STRING_COMPARE_CASE "" = 0) BEGIN // if no subspell specified, default to b + SPRINT 333spell "%SOURCE_RES%b" + END ELSE BEGIN + SPRINT 333spell "%resref%" + END + END + READ_LONG (fx_off + 0x2c + (0x30 * (abil_fx_idx + index2))) delay + PATCH_IF !delay BEGIN SET delay = 6 END // if delay is 0, use default 6 instead + READ_LONG (fx_off + 0x04 + (0x30 * (abil_fx_idx + index2))) times + READ_LONG (fx_off + 0x08 + (0x30 * (abil_fx_idx + index2))) level + WRITE_SHORT (fx_off + (0x30 * (abil_fx_idx + index2))) 146 // opcode + WRITE_LONG (fx_off + 0x04 + (0x30 * (abil_fx_idx + index2))) level // cast at level + WRITE_LONG (fx_off + 0x08 + (0x30 * (abil_fx_idx + index2))) 1 // cast instantly + WRITE_BYTE (fx_off + 0x0c + (0x30 * (abil_fx_idx + index2))) 1 // timing: delay/perm + WRITE_LONG (fx_off + 0x0e + (0x30 * (abil_fx_idx + index2))) 0 // delay + WRITE_ASCIIE (fx_off + 0x14 + (0x30 * (abil_fx_idx + index2))) ~%333spell%~ #8 // subspell + READ_ASCII (fx_off + (0x30 * (abil_fx_idx + index2))) clone (48) // read info for new effect(s) + FOR (index3 = 0 ; index3 < times ; ++index3) BEGIN + INSERT_BYTES (fx_off + (0x30 * (abil_fx_idx + index2))) 0x30 // insert new effect + WRITE_ASCIIE (fx_off + (0x30 * (abil_fx_idx + index2))) ~%clone%~ // copy existing effect into new bytes + WRITE_BYTE (fx_off + 0x0c + (0x30 * (abil_fx_idx + index2))) 4 // timing: delay/perm + WRITE_LONG (fx_off + 0x0e + (0x30 * (abil_fx_idx + index2))) ((index3 + 1) * delay) // delay + SET index2 += 1 + SET fx_delta += 1 + SET abil_fx_num += 1 + END // new fx loop + END // 333 check + END // abil fx loop + WRITE_SHORT (abil_off + 0x1e + (abil_length * index)) abil_fx_num + END // abil loop + +END + +///// \\\\\ +///// CD_CONVERT_9_255 \\\\\ +///// \\\\\ + +DEFINE_PATCH_FUNCTION CD_CONVERT_9_255 BEGIN // actually convert 8 and 9 + + READ_ASCII 0x00 sig (3) + SET abil_length = 0x28 + PATCH_IF ("%sig%" STRING_COMPARE_CASE "ITM" = 0) BEGIN + SET abil_length = 0x38 + END + READ_LONG 0x64 abil_off ELSE 0 + READ_SHORT 0x68 abil_num ELSE 0 + READ_LONG 0x6a fx_off ELSE 0 + SET fx_delta = 0 + FOR (index = 0 ; index < abil_num ; ++index) BEGIN // start iterating through abilities + WRITE_SHORT (abil_off + 0x20 + (abil_length * index)) (THIS + fx_delta) + READ_SHORT (abil_off + 0x1e + (abil_length * index)) abil_fx_num + READ_SHORT (abil_off + 0x20 + (abil_length * index)) abil_fx_idx + FOR (index2 = 0 ; index2 < abil_fx_num ; ++index2) BEGIN + READ_SHORT (fx_off + (0x30 * (abil_fx_idx + index2))) opcode + PATCH_IF ((opcode = 8) OR (opcode = 9)) BEGIN + READ_SHORT (fx_off + 0x08 + (0x30 * (abil_fx_idx + index2))) loc + PATCH_IF loc = 255 BEGIN + WRITE_SHORT (fx_off + 0x08 + (0x30 * (abil_fx_idx + index2))) 6 + READ_ASCII (fx_off + (0x30 * (abil_fx_idx + index2))) clone (48) + FOR (index3 = 0 ; index3 < 6 ; ++index3) BEGIN + INSERT_BYTES (fx_off + (0x30 * (abil_fx_idx + index2))) 0x30 + WRITE_ASCIIE (fx_off + (0x30 * (abil_fx_idx + index2))) ~%clone%~ + WRITE_SHORT (fx_off + 0x08 + (0x30 * (abil_fx_idx + index2))) index3 + END + SET fx_delta += 6 + SET index2 += 6 + SET abil_fx_num += 6 + END + END + END + WRITE_SHORT (abil_off + 0x1e + (abil_length * index)) abil_fx_num + END + +END + +///// \\\\\ +///// CD_CONVERT_61 \\\\\ +///// \\\\\ + +DEFINE_PATCH_FUNCTION CD_CONVERT_61 BEGIN + + READ_ASCII 0x00 sig (3) + SET abil_length = 0x28 + PATCH_IF ("%sig%" STRING_COMPARE_CASE "ITM" = 0) BEGIN + SET abil_length = 0x38 + END + READ_LONG 0x64 abil_off ELSE 0 + READ_SHORT 0x68 abil_num ELSE 0 + READ_LONG 0x6a fx_off ELSE 0 + SET fx_delta = 0 + FOR (index = 0 ; index < abil_num ; ++index) BEGIN // start iterating through abilities + WRITE_SHORT (abil_off + 0x20 + (abil_length * index)) (THIS + fx_delta) + READ_SHORT (abil_off + 0x1e + (abil_length * index)) abil_fx_num + READ_SHORT (abil_off + 0x20 + (abil_length * index)) abil_fx_idx + FOR (index2 = 0 ; index2 < abil_fx_num ; ++index2) BEGIN + READ_SHORT (fx_off + (0x30 * (abil_fx_idx + index2))) opcode + PATCH_IF (opcode = 61) BEGIN + WRITE_SHORT (fx_off + (0x30 * (abil_fx_idx + index2))) 50 // change to brief color pulse + WRITE_BYTE (fx_off + 0x08 + (0x30 * (abil_fx_idx + index2))) 6 // location: hair (cloned into 0-5 in loop) + WRITE_BYTE (fx_off + 0x0c + (0x30 * (abil_fx_idx + index2))) 0 // timing: instant/limited + WRITE_LONG (fx_off + 0x0e + (0x30 * (abil_fx_idx + index2))) 1 // duration + READ_ASCII (fx_off + (0x30 * (abil_fx_idx + index2))) clone (48) + FOR (index3 = 0 ; index3 < 6 ; ++index3) BEGIN + INSERT_BYTES (fx_off + (0x30 * (abil_fx_idx + index2))) 0x30 + WRITE_ASCIIE (fx_off + (0x30 * (abil_fx_idx + index2))) ~%clone%~ + WRITE_BYTE (fx_off + 0x08 + (0x30 * (abil_fx_idx + index2))) index3 + END + SET fx_delta += 6 + SET index2 += 6 + SET abil_fx_num += 6 + END + END + WRITE_SHORT (abil_off + 0x1e + (abil_length * index)) abil_fx_num + END + +END + +///// \\\\\ +///// CD_CONVERT_325 \\\\\ +///// \\\\\ + +DEFINE_PATCH_FUNCTION CD_CONVERT_325 BEGIN + + READ_ASCII 0x00 sig (3) + SET abil_length = 0x28 + PATCH_IF ("%sig%" STRING_COMPARE_CASE "ITM" = 0) BEGIN + SET abil_length = 0x38 + END + READ_LONG 0x64 abil_off ELSE 0 + READ_SHORT 0x68 abil_num ELSE 0 + READ_LONG 0x6a fx_off ELSE 0 + SET fx_delta = 0 + FOR (index = 0 ; index < abil_num ; ++index) BEGIN // start iterating through abilities + WRITE_SHORT (abil_off + 0x20 + (abil_length * index)) (THIS + fx_delta) + READ_SHORT (abil_off + 0x1e + (abil_length * index)) abil_fx_num + READ_SHORT (abil_off + 0x20 + (abil_length * index)) abil_fx_idx + FOR (index2 = 0 ; index2 < abil_fx_num ; ++index2) BEGIN + READ_SHORT (fx_off + (0x30 * (abil_fx_idx + index2))) opcode + PATCH_IF (opcode = 325) BEGIN + WRITE_SHORT (fx_off + (0x30 * (abil_fx_idx + index2))) 33 // change to brief color pulse + READ_ASCII (fx_off + (0x30 * (abil_fx_idx + index2))) clone (48) + FOR (index3 = 34 ; index3 < 38 ; ++index3) BEGIN + INSERT_BYTES (fx_off + (0x30 * (abil_fx_idx + index2))) 0x30 + WRITE_ASCIIE (fx_off + (0x30 * (abil_fx_idx + index2))) ~%clone%~ + WRITE_SHORT (fx_off + (0x30 * (abil_fx_idx + index2))) index3 // vycle through individual save bonuses + END + SET fx_delta += 4 + SET index2 += 4 + SET abil_fx_num += 4 + END + END + WRITE_SHORT (abil_off + 0x1e + (abil_length * index)) abil_fx_num + END + +END + +///// \\\\\ +///// CD_EXTEND-O-MATIC, patent pending \\\\\ +///// \\\\\ + +// this function creates headers and does basic duration extensions to level 30; written for inwd-in-bg2 ages ago +DEFINE_PATCH_FUNCTION CD_EXTEND-O-MATIC + INT_VAR base_dur = 0 // constant to add to all durations + step_dur = 6 // how much duration to add to each consecutive header + step_size = 1 // how many levels between headers + level_cap = 20 // stop extending at level + min_dur = 4 // ignore effects with durations less than this (e.g. cosmetics) + dur_special = 0 // just add step_dur to existing effects (ignore base_dur) + min_lev_alt = 0 // if extending from level 1, use this value as its minimum level instead (e.g. fifth slevel spell with only one header, use 9 here) +BEGIN + + READ_LONG 0x64 abil_off + READ_SHORT 0x68 abil_num + READ_LONG 0x6a fx_off + READ_SHORT (abil_off + 0x10 + (0x28 * (abil_num - 1))) min_lev // read level of last ability + PATCH_IF ((min_lev = 1) AND (min_lev_alt != 0)) BEGIN SET min_lev = min_lev_alt END + FOR (index = min_lev + step_size ; index < (level_cap + 1) ; index = index + step_size) BEGIN + READ_ASCII (abil_off + (0x28 * (abil_num - 1))) abil (0x28) // read entire ability + READ_SHORT (abil_off + 0x1e + (0x28 * (abil_num - 1))) abil_fx_num + READ_SHORT (abil_off + 0x20 + (0x28 * (abil_num - 1))) abil_fx_idx + READ_ASCII (fx_off + (0x30 * abil_fx_idx)) effects (abil_fx_num * 0x30) // read entire fx block + INSERT_BYTES (fx_off + (0x30 * (abil_fx_idx + abil_fx_num))) (abil_fx_num * 0x30) // insert bytes for new ability + WRITE_ASCIIE (fx_off + (0x30 * (abil_fx_idx + abil_fx_num))) "%effects%" // write in effects block + FOR (index2 = 0 ; index2 < abil_fx_num ; ++index2) BEGIN + READ_LONG (fx_off + 0x0e + (0x30 * (abil_fx_idx + abil_fx_num + index2))) duration + PATCH_IF (duration > min_dur) BEGIN // exclude instant/cosmetic efects + PATCH_IF dur_special = 1 BEGIN + SET new_dur = duration + step_dur + END ELSE BEGIN + SET new_dur = (base_dur + (index * step_dur)) + END + WRITE_LONG (fx_off + 0x0e + (0x30 * (abil_fx_idx + abil_fx_num + index2))) new_dur // adjust durations + END + END + INSERT_BYTES (abil_off + (0x28 * abil_num)) 0x28 // insert new ability + WRITE_ASCIIE (abil_off + (0x28 * abil_num)) "%abil%" + WRITE_SHORT (abil_off + 0x10 + (0x28 * abil_num)) index + WRITE_SHORT (abil_off + 0x20 + (0x28 * abil_num)) (abil_fx_idx + abil_fx_num) + SET abil_num += 1 + SET fx_off += 0x28 + END + WRITE_SHORT 0x68 abil_num + WRITE_LONG 0x6a fx_off + +END + +///// \\\\\ +///// ALTER_CREATURE_ITEM on loan from Fixpack \\\\\ +///// \\\\\ + +DEFINE_PATCH_FUNCTION ALTER_CREATURE_ITEM + + // defines what we're going to check + INT_VAR expiry = "-1" + charge1 = "-1" + charge2 = "-1" + charge3 = "-1" + flags = "-1" + flag_identified = "-1" + flag_unstealable = "-1" + flag_stolen = "-1" + flag_undroppable = "-1" + STR_VAR item = "same" + match_item = "same" + +BEGIN + + READ_LONG 0x2bc item_off ELSE 0 + READ_LONG 0x2c0 item_num ELSE 0 + LPF ALTER_AREA-CREATURE_ITEM INT_VAR expiry charge1 charge2 charge3 flags flag_identified flag_unstealable flag_stolen flag_undroppable item_num item_off + STR_VAR item match_item END + +END + +DEFINE_PATCH_FUNCTION ALTER_AREA-CREATURE_ITEM + + // defines what we're going to check + INT_VAR expiry = "-1" + charge1 = "-1" + charge2 = "-1" + charge3 = "-1" + flags = "-1" + flag_identified = "-1" + flag_unstealable = "-1" + flag_stolen = "-1" + flag_undroppable = "-1" + item_num = 0 + item_off = 0 + STR_VAR item = "same" + match_item = "same" + +BEGIN + + FOR (index = 0 ; index < item_num ; ++index) BEGIN + SET base = (item_off + (index * 0x14)) + READ_ASCII base o_item + PATCH_IF (("%o_item%" STRING_COMPARE_CASE "%match_item%" = 0) OR + ("all" STRING_COMPARE_CASE "%match_item%" = 0)) BEGIN + PATCH_IF (expiry >= 0) BEGIN WRITE_SHORT (base + 0x08) expiry END + PATCH_IF (charge1 >= 0) BEGIN WRITE_SHORT (base + 0x0a) charge1 END + PATCH_IF (charge2 >= 0) BEGIN WRITE_SHORT (base + 0x0c) charge2 END + PATCH_IF (charge3 >= 0) BEGIN WRITE_SHORT (base + 0x0e) charge3 END + PATCH_IF (flags >= 0) BEGIN + WRITE_LONG (base + 0x10) flags + END ELSE BEGIN // only check individual flags if overall value not given + PATCH_IF (flag_identified = 0) BEGIN WRITE_LONG (base + 0x10) (THIS & `BIT0) END + PATCH_IF (flag_identified = 1) BEGIN WRITE_LONG (base + 0x10) (THIS BOR BIT0) END + PATCH_IF (flag_unstealable = 0) BEGIN WRITE_LONG (base + 0x10) (THIS & `BIT1) END + PATCH_IF (flag_unstealable = 1) BEGIN WRITE_LONG (base + 0x10) (THIS BOR BIT1) END + PATCH_IF (flag_stolen = 0) BEGIN WRITE_LONG (base + 0x10) (THIS & `BIT2) END + PATCH_IF (flag_stolen = 1) BEGIN WRITE_LONG (base + 0x10) (THIS BOR BIT2) END + PATCH_IF (flag_undroppable = 0) BEGIN WRITE_LONG (base + 0x10) (THIS & `BIT3) END + PATCH_IF (flag_undroppable = 1) BEGIN WRITE_LONG (base + 0x10) (THIS BOR BIT3) END + END + PATCH_IF ("%item%" STRING_COMPARE_CASE "same") BEGIN + WRITE_ASCIIE base ~%item%~ #8 + END + END + END + +END \ No newline at end of file diff --git a/iwdification/obg2_res/g3_bgee_cpmvars.tpa b/iwdification/obg2_res/g3_bgee_cpmvars.tpa new file mode 100644 index 0000000..bc7fd39 --- /dev/null +++ b/iwdification/obg2_res/g3_bgee_cpmvars.tpa @@ -0,0 +1,1239 @@ +/* Declaration of BG:EE Platform Variables */ +ACTION_IF GAME_IS ~bgee~ THEN BEGIN + /* tp2, d, and baf parsing variables */ + OUTER_SPRINT "tutorbgt" "bgee" + OUTER_SPRINT "tutubgtbgee" "bgee" + OUTER_SPRINT "bgdreams" "DREAM" + OUTER_SPRINT "bgdream1" "2" + OUTER_SPRINT "bgdream2" "3" + OUTER_SPRINT "bgdream3" "4" + OUTER_SPRINT "bgdream4" "5" + OUTER_SPRINT "bgdream5" "6" + OUTER_SPRINT "bgdream6" "7" + OUTER_SPRINT "tutu_var" "" + OUTER_SPRINT "tutu_scriptbg" ""//BGT 'BG' prefix + OUTER_SPRINT "tutu_scripta" "a" + OUTER_SPRINT "tutu_scriptb" "b" + OUTER_SPRINT "tutu_scriptc" "c" + OUTER_SPRINT "tutu_scriptd" "d" + OUTER_SPRINT "tutu_scripte" "e" + OUTER_SPRINT "tutu_scriptf" "f" + OUTER_SPRINT "tutu_scriptg" "g" + OUTER_SPRINT "tutu_scripth" "h" + OUTER_SPRINT "tutu_scripti" "i" + OUTER_SPRINT "tutu_scriptj" "j" + OUTER_SPRINT "tutu_scriptk" "k" + OUTER_SPRINT "tutu_scriptl" "l" + OUTER_SPRINT "tutu_scriptm" "m" + OUTER_SPRINT "tutu_scriptn" "n" + OUTER_SPRINT "tutu_scripto" "o" + OUTER_SPRINT "tutu_scriptp" "p" + OUTER_SPRINT "tutu_scriptq" "q" + OUTER_SPRINT "tutu_scriptr" "r" + OUTER_SPRINT "tutu_scripts" "s" + OUTER_SPRINT "tutu_scriptt" "t" + OUTER_SPRINT "tutu_scriptu" "u" + OUTER_SPRINT "tutu_scriptv" "v" + OUTER_SPRINT "tutu_scriptw" "w" + OUTER_SPRINT "tutu_scriptx" "x" + OUTER_SPRINT "tutu_scripty" "y" + OUTER_SPRINT "tutu_scriptz" "z" + OUTER_SPRINT "percentage_sign" "%"//%" + + OUTER_SPRINT "tutu_imoen6" "imoen6" + OUTER_SPRINT "tutu_viconi6" "viconi6" + OUTER_SPRINT "tutu_skeleton_warrior" "skelwa" + + /* EET naming convention */ + OUTER_SPRINT "eet_var" "" + + /* EET Worldmap*/ + OUTER_SET wmp_xCoord_SoA = 0 + OUTER_SET wmp_yCoord_SoA = 0 + OUTER_SET wmp_xCoord_ToB = 0 + OUTER_SET wmp_yCoord_ToB = 0 + OUTER_SET wmp_mapIcon_BG1 = 0 + OUTER_SET wmp_mapIcon_ToB = 0 + OUTER_SPRINT wmp_worldmap_ToB "worldm25" + + /* EET continuous journal/chapters system */ + OUTER_SET bg2_chapter_1 = 1 + OUTER_SET bg2_chapter_2 = 2 + OUTER_SET bg2_chapter_3 = 3 + OUTER_SET bg2_chapter_4 = 4 + OUTER_SET bg2_chapter_5 = 5 + OUTER_SET bg2_chapter_6 = 6 + OUTER_SET bg2_chapter_7 = 7 + OUTER_SET bg2_chapter_8 = 8 + OUTER_SET bg2_chapter_9 = 9 + OUTER_SET bg2_chapter_10 = 10 + + /* BGT/EET shutdown of D and BAF after BG1 content */ + OUTER_SPRINT ~BGT_VAR~ ~~ + + /* DVs are the same for Tutu/BGT, except for Imoen */ + OUTER_SPRINT "IMOEN_DV" "imoen" + + /* Items and Variables that need special handling */ + OUTER_SPRINT "KICKED_OUT" "KickedOut" + OUTER_SPRINT "tazokminhp" "MIHP1" + + /* Tutu/BGT vs BGEE/EET Dialog states */ + OUTER_SET firebeadstate1 = 3 + OUTER_SET firebeadstate2 = 1 + OUTER_SET hentolstate1 = 12 + OUTER_SET housg3state0 = 1 + OUTER_SET housg3state5 = 0 + OUTER_SET xanpstate3 = 1 + OUTER_SET xanpstate4 = 0 + + //BGT Dialogues always appended, zero for Tutu + OUTER_SET BGTBEDWINState0 = 0 + OUTER_SET BGTBJAHEIState0 = 0 + OUTER_SET BGTBMINSCState0 = 0 + OUTER_SET BGTBVICONState0 = 0 + OUTER_SET BGTEDWINState0 = 0 + OUTER_SET BGTEDWINJState0 = 0 + OUTER_SET BGTEDWINPState0 = 0 + OUTER_SET BGTIMOEN2State0 = 0 + OUTER_SET BGTIMOENJState0 = 0 + OUTER_SET BGTIMOENPState0 = 0 + OUTER_SET BGTJAHEIJState0 = 0 + OUTER_SET BGTJAHEIPState0 = 0 + OUTER_SET BGTMINSCJState0 = 0 + OUTER_SET BGTMINSCPState0 = 0 + OUTER_SET BGTVICONJState0 = 0 + OUTER_SET BGTVICONPState0 = 0 + + //Never Ending Journey 2 compatibility appending, zero for Tutu + OUTER_SET BGTXANState0 = 0 + + //The Darkest Day compatibility appending, zero for Tutu + OUTER_SET BGTKAGAIPState0 = 0 + OUTER_SET BGTKIVANPState0 = 0 + OUTER_SET BGTSHARTPState0 = 0 + OUTER_SET BGTXZARPState0 = 0 + OUTER_SET BGTYESLIPState0 = 0 + + //Tortured Souls compatibility appending, zero for Tutu + OUTER_SET BGTBCORANState0 = 0 + OUTER_SET BGTCORANState0 = 0 + OUTER_SET BGTCORANJState0 = 0 + OUTER_SET BGTCORANPState0 = 0 + OUTER_SET BGTDYNAHJState0 = 0 + OUTER_SET BGTDYNAHPState0 = 0 + + /* Post Dialogue Files */ + OUTER_SPRINT "AJANTIS_POST" "AJANTP" + OUTER_SPRINT "ALORA_POST" "ALORAP" + OUTER_SPRINT "BRANWEN_POST" "BRANWP" + OUTER_SPRINT "CORAN_POST" "CORANP" + OUTER_SPRINT "DYNAHEIR_POST" "DYNAHP" + OUTER_SPRINT "EDWIN_POST" "EDWINP" + OUTER_SPRINT "ELDOTH_POST" "ELDOTP" + OUTER_SPRINT "FALDORN_POST" "FALDOP" + OUTER_SPRINT "GARRICK_POST" "GARRIP" + OUTER_SPRINT "IMOEN_POST" "IMOENP" + OUTER_SPRINT "JAHEIRA_POST" "JAHEIP" + OUTER_SPRINT "KAGAIN_POST" "KAGAIP" + OUTER_SPRINT "KHALID_POST" "KHALIP" + OUTER_SPRINT "KIVAN_POST" "KIVANP" + OUTER_SPRINT "MINSC_POST" "MINSCP" + OUTER_SPRINT "MONTARON_POST" "MONTAP" + OUTER_SPRINT "QUAYLE_POST" "QUAYLP" + OUTER_SPRINT "SAFANA_POST" "SAFANP" + OUTER_SPRINT "SHARTEEL_POST" "SHARTP" + OUTER_SPRINT "SKIE_POST" "SKIEP" + OUTER_SPRINT "TIAX_POST" "TIAXP" + OUTER_SPRINT "VICONIA_POST" "VICONP" + OUTER_SPRINT "XAN_POST" "XANP" + OUTER_SPRINT "XZAR_POST" "XZARP" + OUTER_SPRINT "YESLICK_POST" "YESLIP" + + /* BG:EE Post Dialogue Files */ + OUTER_SPRINT "DORN_POST" "DORNP" + OUTER_SPRINT "NEERA_POST" "NEERAP" + OUTER_SPRINT "RASAAD_POST" "RASAADP" + + /* Banter Files */ + OUTER_SPRINT "AJANTIS_BANTER" "BAJANT" + OUTER_SPRINT "ALORA_BANTER" "BALORA" + OUTER_SPRINT "BRANWEN_BANTER" "BBRANW" + OUTER_SPRINT "CORAN_BANTER" "BCORAN" + OUTER_SPRINT "DYNAHEIR_BANTER" "BDYNAH" + OUTER_SPRINT "EDWIN_BANTER" "BEDWIN" + OUTER_SPRINT "ELDOTH_BANTER" "BELDOT" + OUTER_SPRINT "FALDORN_BANTER" "BFALDO" + OUTER_SPRINT "GARRICK_BANTER" "BGARRI" + OUTER_SPRINT "IMOEN_BANTER" "BIMOEN" + OUTER_SPRINT "JAHEIRA_BANTER" "BJAHEI" + OUTER_SPRINT "KAGAIN_BANTER" "BKAGAI" + OUTER_SPRINT "KHALID_BANTER" "BKHALI" + OUTER_SPRINT "KIVAN_BANTER" "BKIVAN" + OUTER_SPRINT "MINSC_BANTER" "BMINSC" + OUTER_SPRINT "MONTARON_BANTER" "BMONTA" + OUTER_SPRINT "QUAYLE_BANTER" "BQUAYL" + OUTER_SPRINT "SAFANA_BANTER" "BSAFAN" + OUTER_SPRINT "SHARTEEL_BANTER" "BSHART" + OUTER_SPRINT "SKIE_BANTER" "BSKIE" + OUTER_SPRINT "TIAX_BANTER" "BTIAX" + OUTER_SPRINT "VICONIA_BANTER" "BVICON" + OUTER_SPRINT "XAN_BANTER" "BXANNN" + OUTER_SPRINT "XZAR_BANTER" "BXZAR" + OUTER_SPRINT "YESLICK_BANTER" "BYESLI" + + /* BG:EE Banter Files */ + OUTER_SPRINT "DORN_BANTER" "BDORN" + OUTER_SPRINT "NEERA_BANTER" "BNEERA" + OUTER_SPRINT "RASAAD_BANTER" "BRASAAD" + + /* Joined Dialogue Files */ + OUTER_SPRINT "AJANTIS_JOINED" "AJANTJ" + OUTER_SPRINT "ALORA_JOINED" "ALORAJ" + OUTER_SPRINT "BRANWEN_JOINED" "BRANWJ" + OUTER_SPRINT "CORAN_JOINED" "CORANJ" + OUTER_SPRINT "DYNAHEIR_JOINED" "DYNAHJ" + OUTER_SPRINT "EDWIN_JOINED" "EDWINJ" + OUTER_SPRINT "ELDOTH_JOINED" "ELDOTJ" + OUTER_SPRINT "FALDORN_JOINED" "FALDOJ" + OUTER_SPRINT "GARRICK_JOINED" "GARRIJ" + OUTER_SPRINT "IMOEN_JOINED" "IMOEN2" + OUTER_SPRINT "JAHEIRA_JOINED" "JAHEIJ" + OUTER_SPRINT "KAGAIN_JOINED" "KAGAIJ" + OUTER_SPRINT "KHALID_JOINED" "KHALIJ" + OUTER_SPRINT "KIVAN_JOINED" "KIVANJ" + OUTER_SPRINT "MINSC_JOINED" "MINSCJ" + OUTER_SPRINT "MONTARON_JOINED" "MONTAJ" + OUTER_SPRINT "QUAYLE_JOINED" "QUAYLJ" + OUTER_SPRINT "SAFANA_JOINED" "SAFANJ" + OUTER_SPRINT "SHARTEEL_JOINED" "SHARTJ" + OUTER_SPRINT "SKIE_JOINED" "SKIEJ" + OUTER_SPRINT "TIAX_JOINED" "TIAXJ" + OUTER_SPRINT "VICONIA_JOINED" "VICONJ" + OUTER_SPRINT "XAN_JOINED" "XANJ" + OUTER_SPRINT "XZAR_JOINED" "XZARJ" + OUTER_SPRINT "YESLICK_JOINED" "YESLIJ" + + /* BG:EE Joined Dialogue Files */ + OUTER_SPRINT "DORN_JOINED" "DORNJ" + OUTER_SPRINT "NEERA_JOINED" "NEERAJ" + OUTER_SPRINT "RASAAD_JOINED" "RASAADJ" + + /* Chapters */ + OUTER_SPRINT "tutu_prologue" "0" + OUTER_SPRINT "tutu_prologue_reset" "0" + OUTER_SPRINT "tutu_chapter_1" "1" + OUTER_SPRINT "tutu_chapter_2" "2" + OUTER_SPRINT "tutu_chapter_3" "3" + OUTER_SPRINT "tutu_chapter_4" "4" + OUTER_SPRINT "tutu_chapter_5" "5" + OUTER_SPRINT "tutu_chapter_6" "6" + OUTER_SPRINT "tutu_chapter_7" "7" + + /* NPC override script compilation */ + OUTER_SPRINT "AJANTIS_BCS" "AJANTIS" + OUTER_SPRINT "ALORA_BCS" "ALORA" + OUTER_SPRINT "BRANWEN_BCS" "BRANWEN" + OUTER_SPRINT "CORAN_BCS" "CORAN" + OUTER_SPRINT "DYNAHEIR_BCS" "DYNAHEIR" + OUTER_SPRINT "EDWIN_BCS" "EDWIN" + OUTER_SPRINT "ELDOTH_BCS" "ELDOTH" + OUTER_SPRINT "FALDORN_BCS" "FALDORN" + OUTER_SPRINT "GARRICK_BCS" "GARRICK" + OUTER_SPRINT "IMOEN_BCS" "IMOEN" + OUTER_SPRINT "JAHEIRA_BCS" "JAHEIRA" + OUTER_SPRINT "KAGAIN_BCS" "KAGAIN" + OUTER_SPRINT "KHALID_BCS" "KHALID" + OUTER_SPRINT "KIVAN_BCS" "KIVAN" + OUTER_SPRINT "MINSC_BCS" "MINSC" + OUTER_SPRINT "MONTARON_BCS" "MONTARON" + OUTER_SPRINT "QUAYLE_BCS" "QUAYLE" + OUTER_SPRINT "SAFANA_BCS" "SAFANA" + OUTER_SPRINT "SHARTEEL_BCS" "SHARTEEL" + OUTER_SPRINT "SKIE_BCS" "SKIE" + OUTER_SPRINT "TIAX_BCS" "TIAX" + OUTER_SPRINT "VICONIA_BCS" "VICONIA" + OUTER_SPRINT "XAN_BCS" "XAN" + OUTER_SPRINT "XZAR_BCS" "XZAR" + OUTER_SPRINT "YESLICK_BCS" "YESLICK" + + /* BG:EE NPC override script compilation */ + OUTER_SPRINT "DORN_BCS" "DORN" + OUTER_SPRINT "NEERA_BCS" "NEERA" + OUTER_SPRINT "RASAAD_BCS" "RASAAD" + + /* Areas */ + OUTER_SPRINT "NBaldursGate_TempleofHelm" "AR0002" + OUTER_SPRINT "NBaldursGate_BherensHouse_L1" "AR0004" + OUTER_SPRINT "NBaldursGate_BherensHouse_L2" "AR0005" + OUTER_SPRINT "NBaldursGate_RinniesHouse_L1" "AR0006" + OUTER_SPRINT "NBaldursGate_RinniesHouse_L2" "AR0007" + OUTER_SPRINT "NBaldursGate_House1_L1" "AR0008" + OUTER_SPRINT "NBaldursGate_House1_L2" "AR0009" + OUTER_SPRINT "NBaldursGate_JardaksHouse_L1" "AR0010" + OUTER_SPRINT "NBaldursGate_JardaksHouse_L2" "AR0011" + OUTER_SPRINT "NBaldursGate_House2_L1" "AR0012" + OUTER_SPRINT "NBaldursGate_House2_L2" "AR0013" + OUTER_SPRINT "NBaldursGate_House3_L1" "AR0014" + OUTER_SPRINT "NBaldursGate_House3_L2" "AR0015" + OUTER_SPRINT "NBaldursGate_House4_L1" "AR0016" + OUTER_SPRINT "NBaldursGate_House4_L2" "AR0017" + OUTER_SPRINT "NBaldursGate_House5_L1" "AR0018" + OUTER_SPRINT "NBaldursGate_House5_L2" "AR0019" + OUTER_SPRINT "NBaldursGate_House6_L1" "AR0020" + OUTER_SPRINT "NBaldursGate_House6_L2" "AR0021" + OUTER_SPRINT "NWBaldursGate" "AR0100" + OUTER_SPRINT "NWBaldursGate_SilvershieldEstate_L1" "AR0101" + OUTER_SPRINT "NWBaldursGate_SilvershieldEstate_L2" "AR0102" + OUTER_SPRINT "NEBaldursGate_SplurgingSturgeon_L1" "AR0103" + OUTER_SPRINT "NEBaldursGate_SplurgingSturgeon_L2" "AR0104" + OUTER_SPRINT "SEBaldursGate_Blade&Stars_L1" "AR0105" + OUTER_SPRINT "SEBaldursGate_Blade&Stars_L2" "AR0106" + OUTER_SPRINT "SEBaldursGate_Blade&Stars_L3" "AR0107" + OUTER_SPRINT "NBaldursGate_DucalPalace_L1" "AR0108" + OUTER_SPRINT "NBaldursGate_DucalPalace_L2" "AR0109" + OUTER_SPRINT "NBaldursGate_DucalPalace_L3" "AR0110" + OUTER_SPRINT "NBaldursGate_DucalPalace_Cellar" "AR0111" + OUTER_SPRINT "BaldursGate_Undercellars" "AR0112" + OUTER_SPRINT "NEBaldursGate_BlushingMermaid_L1" "AR0114" + OUTER_SPRINT "NEBaldursGate_BlushingMermaid_L2" "AR0115" + OUTER_SPRINT "NWBaldursGate_Helm&Cloak_L1" "AR0116" + OUTER_SPRINT "NWBaldursGate_Helm&Cloak_L2" "AR0117" + OUTER_SPRINT "NWBaldursGate_Helm&Cloak_L3" "AR0118" + OUTER_SPRINT "NBaldursGate_ThreeOldKegs_L1" "AR0119" + OUTER_SPRINT "NBaldursGate_ThreeOldKegs_L2" "AR0120" + OUTER_SPRINT "NBaldursGate_ThreeOldKegs_L3" "AR0121" + OUTER_SPRINT "Undercity" "AR0123" + OUTER_SPRINT "Undercity_TempleofBhaal" "AR0125" + OUTER_SPRINT "WBaldursGate_RagefastsHouse" "AR0126" + OUTER_SPRINT "SWBaldursGate_MerchantLeague_L1" "AR0127" + OUTER_SPRINT "SWBaldursGate_MerchantLeague_L2" "AR0128" + OUTER_SPRINT "SWBaldursGate_MerchantLeague_L3" "AR0129" + OUTER_SPRINT "WBaldursGate_HallofWonders" "AR0130" + OUTER_SPRINT "WBaldursGate_HighHouseofWonders" "AR0131" + OUTER_SPRINT "WBaldursGate_LadysHouse" "AR0132" + OUTER_SPRINT "BaldursGate_DocksLowLantern_D1" "AR0133" + OUTER_SPRINT "BaldursGate_DocksLowLantern_D2" "AR0134" + OUTER_SPRINT "BaldursGate_DocksLowLantern_D3" "AR0135" + OUTER_SPRINT "BaldursGate_DocksLowLantern_D4" "AR0136" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L1" "AR0137" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L6" "AR0138" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L2" "AR0139" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L3" "AR0140" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L4" "AR0141" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L5" "AR0142" + OUTER_SPRINT "CentralBaldursGate_OberonsEstate_L1" "AR0143" + OUTER_SPRINT "CentralBaldursGate_OberonsEstate_L2" "AR0144" + OUTER_SPRINT "CentralBaldursGate_OberonsEstate_L3" "AR0145" + OUTER_SPRINT "ThievesMaze" "AR0146" + OUTER_SPRINT "EBaldursGate_House5" "AR0148" + OUTER_SPRINT "NEBaldursGate_IlmatersShrine" "AR0149" + OUTER_SPRINT "EBaldursGate_House2" "AR0150" + OUTER_SPRINT "EBaldursGate_House3" "AR0151" + OUTER_SPRINT "EBaldursGate_House4" "AR0152" + OUTER_SPRINT "EBaldursGate_ThievesGuild" "AR0153" + OUTER_SPRINT "EBaldursGate_KeexieTavern_L1" "AR0154" + OUTER_SPRINT "NWBaldursGate_House3_L1" "AR0155" + OUTER_SPRINT "NWBaldursGate_House3_L2" "AR0156" + OUTER_SPRINT "NWBaldursGate_QuinnsHouse_L1" "AR0157" + OUTER_SPRINT "NWBaldursGate_QuinnsHouse_L2" "AR0158" + OUTER_SPRINT "NWBaldursGate_House1_L1" "AR0159" + OUTER_SPRINT "NWBaldursGate_House1_L2" "AR0160" + OUTER_SPRINT "NWBaldursGate_DegrodelsHouse" "AR0161" + OUTER_SPRINT "NWBaldursGate_LaertasHouse_L1" "AR0162" + OUTER_SPRINT "NWBaldursGate_House2_L1" "AR0163" + OUTER_SPRINT "NWBaldursGate_House2_L2" "AR0164" + OUTER_SPRINT "NWBaldursGate_Tavern_L1" "AR0165" + OUTER_SPRINT "NWBaldursGate_Tavern_L2" "AR0166" + OUTER_SPRINT "NWBaldursGate_PheirkasHouse_L1" "AR0167" + OUTER_SPRINT "NWBaldursGate_PheirkasHouse_L2" "AR0168" + OUTER_SPRINT "NWBaldursGate_House4_L1" "AR0169" + OUTER_SPRINT "NWBaldursGate_House4_L2" "AR0170" + OUTER_SPRINT "EBaldursGate_KeexieTavern_L2" "AR0171" + OUTER_SPRINT "NBaldursGate" "AR0200" + OUTER_SPRINT "WSewers" "AR0224" + OUTER_SPRINT "CentralSewers" "AR0225" + OUTER_SPRINT "ESewers" "AR0226" + OUTER_SPRINT "NEBaldursGate" "AR0300" + OUTER_SPRINT "NEBaldursGate_House2_L1" "AR0302" + OUTER_SPRINT "NEBaldursGate_House2_L2" "AR0303" + OUTER_SPRINT "NEBaldursGate_Store" "AR0304" + OUTER_SPRINT "NEBaldursGate_House1_L1" "AR0305" + OUTER_SPRINT "NEBaldursGate_House1_L2" "AR0306" + OUTER_SPRINT "NEBaldursGate_CountingHouse_L1" "AR0307" + OUTER_SPRINT "NEBaldursGate_CountingHouse_L2" "AR0308" + OUTER_SPRINT "WBaldursGate" "AR0600" + OUTER_SPRINT "SWBaldursGate_SevenSuns_L1" "AR0601" + OUTER_SPRINT "SWBaldursGate_SevenSuns_L2" "AR0602" + OUTER_SPRINT "SWBaldursGate_SevenSuns_Cellar" "AR0603" + OUTER_SPRINT "SWBaldursGate_FlamingFistHQ_Cellar" "AR0606" + OUTER_SPRINT "SWBaldursGate_FlamingFistHQ_L1" "AR0607" + OUTER_SPRINT "SWBaldursGate_FlamingFistHQ_L2" "AR0608" + OUTER_SPRINT "BaldursGateDocks_WaterQueensHouse" "AR0609" + OUTER_SPRINT "BaldursGateDocks_IronThrone_Cellar" "AR0611" + OUTER_SPRINT "BaldursGateDocks_IronThrone_L2" "AR0612" + OUTER_SPRINT "BaldursGateDocks_IronThrone_L3" "AR0613" + OUTER_SPRINT "BaldursGateDocks_IronThrone_L4" "AR0614" + OUTER_SPRINT "BaldursGateDocks_IronThrone_L5" "AR0615" + OUTER_SPRINT "BaldursGateDocks_IronThrone_L1" "AR0616" + OUTER_SPRINT "WBaldursGate_TremainsHouse_L1" "AR0617" + OUTER_SPRINT "WBaldursGate_TremainsHouse_L2" "AR0618" + OUTER_SPRINT "WBaldursGate_FentensHouse_L1" "AR0619" + OUTER_SPRINT "WBaldursGate_FentensHouse_L2" "AR0620" + OUTER_SPRINT "BaldursGateDocks_IronThroneRoof" "AR0621" + OUTER_SPRINT "CentralBaldursGate" "AR0700" + OUTER_SPRINT "BaldursGateDocks_Harbormaster" "AR0702" + OUTER_SPRINT "EBaldursGate_SorcerousSundries_L1" "AR0703" + OUTER_SPRINT "EBaldursGate_SorcerousSundries_L2" "AR0704" + OUTER_SPRINT "EBaldursGate_ElfsongTavern_L1" "AR0705" + OUTER_SPRINT "EBaldursGate_ElfsongTavern_L2" "AR0706" + OUTER_SPRINT "CentralBaldursGate_House3_L1" "AR0707" + OUTER_SPRINT "CentralBaldursGate_House3_L2" "AR0708" + OUTER_SPRINT "CentralBaldursGate_House2_L1" "AR0709" + OUTER_SPRINT "CentralBaldursGate_House2_L2" "AR0710" + OUTER_SPRINT "CentralBaldursGate_House1_L1" "AR0711" + OUTER_SPRINT "CentralBaldursGate_House1_L2" "AR0712" + OUTER_SPRINT "CentralBaldursGate_House5_L1" "AR0713" + OUTER_SPRINT "CentralBaldursGate_House5_L2" "AR0714" + OUTER_SPRINT "CentralBaldursGate_NadinesHouse_L1" "AR0715" + OUTER_SPRINT "CentralBaldursGate_NadinesHouse_L2" "AR0716" + OUTER_SPRINT "CentralBaldursGate_House6_L1" "AR0717" + OUTER_SPRINT "CentralBaldursGate_House6_L2" "AR0718" + OUTER_SPRINT "CentralBaldursGate_FeloniusManor" "AR0719" + OUTER_SPRINT "CentralBaldursGate_DrakonTavern" "AR0720" + OUTER_SPRINT "CentralBaldursGate_PoultryStore" "AR0721" + OUTER_SPRINT "CentralBaldursGate_House4_L1" "AR0722" + OUTER_SPRINT "CentralBaldursGate_House4_L2" "AR0723" + OUTER_SPRINT "CentralBaldursGate_GamblingTent1" "AR0724" + OUTER_SPRINT "CentralBaldursGate_GamblingTent2" "AR0725" + OUTER_SPRINT "CentralBaldursGate_DivinersTent" "AR0726" + OUTER_SPRINT "EBaldursGate" "AR0800" + OUTER_SPRINT "EBaldursGate_House6_L1" "AR0801" + OUTER_SPRINT "EBaldursGate_House6_L2" "AR0802" + OUTER_SPRINT "EBaldursGate_MaltzWeaponShop_L1" "AR0803" + OUTER_SPRINT "EBaldursGate_MaltzWeaponShop_L2" "AR0804" + OUTER_SPRINT "EBaldursGate_ArkionsHouse_L1" "AR0805" + OUTER_SPRINT "EBaldursGate_ArkionsHouse_L2" "AR0806" + OUTER_SPRINT "EBaldursGate_Inn_L1" "AR0807" + OUTER_SPRINT "EBaldursGate_Inn_L2" "AR0808" + OUTER_SPRINT "EBaldursGate_SilencesShop" "AR0809" + OUTER_SPRINT "EBaldursGate_LuckyAellos" "AR0810" + OUTER_SPRINT "EBaldursGate_House1_L1" "AR0811" + OUTER_SPRINT "EBaldursGate_House1_L2" "AR0812" + OUTER_SPRINT "SEBaldursGate_NemphresHouse_L1" "AR0813" + OUTER_SPRINT "SEBaldursGate_NemphresHouse_L2" "AR0814" + OUTER_SPRINT "WyrmsCrossing" "AR0900" + OUTER_SPRINT "WyrmsCrossingTenyasHouse" "AR0901" + OUTER_SPRINT "SWBaldursGate" "AR1100" + OUTER_SPRINT "SWBaldursGate_WivensHouse_L1" "AR1101" + OUTER_SPRINT "SWBaldursGate_WivensHouse_L2" "AR1102" + OUTER_SPRINT "SWBaldursGate_House3_L1" "AR1103" + OUTER_SPRINT "SWBaldursGate_House3_L2" "AR1104" + OUTER_SPRINT "SWBaldursGate_House1_L1" "AR1105" + OUTER_SPRINT "SWBaldursGate_House1_L2" "AR1106" + OUTER_SPRINT "SWBaldursGate_House2_L1" "AR1107" + OUTER_SPRINT "SWBaldursGate_House2_L2" "AR1108" + OUTER_SPRINT "SWBaldursGate_Tavern_L1" "AR1109" + OUTER_SPRINT "SWBaldursGate_Tavern_L2" "AR1110" + OUTER_SPRINT "SWBaldursGate_SuninsHouse" "AR1111" + OUTER_SPRINT "SWBaldursGate_WeaponsStore1" "AR1112" + OUTER_SPRINT "SWBaldursGate_YeOldeInn_L1" "AR1113" + OUTER_SPRINT "SWBaldursGate_YeOldeInn_L2" "AR1114" + OUTER_SPRINT "SWBaldursGate_PotionsStore2" "AR1115" + OUTER_SPRINT "SWBaldursGate_WeaponsStore2" "AR1116" + OUTER_SPRINT "SWBaldursGate_PotionsStore1" "AR1117" + OUTER_SPRINT "BaldursGateDocks" "AR1200" + OUTER_SPRINT "BaldursGateDocks_OgreMagiHouse_L1" "AR1201" + OUTER_SPRINT "BaldursGateDocks_OgreMagiHouse_L2" "AR1202" + OUTER_SPRINT "BaldursGateDocks_House2_L1" "AR1203" + OUTER_SPRINT "BaldursGateDocks_House2_L2" "AR1204" + OUTER_SPRINT "BaldursGateDocks_House1_L1" "AR1205" + OUTER_SPRINT "BaldursGateDocks_House1_L2" "AR1206" + OUTER_SPRINT "BaldursGateDocks_BasiliskWarehouse" "AR1207" + OUTER_SPRINT "BaldursGateDocks_NoraleesWarehouse" "AR1208" + OUTER_SPRINT "BaldursGateDocks_LarriazHouse_L1" "AR1209" + OUTER_SPRINT "BaldursGateDocks_LarriazHouse_L2" "AR1210" + OUTER_SPRINT "BaldursGateDocks_GhoraksHouse_L1" "AR1211" + OUTER_SPRINT "BaldursGateDocks_GhoraksHouse_L2" "AR1212" + OUTER_SPRINT "BaldursGateDocks_CordyrsHouse_L1" "AR1213" + OUTER_SPRINT "BaldursGateDocks_CordyrsHouse_L2" "AR1214" + OUTER_SPRINT "BaldursGateDocks_JopalinsTavern" "AR1215" + OUTER_SPRINT "SEBaldursGate" "AR1300" + OUTER_SPRINT "SEBaldursGate_Warehouse" "AR1301" + OUTER_SPRINT "SEBaldursGate_GeneralStore2" "AR1302" + OUTER_SPRINT "SEBaldursGate_NadarinsWarehouse" "AR1303" + OUTER_SPRINT "SEBaldursGate_House3_L1" "AR1304" + OUTER_SPRINT "SEBaldursGate_House3_L2" "AR1305" + OUTER_SPRINT "SEBaldursGate_Inn_L1" "AR1306" + OUTER_SPRINT "SEBaldursGate_Inn_L2" "AR1307" + OUTER_SPRINT "SEBaldursGate_House4_L1" "AR1308" + OUTER_SPRINT "SEBaldursGate_House4_L2" "AR1309" + OUTER_SPRINT "SEBaldursGate_House2_L1" "AR1310" + OUTER_SPRINT "SEBaldursGate_House2_L2" "AR1311" + OUTER_SPRINT "SEBaldursGate_GantolandansHouse_L1" "AR1312" + OUTER_SPRINT "SEBaldursGate_GantolandansHouse_L2" "AR1313" + OUTER_SPRINT "SEBaldursGate_House1_L1" "AR1314" + OUTER_SPRINT "SEBaldursGate_House1_L2" "AR1315" + OUTER_SPRINT "SEBaldursGate_TaxeksHouse_L1" "AR1316" + OUTER_SPRINT "SEBaldursGate_TaxeksHouse_L2" "AR1317" + OUTER_SPRINT "SEBaldursGate_GeneralStore1" "AR1320" + OUTER_SPRINT "FishingVillage" "AR1400" + OUTER_SPRINT "FishingVillage_AnkhegPit" "AR1401" + OUTER_SPRINT "FishingVillage_House1" "AR1402" + OUTER_SPRINT "FishingVillage_House2" "AR1403" + OUTER_SPRINT "FishingVillage_FarmerBrunsHouse" "AR1404" + OUTER_SPRINT "CloakwoodDruids" "AR1600" + OUTER_SPRINT "CloakwoodDruids_Treehouse_L1" "AR1601" + OUTER_SPRINT "CloakwoodDruids_Treehouse_L2" "AR1602" + OUTER_SPRINT "CloakwoodDruids_PetersCave" "AR1603" + OUTER_SPRINT "CloakwoodWyverns" "AR1700" + OUTER_SPRINT "CloakwoodMines" "AR1800" + OUTER_SPRINT "CloakwoodMines_L1" "AR1801" + OUTER_SPRINT "CloakwoodMines_L3" "AR1802" + OUTER_SPRINT "CloakwoodMines_L4" "AR1803" + OUTER_SPRINT "CloakwoodMines_L2" "AR1804" + OUTER_SPRINT "CloakwoodMines_Barracks_L1" "AR1805" + OUTER_SPRINT "CloakwoodMines_Barracks_L2" "AR1806" + OUTER_SPRINT "CloakwoodMines_MineLift" "AR1807" + OUTER_SPRINT "CloakwoodMines_Storehouse" "AR1808" + OUTER_SPRINT "CloakwoodMines_MineShed" "AR1809" + OUTER_SPRINT "BanditCamp" "AR1900" + OUTER_SPRINT "BanditCamp_RaemonsTent" "AR1901" + OUTER_SPRINT "BanditCamp_Tent2" "AR1902" + OUTER_SPRINT "BanditCamp_GnollCave" "AR1903" + OUTER_SPRINT "BanditCamp_TersusTent" "AR1904" + OUTER_SPRINT "BanditCamp_Tent1" "AR1905" + OUTER_SPRINT "BanditCamp_Tent3" "AR1906" + OUTER_SPRINT "BanditCamp_Tent4" "AR1907" + OUTER_SPRINT "CloakwoodNest" "AR2100" + OUTER_SPRINT "CloakwoodNestSpiderNest" "AR2101" + OUTER_SPRINT "CloakwoodLodge" "AR2200" + OUTER_SPRINT "CloakwoodLodgeHuntingLodge" "AR2215" + OUTER_SPRINT "FriendlyArmInn" "AR2300" + OUTER_SPRINT "FriendlyArmInn_L1" "AR2301" + OUTER_SPRINT "FriendlyArmInn_L2" "AR2302" + OUTER_SPRINT "FriendlyArmInn_L3" "AR2303" + OUTER_SPRINT "FriendlyArmInn_TempleofWisdom" "AR2304" + OUTER_SPRINT "FriendlyArmInn_House" "AR2305" + OUTER_SPRINT "FriendlyArmInn_JoiasHouse" "AR2306" + OUTER_SPRINT "Peldvale" "AR2400" + OUTER_SPRINT "Candlekeep" "AR2600" + OUTER_SPRINT "Candlekeep_PriestsQuarters" "AR2602" + OUTER_SPRINT "Candlekeep_Infirmary" "AR2605" + OUTER_SPRINT "Candlekeep_Storehouse" "AR2606" + OUTER_SPRINT "Candlekeep_Bunkhouse" "AR2607" + OUTER_SPRINT "Candlekeep_Library_L1" "AR2608" + OUTER_SPRINT "Candlekeep_Library_L2" "AR2609" + OUTER_SPRINT "Candlekeep_Library_L3" "AR2610" + OUTER_SPRINT "Candlekeep_Library_L4" "AR2611" + OUTER_SPRINT "Candlekeep_Library_L5" "AR2612" + OUTER_SPRINT "Candlekeep_Catacombs_L1Antechamber" "AR2613" + OUTER_SPRINT "Candlekeep_Library_L6" "AR2614" + OUTER_SPRINT "Candlekeep_Catacombs_L1" "AR2615" + OUTER_SPRINT "Candlekeep_Inn_L1" "AR2616" + OUTER_SPRINT "Candlekeep_Inn_L2" "AR2617" + OUTER_SPRINT "Candlekeep_Barracks" "AR2618" + OUTER_SPRINT "Candlekeep_Catacombs_L2" "AR2619" + OUTER_SPRINT "Candlekeep_Ch6" "AR2626" + OUTER_SPRINT "Candlekeep_Ch6_PriestsQuarters" "AR2627" + OUTER_SPRINT "Candlekeep_Ch6_Storehouse" "AR2628" + OUTER_SPRINT "Candlekeep_Ch6_Inn_L1" "AR2629" + OUTER_SPRINT "Candlekeep_Ch6_Inn_L2" "AR2630" + OUTER_SPRINT "Candlekeep_Ch6_Barracks" "AR2631" + OUTER_SPRINT "Candlekeep_Ch6_Bunkhouse" "AR2632" + OUTER_SPRINT "Candlekeep_Ch6_Infirmary" "AR2633" + OUTER_SPRINT "Candlekeep_ObesCellar" "AR2643" + OUTER_SPRINT "LionsWay" "AR2700" + OUTER_SPRINT "CoastWay" "AR2800" + OUTER_SPRINT "Larswood" "AR2900" + OUTER_SPRINT "SpiderWood" "AR3000" + OUTER_SPRINT "ShipwrecksCoast" "AR3100" + OUTER_SPRINT "HighHedge" "AR3200" + OUTER_SPRINT "HighHedge_House" "AR3201" + OUTER_SPRINT "HighHedge_ThalanthyrsAbode" "AR3202" + OUTER_SPRINT "Beregost" "AR3300" + OUTER_SPRINT "Beregost_ThunderhammerSmithy" "AR3301" + OUTER_SPRINT "Beregost_House19" "AR3302" + OUTER_SPRINT "Beregost_RedSheaf_L2" "AR3303" + OUTER_SPRINT "Beregost_JovialJuggler_L1" "AR3304" + OUTER_SPRINT "Beregost_JovialJuggler_L2F" "AR3305" + OUTER_SPRINT "Beregost_JovialJuggler_L2R" "AR3306" + OUTER_SPRINT "Beregost_BurningWizard_L1" "AR3307" + OUTER_SPRINT "Beregost_BurningWizard_L2" "AR3308" + OUTER_SPRINT "Beregost_House13_L1" "AR3309" + OUTER_SPRINT "Beregost_House13_L2" "AR3310" + OUTER_SPRINT "Beregost_House12_L1" "AR3311" + OUTER_SPRINT "Beregost_House12_L2" "AR3312" + OUTER_SPRINT "Beregost_MiriannesHouse_L1" "AR3313" + OUTER_SPRINT "Beregost_MiriannesHouse_L2" "AR3314" + OUTER_SPRINT "Beregost_LandrinsHouse" "AR3315" + OUTER_SPRINT "Beregost_House18" "AR3316" + OUTER_SPRINT "Beregost_House17" "AR3317" + OUTER_SPRINT "Beregost_House15" "AR3318" + OUTER_SPRINT "Beregost_House16" "AR3319" + OUTER_SPRINT "Beregost_TravenhurstManor_L1" "AR3320" + OUTER_SPRINT "Beregost_TravenhurstManor_L2" "AR3321" + OUTER_SPRINT "Beregost_ServantsQuarters" "AR3322" + OUTER_SPRINT "Beregost_House20_L1" "AR3323" + OUTER_SPRINT "Beregost_House20_L2" "AR3324" + OUTER_SPRINT "Beregost_House23_L1" "AR3325" + OUTER_SPRINT "Beregost_House23_L2" "AR3326" + OUTER_SPRINT "Beregost_House14_L1" "AR3327" + OUTER_SPRINT "Beregost_House14_L2" "AR3328" + OUTER_SPRINT "Beregost_House21_L1" "AR3329" + OUTER_SPRINT "Beregost_House21_L2" "AR3330" + OUTER_SPRINT "Beregost_House11_L1" "AR3331" + OUTER_SPRINT "Beregost_House11_L2" "AR3332" + OUTER_SPRINT "Beregost_FirebeadsHouse_L1" "AR3333" + OUTER_SPRINT "Beregost_FirebeadsHouse_L2" "AR3334" + OUTER_SPRINT "Beregost_House10_L1" "AR3335" + OUTER_SPRINT "Beregost_House10_L2" "AR3336" + OUTER_SPRINT "Beregost_House22_L1" "AR3337" + OUTER_SPRINT "Beregost_House22_L2" "AR3338" + OUTER_SPRINT "Beregost_House01_L1" "AR3339" + OUTER_SPRINT "Beregost_House01_L2" "AR3340" + OUTER_SPRINT "Beregost_House02_L1" "AR3341" + OUTER_SPRINT "Beregost_House02_L2" "AR3342" + OUTER_SPRINT "Beregost_House03" "AR3343" + OUTER_SPRINT "Beregost_House07" "AR3344" + OUTER_SPRINT "Beregost_House04_L1" "AR3345" + OUTER_SPRINT "Beregost_House04_L2" "AR3346" + OUTER_SPRINT "Beregost_House05_L1" "AR3347" + OUTER_SPRINT "Beregost_House05_L2" "AR3348" + OUTER_SPRINT "Beregost_House06_L1" "AR3349" + OUTER_SPRINT "Beregost_House06_L2" "AR3350" + OUTER_SPRINT "Beregost_FeldepostsInn_L1" "AR3351" + OUTER_SPRINT "Beregost_FeldepostsInn_L2" "AR3352" + OUTER_SPRINT "Beregost_KagainsStore" "AR3353" + OUTER_SPRINT "Beregost_House09" "AR3354" + OUTER_SPRINT "Beregost_House08" "AR3355" + OUTER_SPRINT "Beregost_House08_L2" "AR3356" + OUTER_SPRINT "Beregost_RedSheaf_L1" "AR3357" + OUTER_SPRINT "Temple" "AR3400" + OUTER_SPRINT "Temple_Vestibule" "AR3401" + OUTER_SPRINT "Temple_SongoftheMorning" "AR3402" + OUTER_SPRINT "MutaminsGarden" "AR3500" + OUTER_SPRINT "Lighthouse" "AR3600" + OUTER_SPRINT "Lighthouse_BlackAlaricsCave" "AR3601" + OUTER_SPRINT "RedCanyons" "AR3700" + OUTER_SPRINT "SouthBeregostRoad" "AR3800" + OUTER_SPRINT "SouthBeregostRoad_Cave" "AR3802" + OUTER_SPRINT "Ulcaster" "AR3900" + OUTER_SPRINT "UlcasterRuins" "AR3901" + OUTER_SPRINT "Gullykin" "AR4000" + OUTER_SPRINT "Gullykin_JenkalsHouse_L1" "AR4001" + OUTER_SPRINT "Gullykin_JenkalsHouse_Cellar" "AR4002" + OUTER_SPRINT "Gullykin_Winery_L1" "AR4003" + OUTER_SPRINT "Gullykin_Winery_Cellar" "AR4004" + OUTER_SPRINT "Gullykin_House1_L1" "AR4005" + OUTER_SPRINT "Gullykin_House1_Cellar" "AR4006" + OUTER_SPRINT "Gullykin_House3_L1" "AR4007" + OUTER_SPRINT "Gullykin_House3_Cellar" "AR4008" + OUTER_SPRINT "Gullykin_House4_L1" "AR4009" + OUTER_SPRINT "Gullykin_House4_Cellar" "AR4010" + OUTER_SPRINT "Gullykin_House5_L1" "AR4011" + OUTER_SPRINT "Gullykin_House5_Cellar" "AR4012" + OUTER_SPRINT "Gullykin_House2_L1" "AR4013" + OUTER_SPRINT "Gullykin_House2_Cellar" "AR4014" + OUTER_SPRINT "ArchaeologicalSite" "AR4100" + OUTER_SPRINT "ArchaeologicalSite_Tomb" "AR4101" + OUTER_SPRINT "FishermansLake" "AR4200" + OUTER_SPRINT "NorthNashkelRoad" "AR4300" + OUTER_SPRINT "LonelyPeaks" "AR4400" + OUTER_SPRINT "LonelyPeaks_Cave" "AR4401" + OUTER_SPRINT "FirewineBridge" "AR4500" + OUTER_SPRINT "CloakwoodWyverns_WyvernCave" "AR4501" + OUTER_SPRINT "BearRiver" "AR4600" + OUTER_SPRINT "XvartVillage" "AR4700" + OUTER_SPRINT "XvartVillage_Cave" "AR4701" + OUTER_SPRINT "Nashkel" "AR4800" + OUTER_SPRINT "Nashkel_Inn" "AR4801" + OUTER_SPRINT "Nashkel_TempleofHelm" "AR4802" + OUTER_SPRINT "Nashkel_Store" "AR4803" + OUTER_SPRINT "Nashkel_ManorHouse_L1" "AR4804" + OUTER_SPRINT "Nashkel_ManorHouse_L2" "AR4805" + OUTER_SPRINT "Nashkel_JosephsHouse" "AR4806" + OUTER_SPRINT "Nashkel_House1" "AR4807" + OUTER_SPRINT "Nashkel_House2" "AR4808" + OUTER_SPRINT "Nashkel_BelchingDragonTavern" "AR4809" + OUTER_SPRINT "Nashkel_Garrison" "AR4810" + OUTER_SPRINT "NashkelCarnival" "AR4900" + OUTER_SPRINT "NashkelCarnival_ArmorTent" "AR4901" + OUTER_SPRINT "NashkelCarnival_LotusTent" "AR4902" + OUTER_SPRINT "NashkelCarnival_VitiaresTent" "AR4903" + OUTER_SPRINT "NashkelCarnival_GamblingTent" "AR4904" + OUTER_SPRINT "NashkelCarnival_PotionTent" "AR4905" + OUTER_SPRINT "NashkelCarnival_ZordralsTent" "AR4906" + OUTER_SPRINT "NashkelCarnival_MagicItemsTent" "AR4907" + OUTER_SPRINT "NashkelCarnival_MeleeWeaponsTent" "AR4908" + OUTER_SPRINT "NashkelCarnival_RangedWeaponsTent" "AR4909" + OUTER_SPRINT "ValleyoftheTombs" "AR5000" + OUTER_SPRINT "ValleyoftheTombs_Tomb" "AR5001" + OUTER_SPRINT "GnollStronghold" "AR5100" + OUTER_SPRINT "GnollStronghold_XvartCave" "AR5101" + OUTER_SPRINT "GnollStronghold_TomeCave" "AR5102" + OUTER_SPRINT "GnollStronghold_CrawlerCave" "AR5103" + OUTER_SPRINT "DryadFalls" "AR5200" + OUTER_SPRINT "FirewineRuins" "AR5201" + OUTER_SPRINT "DryadFalls_Cave" "AR5202" + OUTER_SPRINT "FireLeafForest" "AR5300" + OUTER_SPRINT "NashkelMines" "AR5400" + OUTER_SPRINT "NashkelMines_L1" "AR5401" + OUTER_SPRINT "NashkelMines_L2" "AR5402" + OUTER_SPRINT "NashkelMines_L3" "AR5403" + OUTER_SPRINT "NashkelMines_L4" "AR5404" + OUTER_SPRINT "NashkelMines_MulaheysCave" "AR5405" + OUTER_SPRINT "NashkelMines_Cabin" "AR5406" + OUTER_SPRINT "GibberlingMountains" "AR5500" + OUTER_SPRINT "CandlekeepCaves" "AR5506" + OUTER_SPRINT "Encounter_Plains1" "AR5600" + OUTER_SPRINT "Encounter_Plains2" "AR5601" + OUTER_SPRINT "Encounter_Canyon1" "AR5700" + OUTER_SPRINT "Encounter_Canyon2" "AR5701" + OUTER_SPRINT "Encounter_Cliff1" "AR5800" + OUTER_SPRINT "Encounter_Cliff2" "AR5801" + OUTER_SPRINT "Encounter_Grassland1" "AR5900" + OUTER_SPRINT "Encounter_Grassland2" "AR5901" + OUTER_SPRINT "Encounter_Forest1" "AR6000" + OUTER_SPRINT "Encounter_Forest2" "AR6001" + OUTER_SPRINT "Encounter_Road" "AR6100" + + /* TOTSC Areas; BGT requires it, but separation needed for Tutu */ + OUTER_SPRINT "Farmlands" "AR0400" + OUTER_SPRINT "FarmlandsFarmhouse" "AR0401" + OUTER_SPRINT "DurlagsTower" "AR0500" + OUTER_SPRINT "DurlagsTower_Cellar" "AR0501" + OUTER_SPRINT "DurlagsTower_L1" "AR0502" + OUTER_SPRINT "DurlagsTower_L2" "AR0503" + OUTER_SPRINT "DurlagsTower_L3" "AR0504" + OUTER_SPRINT "DurlagsTower_L4" "AR0505" + OUTER_SPRINT "DurlagsTower_Chessboard" "AR0506" + OUTER_SPRINT "DurlagsTower_IceChamber" "AR0507" + OUTER_SPRINT "DurlagsTower_FireChamber" "AR0508" + OUTER_SPRINT "DurlagsTower_AirChamber" "AR0509" + OUTER_SPRINT "DurlagsTower_EarthChamber" "AR0510" + OUTER_SPRINT "DurlagsTower_D1" "AR0511" + OUTER_SPRINT "DurlagsTower_D2" "AR0512" + OUTER_SPRINT "DurlagsTower_D3" "AR0513" + OUTER_SPRINT "DurlagsTower_D4" "AR0514" + OUTER_SPRINT "DurlagsTower_CompassRoom" "AR0515" + OUTER_SPRINT "DurlagsTower_DemonknightsChamber" "AR0516" + OUTER_SPRINT "IsleofBalduranN" "AR1500" + OUTER_SPRINT "IsleofBalduranNShip_D1" "AR1501" + OUTER_SPRINT "IsleofBalduranNShip_D2" "AR1502" + OUTER_SPRINT "IsleofBalduranNShip_D3" "AR1503" + OUTER_SPRINT "IsleofBalduranNShip_D4" "AR1504" + OUTER_SPRINT "IsleofBalduranNDradeelsHouse" "AR1505" + OUTER_SPRINT "IsleofBalduranS" "AR2000" + OUTER_SPRINT "IsleofBalduranS_GreatHut" "AR2001" + OUTER_SPRINT "IsleofBalduranS_KaishasHut" "AR2002" + OUTER_SPRINT "IsleofBalduranS_LargeHut3" "AR2003" + OUTER_SPRINT "IsleofBalduranS_LargeHut2" "AR2004" + OUTER_SPRINT "IsleofBalduranS_LargeHut4" "AR2005" + OUTER_SPRINT "IsleofBalduranS_LargeHut1" "AR2006" + OUTER_SPRINT "IsleofBalduranS_HarborHut" "AR2007" + OUTER_SPRINT "IsleofBalduranS_StoreHut2" "AR2008" + OUTER_SPRINT "IsleofBalduranS_StoreHut1" "AR2009" + OUTER_SPRINT "IsleofBalduranS_StoreHut4" "AR2010" + OUTER_SPRINT "IsleofBalduranS_StoreHut3" "AR2011" + OUTER_SPRINT "WerewolfCaverns" "AR2012" + OUTER_SPRINT "UlgothsBeard" "AR1000" + OUTER_SPRINT "UlgothsBeard_Inn" "AR1001" + OUTER_SPRINT "UlgothsBeard_DemonsChamber" "AR1002" + OUTER_SPRINT "UlgothsBeard_Storehouse" "AR1003" + OUTER_SPRINT "UlgothsBeard_MendasHouse" "AR1004" + OUTER_SPRINT "UlgothsBeard_TherellasHouse" "AR1005" + OUTER_SPRINT "UlgothsBeard_House2" "AR1006" + OUTER_SPRINT "UlgothsBeard_House1" "AR1007" + OUTER_SPRINT "IceIsland" "AR1008" + OUTER_SPRINT "IceIslandMaze_L1" "AR1009" + OUTER_SPRINT "IceIslandMaze_L2" "AR1010" + + /* AREA_SCRIPTS (full list using the same var names as areas, with added _BCS at the end)*/ + //these variables are not needed for BG:EE, BGT, EET, but for some reason Tutu doesn't use the same names as areas, so they must be assigned + OUTER_SPRINT "NBaldursGate_TempleofHelm_BCS" "AR0002" + OUTER_SPRINT "NBaldursGate_BherensHouse_L1_BCS" "AR0004" + OUTER_SPRINT "NBaldursGate_BherensHouse_L2_BCS" "AR0005" + OUTER_SPRINT "NBaldursGate_RinniesHouse_L1_BCS" "AR0006" + OUTER_SPRINT "NBaldursGate_RinniesHouse_L2_BCS" "AR0007" + OUTER_SPRINT "NBaldursGate_House1_L1_BCS" "AR0008" + OUTER_SPRINT "NBaldursGate_House1_L2_BCS" "AR0009" + OUTER_SPRINT "NBaldursGate_JardaksHouse_L1_BCS" "AR0010" + OUTER_SPRINT "NBaldursGate_JardaksHouse_L2_BCS" "AR0011" + OUTER_SPRINT "NBaldursGate_House2_L1_BCS" "AR0012" + OUTER_SPRINT "NBaldursGate_House2_L2_BCS" "AR0013" + OUTER_SPRINT "NBaldursGate_House3_L1_BCS" "AR0014" + OUTER_SPRINT "NBaldursGate_House3_L2_BCS" "AR0015" + OUTER_SPRINT "NBaldursGate_House4_L1_BCS" "AR0016" + OUTER_SPRINT "NBaldursGate_House4_L2_BCS" "AR0017" + OUTER_SPRINT "NBaldursGate_House5_L1_BCS" "AR0018" + OUTER_SPRINT "NBaldursGate_House5_L2_BCS" "AR0019" + OUTER_SPRINT "NBaldursGate_House6_L1_BCS" "AR0020" + OUTER_SPRINT "NBaldursGate_House6_L2_BCS" "AR0021" + OUTER_SPRINT "NWBaldursGate_BCS" "AR0100" + OUTER_SPRINT "NWBaldursGate_SilvershieldEstate_L1_BCS" "AR0101" + OUTER_SPRINT "NWBaldursGate_SilvershieldEstate_L2_BCS" "AR0102" + OUTER_SPRINT "NEBaldursGate_SplurgingSturgeon_L1_BCS" "AR0103" + OUTER_SPRINT "NEBaldursGate_SplurgingSturgeon_L2_BCS" "AR0104" + OUTER_SPRINT "SEBaldursGate_Blade&Stars_L1_BCS" "AR0105" + OUTER_SPRINT "SEBaldursGate_Blade&Stars_L2_BCS" "AR0106" + OUTER_SPRINT "SEBaldursGate_Blade&Stars_L3_BCS" "AR0107" + OUTER_SPRINT "NBaldursGate_DucalPalace_L1_BCS" "AR0108" + OUTER_SPRINT "NBaldursGate_DucalPalace_L2_BCS" "AR0109" + OUTER_SPRINT "NBaldursGate_DucalPalace_L3_BCS" "AR0110" + OUTER_SPRINT "NBaldursGate_DucalPalace_Cellar_BCS" "AR0111" + OUTER_SPRINT "BaldursGate_Undercellars_BCS" "AR0112" + OUTER_SPRINT "NEBaldursGate_BlushingMermaid_L1_BCS" "AR0114" + OUTER_SPRINT "NEBaldursGate_BlushingMermaid_L2_BCS" "AR0115" + OUTER_SPRINT "NWBaldursGate_Helm&Cloak_L1_BCS" "AR0116" + OUTER_SPRINT "NWBaldursGate_Helm&Cloak_L2_BCS" "AR0117" + OUTER_SPRINT "NWBaldursGate_Helm&Cloak_L3_BCS" "AR0118" + OUTER_SPRINT "NBaldursGate_ThreeOldKegs_L1_BCS" "AR0119" + OUTER_SPRINT "NBaldursGate_ThreeOldKegs_L2_BCS" "AR0120" + OUTER_SPRINT "NBaldursGate_ThreeOldKegs_L3_BCS" "AR0121" + OUTER_SPRINT "Undercity_BCS" "AR0123" + OUTER_SPRINT "Undercity_TempleofBhaal_BCS" "AR0125" + OUTER_SPRINT "WBaldursGate_RagefastsHouse_BCS" "AR0126" + OUTER_SPRINT "SWBaldursGate_MerchantLeague_L1_BCS" "AR0127" + OUTER_SPRINT "SWBaldursGate_MerchantLeague_L2_BCS" "AR0128" + OUTER_SPRINT "SWBaldursGate_MerchantLeague_L3_BCS" "AR0129" + OUTER_SPRINT "WBaldursGate_HallofWonders_BCS" "AR0130" + OUTER_SPRINT "WBaldursGate_HighHouseofWonders_BCS" "AR0131" + OUTER_SPRINT "WBaldursGate_LadysHouse_BCS" "AR0132" + OUTER_SPRINT "BaldursGate_DocksLowLantern_D1_BCS" "AR0133" + OUTER_SPRINT "BaldursGate_DocksLowLantern_D2_BCS" "AR0134" + OUTER_SPRINT "BaldursGate_DocksLowLantern_D3_BCS" "AR0135" + OUTER_SPRINT "BaldursGate_DocksLowLantern_D4_BCS" "AR0136" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L1_BCS" "AR0137" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L6_BCS" "AR0138" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L2_BCS" "AR0139" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L3_BCS" "AR0140" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L4_BCS" "AR0141" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L5_BCS" "AR0142" + OUTER_SPRINT "CentralBaldursGate_OberonsEstate_L1_BCS" "AR0143" + OUTER_SPRINT "CentralBaldursGate_OberonsEstate_L2_BCS" "AR0144" + OUTER_SPRINT "CentralBaldursGate_OberonsEstate_L3_BCS" "AR0145" + OUTER_SPRINT "ThievesMaze_BCS" "AR0146" + OUTER_SPRINT "EBaldursGate_House5_BCS" "AR0148" + OUTER_SPRINT "NEBaldursGate_IlmatersShrine_BCS" "AR0149" + OUTER_SPRINT "EBaldursGate_House2_BCS" "AR0150" + OUTER_SPRINT "EBaldursGate_House3_BCS" "AR0151" + OUTER_SPRINT "EBaldursGate_House4_BCS" "AR0152" + OUTER_SPRINT "EBaldursGate_ThievesGuild_BCS" "AR0153" + OUTER_SPRINT "EBaldursGate_KeexieTavern_L1_BCS" "AR0154" + OUTER_SPRINT "NWBaldursGate_House3_L1_BCS" "AR0155" + OUTER_SPRINT "NWBaldursGate_House3_L2_BCS" "AR0156" + OUTER_SPRINT "NWBaldursGate_QuinnsHouse_L1_BCS" "AR0157" + OUTER_SPRINT "NWBaldursGate_QuinnsHouse_L2_BCS" "AR0158" + OUTER_SPRINT "NWBaldursGate_House1_L1_BCS" "AR0159" + OUTER_SPRINT "NWBaldursGate_House1_L2_BCS" "AR0160" + OUTER_SPRINT "NWBaldursGate_DegrodelsHouse_BCS" "AR0161" + OUTER_SPRINT "NWBaldursGate_LaertasHouse_L1_BCS" "AR0162" + OUTER_SPRINT "NWBaldursGate_House2_L1_BCS" "AR0163" + OUTER_SPRINT "NWBaldursGate_House2_L2_BCS" "AR0164" + OUTER_SPRINT "NWBaldursGate_Tavern_L1_BCS" "AR0165" + OUTER_SPRINT "NWBaldursGate_Tavern_L2_BCS" "AR0166" + OUTER_SPRINT "NWBaldursGate_PheirkasHouse_L1_BCS" "AR0167" + OUTER_SPRINT "NWBaldursGate_PheirkasHouse_L2_BCS" "AR0168" + OUTER_SPRINT "NWBaldursGate_House4_L1_BCS" "AR0169" + OUTER_SPRINT "NWBaldursGate_House4_L2_BCS" "AR0170" + OUTER_SPRINT "EBaldursGate_KeexieTavern_L2_BCS" "AR0171" + OUTER_SPRINT "NBaldursGate_BCS" "AR0200" + OUTER_SPRINT "WSewers_BCS" "AR0224" + OUTER_SPRINT "CentralSewers_BCS" "AR0225" + OUTER_SPRINT "ESewers_BCS" "AR0226" + OUTER_SPRINT "NEBaldursGate_BCS" "AR0300" + OUTER_SPRINT "NEBaldursGate_House2_L1_BCS" "AR0302" + OUTER_SPRINT "NEBaldursGate_House2_L2_BCS" "AR0303" + OUTER_SPRINT "NEBaldursGate_Store_BCS" "AR0304" + OUTER_SPRINT "NEBaldursGate_House1_L1_BCS" "AR0305" + OUTER_SPRINT "NEBaldursGate_House1_L2_BCS" "AR0306" + OUTER_SPRINT "NEBaldursGate_CountingHouse_L1_BCS" "AR0307" + OUTER_SPRINT "NEBaldursGate_CountingHouse_L2_BCS" "AR0308" + OUTER_SPRINT "WBaldursGate_BCS" "AR0600" + OUTER_SPRINT "SWBaldursGate_SevenSuns_L1_BCS" "AR0601" + OUTER_SPRINT "SWBaldursGate_SevenSuns_L2_BCS" "AR0602" + OUTER_SPRINT "SWBaldursGate_SevenSuns_Cellar_BCS" "AR0603" + OUTER_SPRINT "SWBaldursGate_FlamingFistHQ_Cellar_BCS" "AR0606" + OUTER_SPRINT "SWBaldursGate_FlamingFistHQ_L1_BCS" "AR0607" + OUTER_SPRINT "SWBaldursGate_FlamingFistHQ_L2_BCS" "AR0608" + OUTER_SPRINT "BaldursGateDocks_WaterQueensHouse_BCS" "AR0609" + OUTER_SPRINT "BaldursGateDocks_IronThrone_Cellar_BCS" "AR0611" + OUTER_SPRINT "BaldursGateDocks_IronThrone_L2_BCS" "AR0612" + OUTER_SPRINT "BaldursGateDocks_IronThrone_L3_BCS" "AR0613" + OUTER_SPRINT "BaldursGateDocks_IronThrone_L4_BCS" "AR0614" + OUTER_SPRINT "BaldursGateDocks_IronThrone_L5_BCS" "AR0615" + OUTER_SPRINT "BaldursGateDocks_IronThrone_L1_BCS" "AR0616" + OUTER_SPRINT "WBaldursGate_TremainsHouse_L1_BCS" "AR0617" + OUTER_SPRINT "WBaldursGate_TremainsHouse_L2_BCS" "AR0618" + OUTER_SPRINT "WBaldursGate_FentensHouse_L1_BCS" "AR0619" + OUTER_SPRINT "WBaldursGate_FentensHouse_L2_BCS" "AR0620" + OUTER_SPRINT "BaldursGateDocks_IronThroneRoof_BCS" "AR0621" + OUTER_SPRINT "CentralBaldursGate_BCS" "AR0700" + OUTER_SPRINT "BaldursGateDocks_Harbormaster_BCS" "AR0702" + OUTER_SPRINT "EBaldursGate_SorcerousSundries_L1_BCS" "AR0703" + OUTER_SPRINT "EBaldursGate_SorcerousSundries_L2_BCS" "AR0704" + OUTER_SPRINT "EBaldursGate_ElfsongTavern_L1_BCS" "AR0705" + OUTER_SPRINT "EBaldursGate_ElfsongTavern_L2_BCS" "AR0706" + OUTER_SPRINT "CentralBaldursGate_House3_L1_BCS" "AR0707" + OUTER_SPRINT "CentralBaldursGate_House3_L2_BCS" "AR0708" + OUTER_SPRINT "CentralBaldursGate_House2_L1_BCS" "AR0709" + OUTER_SPRINT "CentralBaldursGate_House2_L2_BCS" "AR0710" + OUTER_SPRINT "CentralBaldursGate_House1_L1_BCS" "AR0711" + OUTER_SPRINT "CentralBaldursGate_House1_L2_BCS" "AR0712" + OUTER_SPRINT "CentralBaldursGate_House5_L1_BCS" "AR0713" + OUTER_SPRINT "CentralBaldursGate_House5_L2_BCS" "AR0714" + OUTER_SPRINT "CentralBaldursGate_NadinesHouse_L1_BCS" "AR0715" + OUTER_SPRINT "CentralBaldursGate_NadinesHouse_L2_BCS" "AR0716" + OUTER_SPRINT "CentralBaldursGate_House6_L1_BCS" "AR0717" + OUTER_SPRINT "CentralBaldursGate_House6_L2_BCS" "AR0718" + OUTER_SPRINT "CentralBaldursGate_FeloniusManor_BCS" "AR0719" + OUTER_SPRINT "CentralBaldursGate_DrakonTavern_BCS" "AR0720" + OUTER_SPRINT "CentralBaldursGate_PoultryStore_BCS" "AR0721" + OUTER_SPRINT "CentralBaldursGate_House4_L1_BCS" "AR0722" + OUTER_SPRINT "CentralBaldursGate_House4_L2_BCS" "AR0723" + OUTER_SPRINT "CentralBaldursGate_GamblingTent1_BCS" "AR0724" + OUTER_SPRINT "CentralBaldursGate_GamblingTent2_BCS" "AR0725" + OUTER_SPRINT "CentralBaldursGate_DivinersTent_BCS" "AR0726" + OUTER_SPRINT "EBaldursGate_BCS" "AR0800" + OUTER_SPRINT "EBaldursGate_House6_L1_BCS" "AR0801" + OUTER_SPRINT "EBaldursGate_House6_L2_BCS" "AR0802" + OUTER_SPRINT "EBaldursGate_MaltzWeaponShop_L1_BCS" "AR0803" + OUTER_SPRINT "EBaldursGate_MaltzWeaponShop_L2_BCS" "AR0804" + OUTER_SPRINT "EBaldursGate_ArkionsHouse_L1_BCS" "AR0805" + OUTER_SPRINT "EBaldursGate_ArkionsHouse_L2_BCS" "AR0806" + OUTER_SPRINT "EBaldursGate_Inn_L1_BCS" "AR0807" + OUTER_SPRINT "EBaldursGate_Inn_L2_BCS" "AR0808" + OUTER_SPRINT "EBaldursGate_SilencesShop_BCS" "AR0809" + OUTER_SPRINT "EBaldursGate_LuckyAellos_BCS" "AR0810" + OUTER_SPRINT "EBaldursGate_House1_L1_BCS" "AR0811" + OUTER_SPRINT "EBaldursGate_House1_L2_BCS" "AR0812" + OUTER_SPRINT "SEBaldursGate_NemphresHouse_L1_BCS" "AR0813" + OUTER_SPRINT "SEBaldursGate_NemphresHouse_L2_BCS" "AR0814" + OUTER_SPRINT "WyrmsCrossing_BCS" "AR0900" + OUTER_SPRINT "WyrmsCrossingTenyasHouse_BCS" "AR0901" + OUTER_SPRINT "SWBaldursGate_BCS" "AR1100" + OUTER_SPRINT "SWBaldursGate_WivensHouse_L1_BCS" "AR1101" + OUTER_SPRINT "SWBaldursGate_WivensHouse_L2_BCS" "AR1102" + OUTER_SPRINT "SWBaldursGate_House3_L1_BCS" "AR1103" + OUTER_SPRINT "SWBaldursGate_House3_L2_BCS" "AR1104" + OUTER_SPRINT "SWBaldursGate_House1_L1_BCS" "AR1105" + OUTER_SPRINT "SWBaldursGate_House1_L2_BCS" "AR1106" + OUTER_SPRINT "SWBaldursGate_House2_L1_BCS" "AR1107" + OUTER_SPRINT "SWBaldursGate_House2_L2_BCS" "AR1108" + OUTER_SPRINT "SWBaldursGate_Tavern_L1_BCS" "AR1109" + OUTER_SPRINT "SWBaldursGate_Tavern_L2_BCS" "AR1110" + OUTER_SPRINT "SWBaldursGate_SuninsHouse_BCS" "AR1111" + OUTER_SPRINT "SWBaldursGate_WeaponsStore1_BCS" "AR1112" + OUTER_SPRINT "SWBaldursGate_YeOldeInn_L1_BCS" "AR1113" + OUTER_SPRINT "SWBaldursGate_YeOldeInn_L2_BCS" "AR1114" + OUTER_SPRINT "SWBaldursGate_PotionsStore2_BCS" "AR1115" + OUTER_SPRINT "SWBaldursGate_WeaponsStore2_BCS" "AR1116" + OUTER_SPRINT "SWBaldursGate_PotionsStore1_BCS" "AR1117" + OUTER_SPRINT "BaldursGateDocks_BCS" "AR1200" + OUTER_SPRINT "BaldursGateDocks_OgreMagiHouse_L1_BCS" "AR1201" + OUTER_SPRINT "BaldursGateDocks_OgreMagiHouse_L2_BCS" "AR1202" + OUTER_SPRINT "BaldursGateDocks_House2_L1_BCS" "AR1203" + OUTER_SPRINT "BaldursGateDocks_House2_L2_BCS" "AR1204" + OUTER_SPRINT "BaldursGateDocks_House1_L1_BCS" "AR1205" + OUTER_SPRINT "BaldursGateDocks_House1_L2_BCS" "AR1206" + OUTER_SPRINT "BaldursGateDocks_BasiliskWarehouse_BCS" "AR1207" + OUTER_SPRINT "BaldursGateDocks_NoraleesWarehouse_BCS" "AR1208" + OUTER_SPRINT "BaldursGateDocks_LarriazHouse_L1_BCS" "AR1209" + OUTER_SPRINT "BaldursGateDocks_LarriazHouse_L2_BCS" "AR1210" + OUTER_SPRINT "BaldursGateDocks_GhoraksHouse_L1_BCS" "AR1211" + OUTER_SPRINT "BaldursGateDocks_GhoraksHouse_L2_BCS" "AR1212" + OUTER_SPRINT "BaldursGateDocks_CordyrsHouse_L1_BCS" "AR1213" + OUTER_SPRINT "BaldursGateDocks_CordyrsHouse_L2_BCS" "AR1214" + OUTER_SPRINT "BaldursGateDocks_JopalinsTavern_BCS" "AR1215" + OUTER_SPRINT "SEBaldursGate_BCS" "AR1300" + OUTER_SPRINT "SEBaldursGate_Warehouse_BCS" "AR1301" + OUTER_SPRINT "SEBaldursGate_GeneralStore2_BCS" "AR1302" + OUTER_SPRINT "SEBaldursGate_NadarinsWarehouse_BCS" "AR1303" + OUTER_SPRINT "SEBaldursGate_House3_L1_BCS" "AR1304" + OUTER_SPRINT "SEBaldursGate_House3_L2_BCS" "AR1305" + OUTER_SPRINT "SEBaldursGate_Inn_L1_BCS" "AR1306" + OUTER_SPRINT "SEBaldursGate_Inn_L2_BCS" "AR1307" + OUTER_SPRINT "SEBaldursGate_House4_L1_BCS" "AR1308" + OUTER_SPRINT "SEBaldursGate_House4_L2_BCS" "AR1309" + OUTER_SPRINT "SEBaldursGate_House2_L1_BCS" "AR1310" + OUTER_SPRINT "SEBaldursGate_House2_L2_BCS" "AR1311" + OUTER_SPRINT "SEBaldursGate_GantolandansHouse_L1_BCS" "AR1312" + OUTER_SPRINT "SEBaldursGate_GantolandansHouse_L2_BCS" "AR1313" + OUTER_SPRINT "SEBaldursGate_House1_L1_BCS" "AR1314" + OUTER_SPRINT "SEBaldursGate_House1_L2_BCS" "AR1315" + OUTER_SPRINT "SEBaldursGate_TaxeksHouse_L1_BCS" "AR1316" + OUTER_SPRINT "SEBaldursGate_TaxeksHouse_L2_BCS" "AR1317" + OUTER_SPRINT "SEBaldursGate_GeneralStore1_BCS" "AR1320" + OUTER_SPRINT "FishingVillage_BCS" "AR1400" + OUTER_SPRINT "FishingVillage_AnkhegPit_BCS" "AR1401" + OUTER_SPRINT "FishingVillage_House1_BCS" "AR1402" + OUTER_SPRINT "FishingVillage_House2_BCS" "AR1403" + OUTER_SPRINT "FishingVillage_FarmerBrunsHouse_BCS" "AR1404" + OUTER_SPRINT "CloakwoodDruids_BCS" "AR1600" + OUTER_SPRINT "CloakwoodDruids_Treehouse_L1_BCS" "AR1601" + OUTER_SPRINT "CloakwoodDruids_Treehouse_L2_BCS" "AR1602" + OUTER_SPRINT "CloakwoodDruids_PetersCave_BCS" "AR1603" + OUTER_SPRINT "CloakwoodWyverns_BCS" "AR1700" + OUTER_SPRINT "CloakwoodMines_BCS" "AR1800" + OUTER_SPRINT "CloakwoodMines_L1_BCS" "AR1801" + OUTER_SPRINT "CloakwoodMines_L3_BCS" "AR1802" + OUTER_SPRINT "CloakwoodMines_L4_BCS" "AR1803" + OUTER_SPRINT "CloakwoodMines_L2_BCS" "AR1804" + OUTER_SPRINT "CloakwoodMines_Barracks_L1_BCS" "AR1805" + OUTER_SPRINT "CloakwoodMines_Barracks_L2_BCS" "AR1806" + OUTER_SPRINT "CloakwoodMines_MineLift_BCS" "AR1807" + OUTER_SPRINT "CloakwoodMines_Storehouse_BCS" "AR1808" + OUTER_SPRINT "CloakwoodMines_MineShed_BCS" "AR1809" + OUTER_SPRINT "BanditCamp_BCS" "AR1900" + OUTER_SPRINT "BanditCamp_RaemonsTent_BCS" "AR1901" + OUTER_SPRINT "BanditCamp_Tent2_BCS" "AR1902" + OUTER_SPRINT "BanditCamp_GnollCave_BCS" "AR1903" + OUTER_SPRINT "BanditCamp_TersusTent_BCS" "AR1904" + OUTER_SPRINT "BanditCamp_Tent1_BCS" "AR1905" + OUTER_SPRINT "BanditCamp_Tent3_BCS" "AR1906" + OUTER_SPRINT "BanditCamp_Tent4_BCS" "AR1907" + OUTER_SPRINT "CloakwoodNest_BCS" "AR2100" + OUTER_SPRINT "CloakwoodNestSpiderNest_BCS" "AR2101" + OUTER_SPRINT "CloakwoodLodge_BCS" "AR2200" + OUTER_SPRINT "CloakwoodLodgeHuntingLodge_BCS" "AR2215" + OUTER_SPRINT "FriendlyArmInn_BCS" "AR2300" + OUTER_SPRINT "FriendlyArmInn_L1_BCS" "AR2301" + OUTER_SPRINT "FriendlyArmInn_L2_BCS" "AR2302" + OUTER_SPRINT "FriendlyArmInn_L3_BCS" "AR2303" + OUTER_SPRINT "FriendlyArmInn_TempleofWisdom_BCS" "AR2304" + OUTER_SPRINT "FriendlyArmInn_House_BCS" "AR2305" + OUTER_SPRINT "FriendlyArmInn_JoiasHouse_BCS" "AR2306" + OUTER_SPRINT "Peldvale_BCS" "AR2400" + OUTER_SPRINT "Candlekeep_BCS" "AR2600" + OUTER_SPRINT "Candlekeep_PriestsQuarters_BCS" "AR2602" + OUTER_SPRINT "Candlekeep_Infirmary_BCS" "AR2605" + OUTER_SPRINT "Candlekeep_Storehouse_BCS" "AR2606" + OUTER_SPRINT "Candlekeep_Bunkhouse_BCS" "AR2607" + OUTER_SPRINT "Candlekeep_Library_L1_BCS" "AR2608" + OUTER_SPRINT "Candlekeep_Library_L2_BCS" "AR2609" + OUTER_SPRINT "Candlekeep_Library_L3_BCS" "AR2610" + OUTER_SPRINT "Candlekeep_Library_L4_BCS" "AR2611" + OUTER_SPRINT "Candlekeep_Library_L5_BCS" "AR2612" + OUTER_SPRINT "Candlekeep_Catacombs_L1Antechamber_BCS" "AR2613" + OUTER_SPRINT "Candlekeep_Library_L6_BCS" "AR2614" + OUTER_SPRINT "Candlekeep_Catacombs_L1_BCS" "AR2615" + OUTER_SPRINT "Candlekeep_Inn_L1_BCS" "AR2616" + OUTER_SPRINT "Candlekeep_Inn_L2_BCS" "AR2617" + OUTER_SPRINT "Candlekeep_Barracks_BCS" "AR2618" + OUTER_SPRINT "Candlekeep_Catacombs_L2_BCS" "AR2619" + OUTER_SPRINT "Candlekeep_Ch6_BCS" "AR2626" + OUTER_SPRINT "Candlekeep_Ch6_PriestsQuarters_BCS" "AR2627" + OUTER_SPRINT "Candlekeep_Ch6_Storehouse_BCS" "AR2628" + OUTER_SPRINT "Candlekeep_Ch6_Inn_L1_BCS" "AR2629" + OUTER_SPRINT "Candlekeep_Ch6_Inn_L2_BCS" "AR2630" + OUTER_SPRINT "Candlekeep_Ch6_Barracks_BCS" "AR2631" + OUTER_SPRINT "Candlekeep_Ch6_Bunkhouse_BCS" "AR2632" + OUTER_SPRINT "Candlekeep_Ch6_Infirmary_BCS" "AR2633" + OUTER_SPRINT "Candlekeep_ObesCellar_BCS" "AR2643" + OUTER_SPRINT "LionsWay_BCS" "AR2700" + OUTER_SPRINT "CoastWay_BCS" "AR2800" + OUTER_SPRINT "Larswood_BCS" "AR2900" + OUTER_SPRINT "SpiderWood_BCS" "AR3000" + OUTER_SPRINT "ShipwrecksCoast_BCS" "AR3100" + OUTER_SPRINT "HighHedge_BCS" "AR3200" + OUTER_SPRINT "HighHedge_House_BCS" "AR3201" + OUTER_SPRINT "HighHedge_ThalanthyrsAbode_BCS" "AR3202" + OUTER_SPRINT "Beregost_BCS" "AR3300" + OUTER_SPRINT "Beregost_ThunderhammerSmithy_BCS" "AR3301" + OUTER_SPRINT "Beregost_House19_BCS" "AR3302" + OUTER_SPRINT "Beregost_RedSheaf_L2_BCS" "AR3303" + OUTER_SPRINT "Beregost_JovialJuggler_L1_BCS" "AR3304" + OUTER_SPRINT "Beregost_JovialJuggler_L2F_BCS" "AR3305" + OUTER_SPRINT "Beregost_JovialJuggler_L2R_BCS" "AR3306" + OUTER_SPRINT "Beregost_BurningWizard_L1_BCS" "AR3307" + OUTER_SPRINT "Beregost_BurningWizard_L2_BCS" "AR3308" + OUTER_SPRINT "Beregost_House13_L1_BCS" "AR3309" + OUTER_SPRINT "Beregost_House13_L2_BCS" "AR3310" + OUTER_SPRINT "Beregost_House12_L1_BCS" "AR3311" + OUTER_SPRINT "Beregost_House12_L2_BCS" "AR3312" + OUTER_SPRINT "Beregost_MiriannesHouse_L1_BCS" "AR3313" + OUTER_SPRINT "Beregost_MiriannesHouse_L2_BCS" "AR3314" + OUTER_SPRINT "Beregost_LandrinsHouse_BCS" "AR3315" + OUTER_SPRINT "Beregost_House18_BCS" "AR3316" + OUTER_SPRINT "Beregost_House17_BCS" "AR3317" + OUTER_SPRINT "Beregost_House15_BCS" "AR3318" + OUTER_SPRINT "Beregost_House16_BCS" "AR3319" + OUTER_SPRINT "Beregost_TravenhurstManor_L1_BCS" "AR3320" + OUTER_SPRINT "Beregost_TravenhurstManor_L2_BCS" "AR3321" + OUTER_SPRINT "Beregost_ServantsQuarters_BCS" "AR3322" + OUTER_SPRINT "Beregost_House20_L1_BCS" "AR3323" + OUTER_SPRINT "Beregost_House20_L2_BCS" "AR3324" + OUTER_SPRINT "Beregost_House23_L1_BCS" "AR3325" + OUTER_SPRINT "Beregost_House23_L2_BCS" "AR3326" + OUTER_SPRINT "Beregost_House14_L1_BCS" "AR3327" + OUTER_SPRINT "Beregost_House14_L2_BCS" "AR3328" + OUTER_SPRINT "Beregost_House21_L1_BCS" "AR3329" + OUTER_SPRINT "Beregost_House21_L2_BCS" "AR3330" + OUTER_SPRINT "Beregost_House11_L1_BCS" "AR3331" + OUTER_SPRINT "Beregost_House11_L2_BCS" "AR3332" + OUTER_SPRINT "Beregost_FirebeadsHouse_L1_BCS" "AR3333" + OUTER_SPRINT "Beregost_FirebeadsHouse_L2_BCS" "AR3334" + OUTER_SPRINT "Beregost_House10_L1_BCS" "AR3335" + OUTER_SPRINT "Beregost_House10_L2_BCS" "AR3336" + OUTER_SPRINT "Beregost_House22_L1_BCS" "AR3337" + OUTER_SPRINT "Beregost_House22_L2_BCS" "AR3338" + OUTER_SPRINT "Beregost_House01_L1_BCS" "AR3339" + OUTER_SPRINT "Beregost_House01_L2_BCS" "AR3340" + OUTER_SPRINT "Beregost_House02_L1_BCS" "AR3341" + OUTER_SPRINT "Beregost_House02_L2_BCS" "AR3342" + OUTER_SPRINT "Beregost_House03_BCS" "AR3343" + OUTER_SPRINT "Beregost_House07_BCS" "AR3344" + OUTER_SPRINT "Beregost_House04_L1_BCS" "AR3345" + OUTER_SPRINT "Beregost_House04_L2_BCS" "AR3346" + OUTER_SPRINT "Beregost_House05_L1_BCS" "AR3347" + OUTER_SPRINT "Beregost_House05_L2_BCS" "AR3348" + OUTER_SPRINT "Beregost_House06_L1_BCS" "AR3349" + OUTER_SPRINT "Beregost_House06_L2_BCS" "AR3350" + OUTER_SPRINT "Beregost_FeldepostsInn_L1_BCS" "AR3351" + OUTER_SPRINT "Beregost_FeldepostsInn_L2_BCS" "AR3352" + OUTER_SPRINT "Beregost_KagainsStore_BCS" "AR3353" + OUTER_SPRINT "Beregost_House09_BCS" "AR3354" + OUTER_SPRINT "Beregost_House08_BCS" "AR3355" + OUTER_SPRINT "Beregost_House08_L2_BCS" "AR3356" + OUTER_SPRINT "Beregost_RedSheaf_L1_BCS" "AR3357" + OUTER_SPRINT "Temple_BCS" "AR3400" + OUTER_SPRINT "Temple_Vestibule_BCS" "AR3401" + OUTER_SPRINT "Temple_SongoftheMorning_BCS" "AR3402" + OUTER_SPRINT "MutaminsGarden_BCS" "AR3500" + OUTER_SPRINT "Lighthouse_BCS" "AR3600" + OUTER_SPRINT "Lighthouse_BlackAlaricsCave_BCS" "AR3601" + OUTER_SPRINT "RedCanyons_BCS" "AR3700" + OUTER_SPRINT "SouthBeregostRoad_BCS" "AR3800" + OUTER_SPRINT "SouthBeregostRoad_Cave_BCS" "AR3802" + OUTER_SPRINT "Ulcaster_BCS" "AR3900" + OUTER_SPRINT "UlcasterRuins_BCS" "AR3901" + OUTER_SPRINT "Gullykin_BCS" "AR4000" + OUTER_SPRINT "Gullykin_JenkalsHouse_L1_BCS" "AR4001" + OUTER_SPRINT "Gullykin_JenkalsHouse_Cellar_BCS" "AR4002" + OUTER_SPRINT "Gullykin_Winery_L1_BCS" "AR4003" + OUTER_SPRINT "Gullykin_Winery_Cellar_BCS" "AR4004" + OUTER_SPRINT "Gullykin_House1_L1_BCS" "AR4005" + OUTER_SPRINT "Gullykin_House1_Cellar_BCS" "AR4006" + OUTER_SPRINT "Gullykin_House3_L1_BCS" "AR4007" + OUTER_SPRINT "Gullykin_House3_Cellar_BCS" "AR4008" + OUTER_SPRINT "Gullykin_House4_L1_BCS" "AR4009" + OUTER_SPRINT "Gullykin_House4_Cellar_BCS" "AR4010" + OUTER_SPRINT "Gullykin_House5_L1_BCS" "AR4011" + OUTER_SPRINT "Gullykin_House5_Cellar_BCS" "AR4012" + OUTER_SPRINT "Gullykin_House2_L1_BCS" "AR4013" + OUTER_SPRINT "Gullykin_House2_Cellar_BCS" "AR4014" + OUTER_SPRINT "ArchaeologicalSite_BCS" "AR4100" + OUTER_SPRINT "ArchaeologicalSite_Tomb_BCS" "AR4101" + OUTER_SPRINT "FishermansLake_BCS" "AR4200" + OUTER_SPRINT "NorthNashkelRoad_BCS" "AR4300" + OUTER_SPRINT "LonelyPeaks_BCS" "AR4400" + OUTER_SPRINT "LonelyPeaks_Cave_BCS" "AR4401" + OUTER_SPRINT "FirewineBridge_BCS" "AR4500" + OUTER_SPRINT "CloakwoodWyverns_WyvernCave_BCS" "AR4501" + OUTER_SPRINT "BearRiver_BCS" "AR4600" + OUTER_SPRINT "XvartVillage_BCS" "AR4700" + OUTER_SPRINT "XvartVillage_Cave_BCS" "AR4701" + OUTER_SPRINT "Nashkel_BCS" "AR4800" + OUTER_SPRINT "Nashkel_Inn_BCS" "AR4801" + OUTER_SPRINT "Nashkel_TempleofHelm_BCS" "AR4802" + OUTER_SPRINT "Nashkel_Store_BCS" "AR4803" + OUTER_SPRINT "Nashkel_ManorHouse_L1_BCS" "AR4804" + OUTER_SPRINT "Nashkel_ManorHouse_L2_BCS" "AR4805" + OUTER_SPRINT "Nashkel_JosephsHouse_BCS" "AR4806" + OUTER_SPRINT "Nashkel_House1_BCS" "AR4807" + OUTER_SPRINT "Nashkel_House2_BCS" "AR4808" + OUTER_SPRINT "Nashkel_BelchingDragonTavern_BCS" "AR4809" + OUTER_SPRINT "Nashkel_Garrison_BCS" "AR4810" + OUTER_SPRINT "NashkelCarnival_BCS" "AR4900" + OUTER_SPRINT "NashkelCarnival_ArmorTent_BCS" "AR4901" + OUTER_SPRINT "NashkelCarnival_LotusTent_BCS" "AR4902" + OUTER_SPRINT "NashkelCarnival_VitiaresTent_BCS" "AR4903" + OUTER_SPRINT "NashkelCarnival_GamblingTent_BCS" "AR4904" + OUTER_SPRINT "NashkelCarnival_PotionTent_BCS" "AR4905" + OUTER_SPRINT "NashkelCarnival_ZordralsTent_BCS" "AR4906" + OUTER_SPRINT "NashkelCarnival_MagicItemsTent_BCS" "AR4907" + OUTER_SPRINT "NashkelCarnival_MeleeWeaponsTent_BCS" "AR4908" + OUTER_SPRINT "NashkelCarnival_RangedWeaponsTent_BCS" "AR4909" + OUTER_SPRINT "ValleyoftheTombs_BCS" "AR5000" + OUTER_SPRINT "ValleyoftheTombs_Tomb_BCS" "AR5001" + OUTER_SPRINT "GnollStronghold_BCS" "AR5100" + OUTER_SPRINT "GnollStronghold_XvartCave_BCS" "AR5101" + OUTER_SPRINT "GnollStronghold_TomeCave_BCS" "AR5102" + OUTER_SPRINT "GnollStronghold_CrawlerCave_BCS" "AR5103" + OUTER_SPRINT "DryadFalls_BCS" "AR5200" + OUTER_SPRINT "FirewineRuins_BCS" "AR5201" + OUTER_SPRINT "DryadFalls_Cave_BCS" "AR5202" + OUTER_SPRINT "FireLeafForest_BCS" "AR5300" + OUTER_SPRINT "NashkelMines_BCS" "AR5400" + OUTER_SPRINT "NashkelMines_L1_BCS" "AR5401" + OUTER_SPRINT "NashkelMines_L2_BCS" "AR5402" + OUTER_SPRINT "NashkelMines_L3_BCS" "AR5403" + OUTER_SPRINT "NashkelMines_L4_BCS" "AR5404" + OUTER_SPRINT "NashkelMines_MulaheysCave_BCS" "AR5405" + OUTER_SPRINT "NashkelMines_Cabin_BCS" "AR5406" + OUTER_SPRINT "GibberlingMountains_BCS" "AR5500" + OUTER_SPRINT "CandlekeepCaves_BCS" "AR5506" + OUTER_SPRINT "Encounter_Plains1_BCS" "AR5600" + OUTER_SPRINT "Encounter_Plains2_BCS" "AR5601" + OUTER_SPRINT "Encounter_Canyon1_BCS" "AR5700" + OUTER_SPRINT "Encounter_Canyon2_BCS" "AR5701" + OUTER_SPRINT "Encounter_Cliff1_BCS" "AR5800" + OUTER_SPRINT "Encounter_Cliff2_BCS" "AR5801" + OUTER_SPRINT "Encounter_Grassland1_BCS" "AR5900" + OUTER_SPRINT "Encounter_Grassland2_BCS" "AR5901" + OUTER_SPRINT "Encounter_Forest1_BCS" "AR6000" + OUTER_SPRINT "Encounter_Forest2_BCS" "AR6001" + OUTER_SPRINT "Encounter_Road_BCS" "AR6100" + + /* TOTSC Areas scripts */ + OUTER_SPRINT "Farmlands_BCS" "AR0400" + OUTER_SPRINT "FarmlandsFarmhouse_BCS" "AR0401" + OUTER_SPRINT "DurlagsTower_BCS" "AR0500" + OUTER_SPRINT "DurlagsTower_Cellar_BCS" "AR0501" + OUTER_SPRINT "DurlagsTower_L1_BCS" "AR0502" + OUTER_SPRINT "DurlagsTower_L2_BCS" "AR0503" + OUTER_SPRINT "DurlagsTower_L3_BCS" "AR0504" + OUTER_SPRINT "DurlagsTower_L4_BCS" "AR0505" + OUTER_SPRINT "DurlagsTower_Chessboard_BCS" "AR0506" + OUTER_SPRINT "DurlagsTower_IceChamber_BCS" "AR0507" + OUTER_SPRINT "DurlagsTower_FireChamber_BCS" "AR0508" + OUTER_SPRINT "DurlagsTower_AirChamber_BCS" "AR0509" + OUTER_SPRINT "DurlagsTower_EarthChamber_BCS" "AR0510" + OUTER_SPRINT "DurlagsTower_D1_BCS" "AR0511" + OUTER_SPRINT "DurlagsTower_D2_BCS" "AR0512" + OUTER_SPRINT "DurlagsTower_D3_BCS" "AR0513" + OUTER_SPRINT "DurlagsTower_D4_BCS" "AR0514" + OUTER_SPRINT "DurlagsTower_CompassRoom_BCS" "AR0515" + OUTER_SPRINT "DurlagsTower_DemonknightsChamber_BCS" "AR0516" + OUTER_SPRINT "IsleofBalduranN_BCS" "AR1500" + OUTER_SPRINT "IsleofBalduranNShip_D1_BCS" "AR1501" + OUTER_SPRINT "IsleofBalduranNShip_D2_BCS" "AR1502" + OUTER_SPRINT "IsleofBalduranNShip_D3_BCS" "AR1503" + OUTER_SPRINT "IsleofBalduranNShip_D4_BCS" "AR1504" + OUTER_SPRINT "IsleofBalduranNDradeelsHouse_BCS" "AR1505" + OUTER_SPRINT "IsleofBalduranS_BCS" "AR2000" + OUTER_SPRINT "IsleofBalduranS_GreatHut_BCS" "AR2001" + OUTER_SPRINT "IsleofBalduranS_KaishasHut_BCS" "AR2002" + OUTER_SPRINT "IsleofBalduranS_LargeHut3_BCS" "AR2003" + OUTER_SPRINT "IsleofBalduranS_LargeHut2_BCS" "AR2004" + OUTER_SPRINT "IsleofBalduranS_LargeHut4_BCS" "AR2005" + OUTER_SPRINT "IsleofBalduranS_LargeHut1_BCS" "AR2006" + OUTER_SPRINT "IsleofBalduranS_HarborHut_BCS" "AR2007" + OUTER_SPRINT "IsleofBalduranS_StoreHut2_BCS" "AR2008" + OUTER_SPRINT "IsleofBalduranS_StoreHut1_BCS" "AR2009" + OUTER_SPRINT "IsleofBalduranS_StoreHut4_BCS" "AR2010" + OUTER_SPRINT "IsleofBalduranS_StoreHut3_BCS" "AR2011" + OUTER_SPRINT "WerewolfCaverns_BCS" "AR2012" + OUTER_SPRINT "UlgothsBeard_BCS" "AR1000" + OUTER_SPRINT "UlgothsBeard_Inn_BCS" "AR1001" + OUTER_SPRINT "UlgothsBeard_DemonsChamber_BCS" "AR1002" + OUTER_SPRINT "UlgothsBeard_Storehouse_BCS" "AR1003" + OUTER_SPRINT "UlgothsBeard_MendasHouse_BCS" "AR1004" + OUTER_SPRINT "UlgothsBeard_TherellasHouse_BCS" "AR1005" + OUTER_SPRINT "UlgothsBeard_House2_BCS" "AR1006" + OUTER_SPRINT "UlgothsBeard_House1_BCS" "AR1007" + OUTER_SPRINT "IceIsland_BCS" "AR1008" + OUTER_SPRINT "IceIslandMaze_L1_BCS" "AR1009" + OUTER_SPRINT "IceIslandMaze_L2_BCS" "AR1010" +END diff --git a/iwdification/obg2_res/g3_bgt_cpmvars.tpa b/iwdification/obg2_res/g3_bgt_cpmvars.tpa new file mode 100644 index 0000000..2ff2aef --- /dev/null +++ b/iwdification/obg2_res/g3_bgt_cpmvars.tpa @@ -0,0 +1,1243 @@ +/* Declaration of BGT Platform Variables */ +ACTION_IF GAME_IS ~bgt~ THEN BEGIN + /* tp2, d, and baf parsing variables */ + OUTER_SPRINT "tutorbgt" "bgt" + OUTER_SPRINT "tutubgtbgee" "bgt" + OUTER_SPRINT "bgdreams" "BG1Dream" + OUTER_SPRINT "bgdream1" "1" + OUTER_SPRINT "bgdream2" "2" + OUTER_SPRINT "bgdream3" "3" + OUTER_SPRINT "bgdream4" "4" + OUTER_SPRINT "bgdream5" "5" + OUTER_SPRINT "bgdream6" "6" + OUTER_SPRINT "tutu_var" "" + OUTER_SPRINT "tutu_scriptbg" "bg"//BGT 'BG' prefix + OUTER_SPRINT "tutu_scripta" "a" + OUTER_SPRINT "tutu_scriptb" "b" + OUTER_SPRINT "tutu_scriptc" "c" + OUTER_SPRINT "tutu_scriptd" "d" + OUTER_SPRINT "tutu_scripte" "e" + OUTER_SPRINT "tutu_scriptf" "f" + OUTER_SPRINT "tutu_scriptg" "g" + OUTER_SPRINT "tutu_scripth" "h" + OUTER_SPRINT "tutu_scripti" "i" + OUTER_SPRINT "tutu_scriptj" "j" + OUTER_SPRINT "tutu_scriptk" "k" + OUTER_SPRINT "tutu_scriptl" "l" + OUTER_SPRINT "tutu_scriptm" "m" + OUTER_SPRINT "tutu_scriptn" "n" + OUTER_SPRINT "tutu_scripto" "o" + OUTER_SPRINT "tutu_scriptp" "p" + OUTER_SPRINT "tutu_scriptq" "q" + OUTER_SPRINT "tutu_scriptr" "r" + OUTER_SPRINT "tutu_scripts" "s" + OUTER_SPRINT "tutu_scriptt" "t" + OUTER_SPRINT "tutu_scriptu" "u" + OUTER_SPRINT "tutu_scriptv" "v" + OUTER_SPRINT "tutu_scriptw" "w" + OUTER_SPRINT "tutu_scriptx" "x" + OUTER_SPRINT "tutu_scripty" "y" + OUTER_SPRINT "tutu_scriptz" "z" + OUTER_SPRINT "percentage_sign" "%"//%" + + OUTER_SPRINT "tutu_imoen6" "imoen61" + OUTER_SPRINT "tutu_viconi6" "viconi61" + OUTER_SPRINT "tutu_skeleton_warrior" "bgskel" + + /* EET naming convention */ + OUTER_SPRINT "eet_var" "" + + /* EET Worldmap*/ + OUTER_SET wmp_xCoord_SoA = 0 + OUTER_SET wmp_yCoord_SoA = 0 + OUTER_SET wmp_xCoord_ToB = 0 + OUTER_SET wmp_yCoord_ToB = 0 + OUTER_SET wmp_mapIcon_BG1 = 0 + OUTER_SET wmp_mapIcon_ToB = 0 + OUTER_SPRINT wmp_worldmap_ToB "worldm25" + + /* EET continuous journal/chapters system */ + OUTER_SET bg2_chapter_1 = 1 + OUTER_SET bg2_chapter_2 = 2 + OUTER_SET bg2_chapter_3 = 3 + OUTER_SET bg2_chapter_4 = 4 + OUTER_SET bg2_chapter_5 = 5 + OUTER_SET bg2_chapter_6 = 6 + OUTER_SET bg2_chapter_7 = 7 + OUTER_SET bg2_chapter_8 = 8 + OUTER_SET bg2_chapter_9 = 9 + OUTER_SET bg2_chapter_10 = 10 + + /* BGT/EET shutdown of D and BAF after BG1 content */ + OUTER_SPRINT ~BGT_VAR~ ~!Global("endofbg1","GLOBAL",2)~ + + /* DVs are the same for Tutu/BGT, except for Imoen */ + OUTER_SPRINT "IMOEN_DV" "imoen2" + + /* Items and Variables that need special handling */ + OUTER_SPRINT "KICKED_OUT" "IWasKickedOut" + OUTER_SPRINT "tazokminhp" "MINHP1" + + /* Tutu/BGT vs BGEE/EET Dialog states */ + OUTER_SET firebeadstate1 = 1 + OUTER_SET firebeadstate2 = 2 + OUTER_SET hentolstate1 = 1 + OUTER_SET housg3state0 = 0 + OUTER_SET housg3state5 = 5 + OUTER_SET xanpstate3 = 3 + OUTER_SET xanpstate4 = 4 + + ACTION_IF FILE_EXISTS ~BGT/Compat/BG1NPC/FluidStates.tpa~ THEN BEGIN + INCLUDE ~BGT/Compat/BG1NPC/FluidStates.tpa~ // BGT1.06 and higher + END ELSE BEGIN // BGT1.05 and lower + //BGT Dialogues always appended + OUTER_SET BGTBEDWINState0 = 106 + OUTER_SET BGTBJAHEIState0 = 461 + OUTER_SET BGTBMINSCState0 = 99 + OUTER_SET BGTBVICONState0 = 575 + OUTER_SET BGTEDWINState0 = 74 + OUTER_SET BGTEDWINJState0 = 188 + OUTER_SET BGTEDWINPState0 = 9 + OUTER_SET BGTIMOENJState0 = 111 + OUTER_SET BGTIMOEN2State0 = 26 + OUTER_SET BGTIMOENPState0 = 16 + OUTER_SET BGTJAHEIJState0 = 531 + OUTER_SET BGTJAHEIPState0 = 74 + OUTER_SET BGTMINSCJState0 = 241 + OUTER_SET BGTMINSCPState0 = 10 + OUTER_SET BGTVICONJState0 = 183 + OUTER_SET BGTVICONPState0 = 14 + + //Never Ending Journey 2 compatibility appending + OUTER_SET BGTXANState0 = 0 + + //The Darkest Day compatibility appending + OUTER_SET BGTKAGAIPState0 = 0 + OUTER_SET BGTKIVANPState0 = 0 + OUTER_SET BGTSHARTPState0 = 0 + OUTER_SET BGTXZARPState0 = 0 + OUTER_SET BGTYESLIPState0 = 0 + + //Tortured Souls compatibility appending + OUTER_SET BGTBCORANState0 = 0 + OUTER_SET BGTCORANState0 = 0 + OUTER_SET BGTCORANJState0 = 0 + OUTER_SET BGTCORANPState0 = 0 + OUTER_SET BGTDYNAHJState0 = 0 + OUTER_SET BGTDYNAHPState0 = 0 + END + + /* Post Dialogue Files */ + OUTER_SPRINT "AJANTIS_POST" "AJANTP" + OUTER_SPRINT "ALORA_POST" "ALORAP" + OUTER_SPRINT "BRANWEN_POST" "BRANWP" + OUTER_SPRINT "CORAN_POST" "CORANP" + OUTER_SPRINT "DYNAHEIR_POST" "DYNAP" + OUTER_SPRINT "EDWIN_POST" "EDWINP" + OUTER_SPRINT "ELDOTH_POST" "ELDOTP" + OUTER_SPRINT "FALDORN_POST" "FALDOP" + OUTER_SPRINT "GARRICK_POST" "GARRIP" + OUTER_SPRINT "IMOEN_POST" "IMOEN2P" + OUTER_SPRINT "JAHEIRA_POST" "JAHEIRAP" + OUTER_SPRINT "KAGAIN_POST" "KAGAIP" + OUTER_SPRINT "KHALID_POST" "KHALIP" + OUTER_SPRINT "KIVAN_POST" "KIVANP" + OUTER_SPRINT "MINSC_POST" "MINSCP" + OUTER_SPRINT "MONTARON_POST" "MONTAP" + OUTER_SPRINT "QUAYLE_POST" "QUAYLP" + OUTER_SPRINT "SAFANA_POST" "SAFANP" + OUTER_SPRINT "SHARTEEL_POST" "SHARTP" + OUTER_SPRINT "SKIE_POST" "SKIEP" + OUTER_SPRINT "TIAX_POST" "TIAXP" + OUTER_SPRINT "VICONIA_POST" "VICONIP" + OUTER_SPRINT "XAN_POST" "XANP" + OUTER_SPRINT "XZAR_POST" "XZARP" + OUTER_SPRINT "YESLICK_POST" "YESLIP" + + /* BG:EE Post Dialogue Files */ + OUTER_SPRINT "DORN_POST" "DORNP" + OUTER_SPRINT "NEERA_POST" "NEERAP" + OUTER_SPRINT "RASAAD_POST" "RASAADP" + + /* Banter Files */ + OUTER_SPRINT "AJANTIS_BANTER" "BAJANT" + OUTER_SPRINT "ALORA_BANTER" "BALORA" + OUTER_SPRINT "BRANWEN_BANTER" "BBRANW" + OUTER_SPRINT "CORAN_BANTER" "BCORAN" + OUTER_SPRINT "DYNAHEIR_BANTER" "BDYNA" + OUTER_SPRINT "EDWIN_BANTER" "BEDWIN" + OUTER_SPRINT "ELDOTH_BANTER" "BELDOT" + OUTER_SPRINT "FALDORN_BANTER" "BFALDO" + OUTER_SPRINT "GARRICK_BANTER" "BGARRI" + OUTER_SPRINT "IMOEN_BANTER" "BIMOEN2" + OUTER_SPRINT "JAHEIRA_BANTER" "BJAHEIR" + OUTER_SPRINT "KAGAIN_BANTER" "BKAGAI" + OUTER_SPRINT "KHALID_BANTER" "BKHALI" + OUTER_SPRINT "KIVAN_BANTER" "BKIVAN" + OUTER_SPRINT "MINSC_BANTER" "BMINSC" + OUTER_SPRINT "MONTARON_BANTER" "BMONTA" + OUTER_SPRINT "QUAYLE_BANTER" "BQUAYL" + OUTER_SPRINT "SAFANA_BANTER" "BSAFAN" + OUTER_SPRINT "SHARTEEL_BANTER" "BSHART" + OUTER_SPRINT "SKIE_BANTER" "BSKIE" + OUTER_SPRINT "TIAX_BANTER" "BTIAX" + OUTER_SPRINT "VICONIA_BANTER" "BVICONI" + OUTER_SPRINT "XAN_BANTER" "BXANNN" + OUTER_SPRINT "XZAR_BANTER" "BXZAR" + OUTER_SPRINT "YESLICK_BANTER" "BYESLI" + + /* BG:EE Banter Files */ + OUTER_SPRINT "DORN_BANTER" "BDORN" + OUTER_SPRINT "NEERA_BANTER" "BNEERA" + OUTER_SPRINT "RASAAD_BANTER" "BRASAAD" + + /* Joined Dialogue Files */ + OUTER_SPRINT "AJANTIS_JOINED" "AJANTJ" + OUTER_SPRINT "ALORA_JOINED" "ALORAJ" + OUTER_SPRINT "BRANWEN_JOINED" "BRANWJ" + OUTER_SPRINT "CORAN_JOINED" "CORANJ" + OUTER_SPRINT "DYNAHEIR_JOINED" "DYNAJ" + OUTER_SPRINT "EDWIN_JOINED" "EDWINJ" + OUTER_SPRINT "ELDOTH_JOINED" "ELDOTJ" + OUTER_SPRINT "FALDORN_JOINED" "FALDOJ" + OUTER_SPRINT "GARRICK_JOINED" "GARRIJ" + OUTER_SPRINT "IMOEN_JOINED" "IMOEN2J" + OUTER_SPRINT "JAHEIRA_JOINED" "JAHEIRAJ" + OUTER_SPRINT "KAGAIN_JOINED" "KAGAIJ" + OUTER_SPRINT "KHALID_JOINED" "KHALIJ" + OUTER_SPRINT "KIVAN_JOINED" "KIVANJ" + OUTER_SPRINT "MINSC_JOINED" "MINSCJ" + OUTER_SPRINT "MONTARON_JOINED" "MONTAJ" + OUTER_SPRINT "QUAYLE_JOINED" "QUAYLJ" + OUTER_SPRINT "SAFANA_JOINED" "SAFANJ" + OUTER_SPRINT "SHARTEEL_JOINED" "SHARTJ" + OUTER_SPRINT "SKIE_JOINED" "SKIEJ" + OUTER_SPRINT "TIAX_JOINED" "TIAXJ" + OUTER_SPRINT "VICONIA_JOINED" "VICONIJ" + OUTER_SPRINT "XAN_JOINED" "XANJ" + OUTER_SPRINT "XZAR_JOINED" "XZARJ" + OUTER_SPRINT "YESLICK_JOINED" "YESLIJ" + + /* BG:EE Joined Dialogue Files */ + OUTER_SPRINT "DORN_JOINED" "DORNJ" + OUTER_SPRINT "NEERA_JOINED" "NEERAJ" + OUTER_SPRINT "RASAAD_JOINED" "RASAADJ" + + /* Chapters */ + OUTER_SPRINT "tutu_prologue" "1" + OUTER_SPRINT "tutu_prologue_reset" "1" + OUTER_SPRINT "tutu_chapter_1" "2" + OUTER_SPRINT "tutu_chapter_2" "3" + OUTER_SPRINT "tutu_chapter_3" "4" + OUTER_SPRINT "tutu_chapter_4" "5" + OUTER_SPRINT "tutu_chapter_5" "6" + OUTER_SPRINT "tutu_chapter_6" "7" + OUTER_SPRINT "tutu_chapter_7" "8" + + /* NPC override script compilation */ + OUTER_SPRINT "AJANTIS_BCS" "AJANTIS" + OUTER_SPRINT "ALORA_BCS" "ALORA" + OUTER_SPRINT "BRANWEN_BCS" "BGBRANW" + OUTER_SPRINT "CORAN_BCS" "CORAN" + OUTER_SPRINT "DYNAHEIR_BCS" "DYNAHEIR" + OUTER_SPRINT "EDWIN_BCS" "BGEDWIN" + OUTER_SPRINT "ELDOTH_BCS" "ELDOTH" + OUTER_SPRINT "FALDORN_BCS" "BGFALDRN" + OUTER_SPRINT "GARRICK_BCS" "BGGARRIK" + OUTER_SPRINT "IMOEN_BCS" "BGIMOEN" + OUTER_SPRINT "JAHEIRA_BCS" "BGJHEIRA" + OUTER_SPRINT "KAGAIN_BCS" "KAGAIN" + OUTER_SPRINT "KHALID_BCS" "KHALID" + OUTER_SPRINT "KIVAN_BCS" "KIVAN" + OUTER_SPRINT "MINSC_BCS" "BGMINSC" + OUTER_SPRINT "MONTARON_BCS" "MONTARON" + OUTER_SPRINT "QUAYLE_BCS" "QUAYLE" + OUTER_SPRINT "SAFANA_BCS" "SAFANA" + OUTER_SPRINT "SHARTEEL_BCS" "SHARTEEL" + OUTER_SPRINT "SKIE_BCS" "BGSKIE" + OUTER_SPRINT "TIAX_BCS" "TIAX" + OUTER_SPRINT "VICONIA_BCS" "BGVICNIA" + OUTER_SPRINT "XAN_BCS" "XAN" + OUTER_SPRINT "XZAR_BCS" "XZAR" + OUTER_SPRINT "YESLICK_BCS" "YESLICK" + + /* BG:EE NPC override script compilation */ + OUTER_SPRINT "DORN_BCS" "DORN" + OUTER_SPRINT "NEERA_BCS" "NEERA" + OUTER_SPRINT "RASAAD_BCS" "RASAAD" + + /* Areas */ + OUTER_SPRINT "NBaldursGate_TempleofHelm" "ARA002" + OUTER_SPRINT "NBaldursGate_BherensHouse_L1" "ARA004" + OUTER_SPRINT "NBaldursGate_BherensHouse_L2" "ARA005" + OUTER_SPRINT "NBaldursGate_RinniesHouse_L1" "ARA006" + OUTER_SPRINT "NBaldursGate_RinniesHouse_L2" "ARA007" + OUTER_SPRINT "NBaldursGate_House1_L1" "ARA008" + OUTER_SPRINT "NBaldursGate_House1_L2" "ARA009" + OUTER_SPRINT "NBaldursGate_JardaksHouse_L1" "ARA010" + OUTER_SPRINT "NBaldursGate_JardaksHouse_L2" "ARA011" + OUTER_SPRINT "NBaldursGate_House2_L1" "ARA012" + OUTER_SPRINT "NBaldursGate_House2_L2" "ARA013" + OUTER_SPRINT "NBaldursGate_House3_L1" "ARA014" + OUTER_SPRINT "NBaldursGate_House3_L2" "ARA015" + OUTER_SPRINT "NBaldursGate_House4_L1" "ARA016" + OUTER_SPRINT "NBaldursGate_House4_L2" "ARA017" + OUTER_SPRINT "NBaldursGate_House5_L1" "ARA018" + OUTER_SPRINT "NBaldursGate_House5_L2" "ARA019" + OUTER_SPRINT "NBaldursGate_House6_L1" "ARA020" + OUTER_SPRINT "NBaldursGate_House6_L2" "ARA021" + OUTER_SPRINT "NWBaldursGate" "AR7200" + OUTER_SPRINT "NWBaldursGate_SilvershieldEstate_L1" "AR7201" + OUTER_SPRINT "NWBaldursGate_SilvershieldEstate_L2" "AR7202" + OUTER_SPRINT "NEBaldursGate_SplurgingSturgeon_L1" "AR7203" + OUTER_SPRINT "NEBaldursGate_SplurgingSturgeon_L2" "AR7204" + OUTER_SPRINT "SEBaldursGate_Blade&Stars_L1" "AR7205" + OUTER_SPRINT "SEBaldursGate_Blade&Stars_L2" "AR7206" + OUTER_SPRINT "SEBaldursGate_Blade&Stars_L3" "AR7207" + OUTER_SPRINT "NBaldursGate_DucalPalace_L1" "AR7208" + OUTER_SPRINT "NBaldursGate_DucalPalace_L2" "AR7209" + OUTER_SPRINT "NBaldursGate_DucalPalace_L3" "AR7210" + OUTER_SPRINT "NBaldursGate_DucalPalace_Cellar" "AR7211" + OUTER_SPRINT "BaldursGate_Undercellars" "AR7212" + OUTER_SPRINT "NEBaldursGate_BlushingMermaid_L1" "AR7214" + OUTER_SPRINT "NEBaldursGate_BlushingMermaid_L2" "AR7215" + OUTER_SPRINT "NWBaldursGate_Helm&Cloak_L1" "AR7216" + OUTER_SPRINT "NWBaldursGate_Helm&Cloak_L2" "AR7217" + OUTER_SPRINT "NWBaldursGate_Helm&Cloak_L3" "AR7218" + OUTER_SPRINT "NBaldursGate_ThreeOldKegs_L1" "AR7219" + OUTER_SPRINT "NBaldursGate_ThreeOldKegs_L2" "AR7220" + OUTER_SPRINT "NBaldursGate_ThreeOldKegs_L3" "AR7221" + OUTER_SPRINT "Undercity" "AR7223" + OUTER_SPRINT "Undercity_TempleofBhaal" "AR7225" + OUTER_SPRINT "WBaldursGate_RagefastsHouse" "AR7226" + OUTER_SPRINT "SWBaldursGate_MerchantLeague_L1" "AR7227" + OUTER_SPRINT "SWBaldursGate_MerchantLeague_L2" "AR7228" + OUTER_SPRINT "SWBaldursGate_MerchantLeague_L3" "AR7229" + OUTER_SPRINT "WBaldursGate_HallofWonders" "AR7230" + OUTER_SPRINT "WBaldursGate_HighHouseofWonders" "AR7231" + OUTER_SPRINT "WBaldursGate_LadysHouse" "AR7232" + OUTER_SPRINT "BaldursGate_DocksLowLantern_D1" "AR7233" + OUTER_SPRINT "BaldursGate_DocksLowLantern_D2" "AR7234" + OUTER_SPRINT "BaldursGate_DocksLowLantern_D3" "AR7235" + OUTER_SPRINT "BaldursGate_DocksLowLantern_D4" "AR7236" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L1" "AR7237" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L6" "AR7238" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L2" "AR7239" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L3" "AR7240" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L4" "AR7241" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L5" "AR7242" + OUTER_SPRINT "CentralBaldursGate_OberonsEstate_L1" "AR7243" + OUTER_SPRINT "CentralBaldursGate_OberonsEstate_L2" "AR7244" + OUTER_SPRINT "CentralBaldursGate_OberonsEstate_L3" "AR7245" + OUTER_SPRINT "ThievesMaze" "AR7246" + OUTER_SPRINT "EBaldursGate_House5" "AR7248" + OUTER_SPRINT "NEBaldursGate_IlmatersShrine" "AR7249" + OUTER_SPRINT "EBaldursGate_House2" "AR7250" + OUTER_SPRINT "EBaldursGate_House3" "AR7251" + OUTER_SPRINT "EBaldursGate_House4" "AR7252" + OUTER_SPRINT "EBaldursGate_ThievesGuild" "AR7253" + OUTER_SPRINT "EBaldursGate_KeexieTavern_L1" "AR7254" + OUTER_SPRINT "NWBaldursGate_House3_L1" "AR7255" + OUTER_SPRINT "NWBaldursGate_House3_L2" "AR7256" + OUTER_SPRINT "NWBaldursGate_QuinnsHouse_L1" "AR7257" + OUTER_SPRINT "NWBaldursGate_QuinnsHouse_L2" "AR7258" + OUTER_SPRINT "NWBaldursGate_House1_L1" "AR7259" + OUTER_SPRINT "NWBaldursGate_House1_L2" "AR7260" + OUTER_SPRINT "NWBaldursGate_DegrodelsHouse" "AR7261" + OUTER_SPRINT "NWBaldursGate_LaertasHouse_L1" "AR7262" + OUTER_SPRINT "NWBaldursGate_House2_L1" "AR7263" + OUTER_SPRINT "NWBaldursGate_House2_L2" "AR7264" + OUTER_SPRINT "NWBaldursGate_Tavern_L1" "AR7265" + OUTER_SPRINT "NWBaldursGate_Tavern_L2" "AR7266" + OUTER_SPRINT "NWBaldursGate_PheirkasHouse_L1" "AR7267" + OUTER_SPRINT "NWBaldursGate_PheirkasHouse_L2" "AR7268" + OUTER_SPRINT "NWBaldursGate_House4_L1" "AR7269" + OUTER_SPRINT "NWBaldursGate_House4_L2" "AR7270" + OUTER_SPRINT "EBaldursGate_KeexieTavern_L2" "AR7271" + OUTER_SPRINT "NBaldursGate" "AR7300" + OUTER_SPRINT "WSewers" "AR7324" + OUTER_SPRINT "CentralSewers" "AR7325" + OUTER_SPRINT "ESewers" "AR7326" + OUTER_SPRINT "NEBaldursGate" "AR7400" + OUTER_SPRINT "NEBaldursGate_House2_L1" "AR7402" + OUTER_SPRINT "NEBaldursGate_House2_L2" "AR7403" + OUTER_SPRINT "NEBaldursGate_Store" "AR7404" + OUTER_SPRINT "NEBaldursGate_House1_L1" "AR7405" + OUTER_SPRINT "NEBaldursGate_House1_L2" "AR7406" + OUTER_SPRINT "NEBaldursGate_CountingHouse_L1" "AR7407" + OUTER_SPRINT "NEBaldursGate_CountingHouse_L2" "AR7408" + OUTER_SPRINT "WBaldursGate" "AR7600" + OUTER_SPRINT "SWBaldursGate_SevenSuns_L1" "AR7601" + OUTER_SPRINT "SWBaldursGate_SevenSuns_L2" "AR7602" + OUTER_SPRINT "SWBaldursGate_SevenSuns_Cellar" "AR7603" + OUTER_SPRINT "SWBaldursGate_FlamingFistHQ_Cellar" "AR7606" + OUTER_SPRINT "SWBaldursGate_FlamingFistHQ_L1" "AR7607" + OUTER_SPRINT "SWBaldursGate_FlamingFistHQ_L2" "AR7608" + OUTER_SPRINT "BaldursGateDocks_WaterQueensHouse" "AR7609" + OUTER_SPRINT "BaldursGateDocks_IronThrone_Cellar" "AR7611" + OUTER_SPRINT "BaldursGateDocks_IronThrone_L2" "AR7612" + OUTER_SPRINT "BaldursGateDocks_IronThrone_L3" "AR7613" + OUTER_SPRINT "BaldursGateDocks_IronThrone_L4" "AR7614" + OUTER_SPRINT "BaldursGateDocks_IronThrone_L5" "AR7615" + OUTER_SPRINT "BaldursGateDocks_IronThrone_L1" "AR7616" + OUTER_SPRINT "WBaldursGate_TremainsHouse_L1" "AR7617" + OUTER_SPRINT "WBaldursGate_TremainsHouse_L2" "AR7618" + OUTER_SPRINT "WBaldursGate_FentensHouse_L1" "AR7619" + OUTER_SPRINT "WBaldursGate_FentensHouse_L2" "AR7620" + OUTER_SPRINT "BaldursGateDocks_IronThroneRoof" "AR7621" + OUTER_SPRINT "CentralBaldursGate" "AR7700" + OUTER_SPRINT "BaldursGateDocks_Harbormaster" "AR7702" + OUTER_SPRINT "EBaldursGate_SorcerousSundries_L1" "AR7703" + OUTER_SPRINT "EBaldursGate_SorcerousSundries_L2" "AR7704" + OUTER_SPRINT "EBaldursGate_ElfsongTavern_L1" "AR7705" + OUTER_SPRINT "EBaldursGate_ElfsongTavern_L2" "AR7706" + OUTER_SPRINT "CentralBaldursGate_House3_L1" "AR7707" + OUTER_SPRINT "CentralBaldursGate_House3_L2" "AR7708" + OUTER_SPRINT "CentralBaldursGate_House2_L1" "AR7709" + OUTER_SPRINT "CentralBaldursGate_House2_L2" "AR7710" + OUTER_SPRINT "CentralBaldursGate_House1_L1" "AR7711" + OUTER_SPRINT "CentralBaldursGate_House1_L2" "AR7712" + OUTER_SPRINT "CentralBaldursGate_House5_L1" "AR7713" + OUTER_SPRINT "CentralBaldursGate_House5_L2" "AR7714" + OUTER_SPRINT "CentralBaldursGate_NadinesHouse_L1" "AR7715" + OUTER_SPRINT "CentralBaldursGate_NadinesHouse_L2" "AR7716" + OUTER_SPRINT "CentralBaldursGate_House6_L1" "AR7717" + OUTER_SPRINT "CentralBaldursGate_House6_L2" "AR7718" + OUTER_SPRINT "CentralBaldursGate_FeloniusManor" "AR7719" + OUTER_SPRINT "CentralBaldursGate_DrakonTavern" "AR7720" + OUTER_SPRINT "CentralBaldursGate_PoultryStore" "AR7721" + OUTER_SPRINT "CentralBaldursGate_House4_L1" "AR7722" + OUTER_SPRINT "CentralBaldursGate_House4_L2" "AR7723" + OUTER_SPRINT "CentralBaldursGate_GamblingTent1" "AR7724" + OUTER_SPRINT "CentralBaldursGate_GamblingTent2" "AR7725" + OUTER_SPRINT "CentralBaldursGate_DivinersTent" "AR7726" + OUTER_SPRINT "EBaldursGate" "AR7800" + OUTER_SPRINT "EBaldursGate_House6_L1" "AR7801" + OUTER_SPRINT "EBaldursGate_House6_L2" "AR7802" + OUTER_SPRINT "EBaldursGate_MaltzWeaponShop_L1" "AR7803" + OUTER_SPRINT "EBaldursGate_MaltzWeaponShop_L2" "AR7804" + OUTER_SPRINT "EBaldursGate_ArkionsHouse_L1" "AR7805" + OUTER_SPRINT "EBaldursGate_ArkionsHouse_L2" "AR7806" + OUTER_SPRINT "EBaldursGate_Inn_L1" "AR7807" + OUTER_SPRINT "EBaldursGate_Inn_L2" "AR7808" + OUTER_SPRINT "EBaldursGate_SilencesShop" "AR7809" + OUTER_SPRINT "EBaldursGate_LuckyAellos" "AR7810" + OUTER_SPRINT "EBaldursGate_House1_L1" "AR7811" + OUTER_SPRINT "EBaldursGate_House1_L2" "AR7812" + OUTER_SPRINT "SEBaldursGate_NemphresHouse_L1" "AR7813" + OUTER_SPRINT "SEBaldursGate_NemphresHouse_L2" "AR7814" + OUTER_SPRINT "WyrmsCrossing" "AR7900" + OUTER_SPRINT "WyrmsCrossingTenyasHouse" "AR7901" + OUTER_SPRINT "SWBaldursGate" "AR8000" + OUTER_SPRINT "SWBaldursGate_WivensHouse_L1" "AR8001" + OUTER_SPRINT "SWBaldursGate_WivensHouse_L2" "AR8002" + OUTER_SPRINT "SWBaldursGate_House3_L1" "AR8003" + OUTER_SPRINT "SWBaldursGate_House3_L2" "AR8004" + OUTER_SPRINT "SWBaldursGate_House1_L1" "AR8005" + OUTER_SPRINT "SWBaldursGate_House1_L2" "AR8006" + OUTER_SPRINT "SWBaldursGate_House2_L1" "AR8007" + OUTER_SPRINT "SWBaldursGate_House2_L2" "AR8008" + OUTER_SPRINT "SWBaldursGate_Tavern_L1" "AR8009" + OUTER_SPRINT "SWBaldursGate_Tavern_L2" "AR8010" + OUTER_SPRINT "SWBaldursGate_SuninsHouse" "AR8011" + OUTER_SPRINT "SWBaldursGate_WeaponsStore1" "AR8012" + OUTER_SPRINT "SWBaldursGate_YeOldeInn_L1" "AR8013" + OUTER_SPRINT "SWBaldursGate_YeOldeInn_L2" "AR8014" + OUTER_SPRINT "SWBaldursGate_PotionsStore2" "AR8015" + OUTER_SPRINT "SWBaldursGate_WeaponsStore2" "AR8016" + OUTER_SPRINT "SWBaldursGate_PotionsStore1" "AR8017" + OUTER_SPRINT "BaldursGateDocks" "AR8100" + OUTER_SPRINT "BaldursGateDocks_OgreMagiHouse_L1" "AR8101" + OUTER_SPRINT "BaldursGateDocks_OgreMagiHouse_L2" "AR8102" + OUTER_SPRINT "BaldursGateDocks_House2_L1" "AR8103" + OUTER_SPRINT "BaldursGateDocks_House2_L2" "AR8104" + OUTER_SPRINT "BaldursGateDocks_House1_L1" "AR8105" + OUTER_SPRINT "BaldursGateDocks_House1_L2" "AR8106" + OUTER_SPRINT "BaldursGateDocks_BasiliskWarehouse" "AR8107" + OUTER_SPRINT "BaldursGateDocks_NoraleesWarehouse" "AR8108" + OUTER_SPRINT "BaldursGateDocks_LarriazHouse_L1" "AR8109" + OUTER_SPRINT "BaldursGateDocks_LarriazHouse_L2" "AR8110" + OUTER_SPRINT "BaldursGateDocks_GhoraksHouse_L1" "AR8111" + OUTER_SPRINT "BaldursGateDocks_GhoraksHouse_L2" "AR8112" + OUTER_SPRINT "BaldursGateDocks_CordyrsHouse_L1" "AR8113" + OUTER_SPRINT "BaldursGateDocks_CordyrsHouse_L2" "AR8114" + OUTER_SPRINT "BaldursGateDocks_JopalinsTavern" "AR8115" + OUTER_SPRINT "SEBaldursGate" "AR8200" + OUTER_SPRINT "SEBaldursGate_Warehouse" "AR8201" + OUTER_SPRINT "SEBaldursGate_GeneralStore2" "AR8202" + OUTER_SPRINT "SEBaldursGate_NadarinsWarehouse" "AR8203" + OUTER_SPRINT "SEBaldursGate_House3_L1" "AR8204" + OUTER_SPRINT "SEBaldursGate_House3_L2" "AR8205" + OUTER_SPRINT "SEBaldursGate_Inn_L1" "AR8206" + OUTER_SPRINT "SEBaldursGate_Inn_L2" "AR8207" + OUTER_SPRINT "SEBaldursGate_House4_L1" "AR8208" + OUTER_SPRINT "SEBaldursGate_House4_L2" "AR8209" + OUTER_SPRINT "SEBaldursGate_House2_L1" "AR8210" + OUTER_SPRINT "SEBaldursGate_House2_L2" "AR8211" + OUTER_SPRINT "SEBaldursGate_GantolandansHouse_L1" "AR8212" + OUTER_SPRINT "SEBaldursGate_GantolandansHouse_L2" "AR8213" + OUTER_SPRINT "SEBaldursGate_House1_L1" "AR8214" + OUTER_SPRINT "SEBaldursGate_House1_L2" "AR8215" + OUTER_SPRINT "SEBaldursGate_TaxeksHouse_L1" "AR8216" + OUTER_SPRINT "SEBaldursGate_TaxeksHouse_L2" "AR8217" + OUTER_SPRINT "SEBaldursGate_GeneralStore1" "AR8220" + OUTER_SPRINT "FishingVillage" "AR8300" + OUTER_SPRINT "FishingVillage_AnkhegPit" "AR8301" + OUTER_SPRINT "FishingVillage_House1" "AR8302" + OUTER_SPRINT "FishingVillage_House2" "AR8303" + OUTER_SPRINT "FishingVillage_FarmerBrunsHouse" "AR8304" + OUTER_SPRINT "CloakwoodDruids" "AR8400" + OUTER_SPRINT "CloakwoodDruids_Treehouse_L1" "AR8401" + OUTER_SPRINT "CloakwoodDruids_Treehouse_L2" "AR8402" + OUTER_SPRINT "CloakwoodDruids_PetersCave" "AR8403" + OUTER_SPRINT "CloakwoodWyverns" "AR8500" + OUTER_SPRINT "CloakwoodMines" "AR8600" + OUTER_SPRINT "CloakwoodMines_L1" "AR8601" + OUTER_SPRINT "CloakwoodMines_L3" "AR8602" + OUTER_SPRINT "CloakwoodMines_L4" "AR8603" + OUTER_SPRINT "CloakwoodMines_L2" "AR8604" + OUTER_SPRINT "CloakwoodMines_Barracks_L1" "AR8605" + OUTER_SPRINT "CloakwoodMines_Barracks_L2" "AR8606" + OUTER_SPRINT "CloakwoodMines_MineLift" "AR8607" + OUTER_SPRINT "CloakwoodMines_Storehouse" "AR8608" + OUTER_SPRINT "CloakwoodMines_MineShed" "AR8609" + OUTER_SPRINT "BanditCamp" "AR8700" + OUTER_SPRINT "BanditCamp_RaemonsTent" "AR8701" + OUTER_SPRINT "BanditCamp_Tent2" "AR8702" + OUTER_SPRINT "BanditCamp_GnollCave" "AR8703" + OUTER_SPRINT "BanditCamp_TersusTent" "AR8704" + OUTER_SPRINT "BanditCamp_Tent1" "AR8705" + OUTER_SPRINT "BanditCamp_Tent3" "AR8706" + OUTER_SPRINT "BanditCamp_Tent4" "AR8707" + OUTER_SPRINT "CloakwoodNest" "AR8800" + OUTER_SPRINT "CloakwoodNestSpiderNest" "AR8801" + OUTER_SPRINT "CloakwoodLodge" "AR7000" + OUTER_SPRINT "CloakwoodLodgeHuntingLodge" "AR7015" + OUTER_SPRINT "FriendlyArmInn" "AR6800" + OUTER_SPRINT "FriendlyArmInn_L1" "AR6801" + OUTER_SPRINT "FriendlyArmInn_L2" "AR6802" + OUTER_SPRINT "FriendlyArmInn_L3" "AR6803" + OUTER_SPRINT "FriendlyArmInn_TempleofWisdom" "AR6804" + OUTER_SPRINT "FriendlyArmInn_House" "AR6805" + OUTER_SPRINT "FriendlyArmInn_JoiasHouse" "AR6806" + OUTER_SPRINT "Peldvale" "AR8900" + OUTER_SPRINT "Candlekeep" "AR0015" + OUTER_SPRINT "Candlekeep_PriestsQuarters" "AR6502" + OUTER_SPRINT "Candlekeep_Infirmary" "AR6505" + OUTER_SPRINT "Candlekeep_Storehouse" "AR6506" + OUTER_SPRINT "Candlekeep_Bunkhouse" "AR6507" + OUTER_SPRINT "Candlekeep_Library_L1" "AR6508" + OUTER_SPRINT "Candlekeep_Library_L2" "AR6509" + OUTER_SPRINT "Candlekeep_Library_L3" "AR6510" + OUTER_SPRINT "Candlekeep_Library_L4" "AR6511" + OUTER_SPRINT "Candlekeep_Library_L5" "AR6512" + OUTER_SPRINT "Candlekeep_Catacombs_L1Antechamber" "AR6513" + OUTER_SPRINT "Candlekeep_Library_L6" "AR6514" + OUTER_SPRINT "Candlekeep_Catacombs_L1" "AR6515" + OUTER_SPRINT "Candlekeep_Inn_L1" "AR6516" + OUTER_SPRINT "Candlekeep_Inn_L2" "AR6517" + OUTER_SPRINT "Candlekeep_Barracks" "AR6518" + OUTER_SPRINT "Candlekeep_Catacombs_L2" "AR6519" + OUTER_SPRINT "Candlekeep_Ch6" "AR6526" + OUTER_SPRINT "Candlekeep_Ch6_PriestsQuarters" "AR6527" + OUTER_SPRINT "Candlekeep_Ch6_Storehouse" "AR6528" + OUTER_SPRINT "Candlekeep_Ch6_Inn_L1" "AR6529" + OUTER_SPRINT "Candlekeep_Ch6_Inn_L2" "AR6530" + OUTER_SPRINT "Candlekeep_Ch6_Barracks" "AR6531" + OUTER_SPRINT "Candlekeep_Ch6_Bunkhouse" "AR6532" + OUTER_SPRINT "Candlekeep_Ch6_Infirmary" "AR6533" + OUTER_SPRINT "Candlekeep_ObesCellar" "AR6543" + OUTER_SPRINT "LionsWay" "AR6600" + OUTER_SPRINT "CoastWay" "AR6900" + OUTER_SPRINT "Larswood" "AR9000" + OUTER_SPRINT "SpiderWood" "AR9100" + OUTER_SPRINT "ShipwrecksCoast" "AR9200" + OUTER_SPRINT "HighHedge" "AR7100" + OUTER_SPRINT "HighHedge_House" "AR7101" + OUTER_SPRINT "HighHedge_ThalanthyrsAbode" "AR7102" + OUTER_SPRINT "Beregost" "AR6700" + OUTER_SPRINT "Beregost_ThunderhammerSmithy" "AR6701" + OUTER_SPRINT "Beregost_House19" "AR6702" + OUTER_SPRINT "Beregost_RedSheaf_L2" "AR6703" + OUTER_SPRINT "Beregost_JovialJuggler_L1" "AR6704" + OUTER_SPRINT "Beregost_JovialJuggler_L2F" "AR6705" + OUTER_SPRINT "Beregost_JovialJuggler_L2R" "AR6706" + OUTER_SPRINT "Beregost_BurningWizard_L1" "AR6707" + OUTER_SPRINT "Beregost_BurningWizard_L2" "AR6708" + OUTER_SPRINT "Beregost_House13_L1" "AR6709" + OUTER_SPRINT "Beregost_House13_L2" "AR6710" + OUTER_SPRINT "Beregost_House12_L1" "AR6711" + OUTER_SPRINT "Beregost_House12_L2" "AR6712" + OUTER_SPRINT "Beregost_MiriannesHouse_L1" "AR6713" + OUTER_SPRINT "Beregost_MiriannesHouse_L2" "AR6714" + OUTER_SPRINT "Beregost_LandrinsHouse" "AR6715" + OUTER_SPRINT "Beregost_House18" "AR6716" + OUTER_SPRINT "Beregost_House17" "AR6717" + OUTER_SPRINT "Beregost_House15" "AR6718" + OUTER_SPRINT "Beregost_House16" "AR6719" + OUTER_SPRINT "Beregost_TravenhurstManor_L1" "AR6720" + OUTER_SPRINT "Beregost_TravenhurstManor_L2" "AR6721" + OUTER_SPRINT "Beregost_ServantsQuarters" "AR6722" + OUTER_SPRINT "Beregost_House20_L1" "AR6723" + OUTER_SPRINT "Beregost_House20_L2" "AR6724" + OUTER_SPRINT "Beregost_House23_L1" "AR6725" + OUTER_SPRINT "Beregost_House23_L2" "AR6726" + OUTER_SPRINT "Beregost_House14_L1" "AR6727" + OUTER_SPRINT "Beregost_House14_L2" "AR6728" + OUTER_SPRINT "Beregost_House21_L1" "AR6729" + OUTER_SPRINT "Beregost_House21_L2" "AR6730" + OUTER_SPRINT "Beregost_House11_L1" "AR6731" + OUTER_SPRINT "Beregost_House11_L2" "AR6732" + OUTER_SPRINT "Beregost_FirebeadsHouse_L1" "AR6733" + OUTER_SPRINT "Beregost_FirebeadsHouse_L2" "AR6734" + OUTER_SPRINT "Beregost_House10_L1" "AR6735" + OUTER_SPRINT "Beregost_House10_L2" "AR6736" + OUTER_SPRINT "Beregost_House22_L1" "AR6737" + OUTER_SPRINT "Beregost_House22_L2" "AR6738" + OUTER_SPRINT "Beregost_House01_L1" "AR6739" + OUTER_SPRINT "Beregost_House01_L2" "AR6740" + OUTER_SPRINT "Beregost_House02_L1" "AR6741" + OUTER_SPRINT "Beregost_House02_L2" "AR6742" + OUTER_SPRINT "Beregost_House03" "AR6743" + OUTER_SPRINT "Beregost_House07" "AR6744" + OUTER_SPRINT "Beregost_House04_L1" "AR6745" + OUTER_SPRINT "Beregost_House04_L2" "AR6746" + OUTER_SPRINT "Beregost_House05_L1" "AR6747" + OUTER_SPRINT "Beregost_House05_L2" "AR6748" + OUTER_SPRINT "Beregost_House06_L1" "AR6749" + OUTER_SPRINT "Beregost_House06_L2" "AR6750" + OUTER_SPRINT "Beregost_FeldepostsInn_L1" "AR6751" + OUTER_SPRINT "Beregost_FeldepostsInn_L2" "AR6752" + OUTER_SPRINT "Beregost_KagainsStore" "AR6753" + OUTER_SPRINT "Beregost_House09" "AR6754" + OUTER_SPRINT "Beregost_House08" "AR6755" + OUTER_SPRINT "Beregost_House08_L2" "AR6756" + OUTER_SPRINT "Beregost_RedSheaf_L1" "AR6757" + OUTER_SPRINT "Temple" "AR9300" + OUTER_SPRINT "Temple_Vestibule" "AR9301" + OUTER_SPRINT "Temple_SongoftheMorning" "AR9302" + OUTER_SPRINT "MutaminsGarden" "AR9400" + OUTER_SPRINT "Lighthouse" "AR9500" + OUTER_SPRINT "Lighthouse_BlackAlaricsCave" "AR9501" + OUTER_SPRINT "RedCanyons" "AR9600" + OUTER_SPRINT "SouthBeregostRoad" "AR9700" + OUTER_SPRINT "SouthBeregostRoad_Cave" "AR9702" + OUTER_SPRINT "Ulcaster" "AR9799" + OUTER_SPRINT "UlcasterRuins" "AR9798" + OUTER_SPRINT "Gullykin" "AR9900" + OUTER_SPRINT "Gullykin_JenkalsHouse_L1" "AR9901" + OUTER_SPRINT "Gullykin_JenkalsHouse_Cellar" "AR9902" + OUTER_SPRINT "Gullykin_Winery_L1" "AR9903" + OUTER_SPRINT "Gullykin_Winery_Cellar" "AR9904" + OUTER_SPRINT "Gullykin_House1_L1" "AR9905" + OUTER_SPRINT "Gullykin_House1_Cellar" "AR9906" + OUTER_SPRINT "Gullykin_House3_L1" "AR9907" + OUTER_SPRINT "Gullykin_House3_Cellar" "AR9908" + OUTER_SPRINT "Gullykin_House4_L1" "AR9909" + OUTER_SPRINT "Gullykin_House4_Cellar" "AR9910" + OUTER_SPRINT "Gullykin_House5_L1" "AR9911" + OUTER_SPRINT "Gullykin_House5_Cellar" "AR9912" + OUTER_SPRINT "Gullykin_House2_L1" "AR9913" + OUTER_SPRINT "Gullykin_House2_Cellar" "AR9914" + OUTER_SPRINT "ArchaeologicalSite" "ARA100" + OUTER_SPRINT "ArchaeologicalSite_Tomb" "ARA101" + OUTER_SPRINT "FishermansLake" "AR3100" + OUTER_SPRINT "NorthNashkelRoad" "AR3200" + OUTER_SPRINT "LonelyPeaks" "AR3300" + OUTER_SPRINT "LonelyPeaks_Cave" "AR3301" + OUTER_SPRINT "FirewineBridge" "AR3400" + OUTER_SPRINT "CloakwoodWyverns_WyvernCave" "AR8501" + OUTER_SPRINT "BearRiver" "AR3499" + OUTER_SPRINT "XvartVillage" "AR3498" + OUTER_SPRINT "XvartVillage_Cave" "AR3497" + OUTER_SPRINT "Nashkel" "AR3700" + OUTER_SPRINT "Nashkel_Inn" "AR3701" + OUTER_SPRINT "Nashkel_TempleofHelm" "AR3702" + OUTER_SPRINT "Nashkel_Store" "AR3703" + OUTER_SPRINT "Nashkel_ManorHouse_L1" "AR3704" + OUTER_SPRINT "Nashkel_ManorHouse_L2" "AR3705" + OUTER_SPRINT "Nashkel_JosephsHouse" "AR3706" + OUTER_SPRINT "Nashkel_House1" "AR3707" + OUTER_SPRINT "Nashkel_House2" "AR3708" + OUTER_SPRINT "Nashkel_BelchingDragonTavern" "AR3709" + OUTER_SPRINT "Nashkel_Garrison" "AR3710" + OUTER_SPRINT "NashkelCarnival" "AR3800" + OUTER_SPRINT "NashkelCarnival_ArmorTent" "AR3801" + OUTER_SPRINT "NashkelCarnival_LotusTent" "AR3802" + OUTER_SPRINT "NashkelCarnival_VitiaresTent" "AR3803" + OUTER_SPRINT "NashkelCarnival_GamblingTent" "AR3804" + OUTER_SPRINT "NashkelCarnival_PotionTent" "AR3805" + OUTER_SPRINT "NashkelCarnival_ZordralsTent" "AR3806" + OUTER_SPRINT "NashkelCarnival_MagicItemsTent" "AR3807" + OUTER_SPRINT "NashkelCarnival_MeleeWeaponsTent" "AR3808" + OUTER_SPRINT "NashkelCarnival_RangedWeaponsTent" "AR3809" + OUTER_SPRINT "ValleyoftheTombs" "AR3900" + OUTER_SPRINT "ValleyoftheTombs_Tomb" "AR3901" + OUTER_SPRINT "GnollStronghold" "AR4100" + OUTER_SPRINT "GnollStronghold_XvartCave" "AR4101" + OUTER_SPRINT "GnollStronghold_TomeCave" "AR4102" + OUTER_SPRINT "GnollStronghold_CrawlerCave" "AR4103" + OUTER_SPRINT "DryadFalls" "AR4200" + OUTER_SPRINT "FirewineRuins" "AR3401" + OUTER_SPRINT "DryadFalls_Cave" "AR4199" + OUTER_SPRINT "FireLeafForest" "AR4300" + OUTER_SPRINT "NashkelMines" "AR4400" + OUTER_SPRINT "NashkelMines_L1" "AR4401" + OUTER_SPRINT "NashkelMines_L2" "AR4402" + OUTER_SPRINT "NashkelMines_L3" "AR4403" + OUTER_SPRINT "NashkelMines_L4" "AR4404" + OUTER_SPRINT "NashkelMines_MulaheysCave" "AR4405" + OUTER_SPRINT "NashkelMines_Cabin" "AR4406" + OUTER_SPRINT "GibberlingMountains" "AR4600" + OUTER_SPRINT "CandlekeepCaves" "AR6560" + OUTER_SPRINT "Encounter_Plains1" "AR4700" + OUTER_SPRINT "Encounter_Plains2" "AR4701" + OUTER_SPRINT "Encounter_Canyon1" "AR4800" + OUTER_SPRINT "Encounter_Canyon2" "AR4801" + OUTER_SPRINT "Encounter_Cliff1" "AR4900" + OUTER_SPRINT "Encounter_Cliff2" "AR4901" + OUTER_SPRINT "Encounter_Grassland1" "AR5100" + OUTER_SPRINT "Encounter_Grassland2" "AR5101" + OUTER_SPRINT "Encounter_Forest1" "AR5300" + OUTER_SPRINT "Encounter_Forest2" "AR5301" + OUTER_SPRINT "Encounter_Road" "AR5400" + + /* TOTSC Areas; BGT requires it, but separation needed for Tutu */ + OUTER_SPRINT "Farmlands" "AR7500" + OUTER_SPRINT "FarmlandsFarmhouse" "AR7501" + OUTER_SPRINT "DurlagsTower" "ARD000" + OUTER_SPRINT "DurlagsTower_Cellar" "ARD001" + OUTER_SPRINT "DurlagsTower_L1" "ARD002" + OUTER_SPRINT "DurlagsTower_L2" "ARD003" + OUTER_SPRINT "DurlagsTower_L3" "ARD004" + OUTER_SPRINT "DurlagsTower_L4" "ARD005" + OUTER_SPRINT "DurlagsTower_Chessboard" "ARD006" + OUTER_SPRINT "DurlagsTower_IceChamber" "ARD007" + OUTER_SPRINT "DurlagsTower_FireChamber" "ARD008" + OUTER_SPRINT "DurlagsTower_AirChamber" "ARD009" + OUTER_SPRINT "DurlagsTower_EarthChamber" "ARD010" + OUTER_SPRINT "DurlagsTower_D1" "ARD011" + OUTER_SPRINT "DurlagsTower_D2" "ARD012" + OUTER_SPRINT "DurlagsTower_D3" "ARD013" + OUTER_SPRINT "DurlagsTower_D4" "ARD014" + OUTER_SPRINT "DurlagsTower_CompassRoom" "ARD015" + OUTER_SPRINT "DurlagsTower_DemonknightsChamber" "ARD016" + OUTER_SPRINT "IsleofBalduranN" "ARW500" + OUTER_SPRINT "IsleofBalduranNShip_D1" "ARW501" + OUTER_SPRINT "IsleofBalduranNShip_D2" "ARW502" + OUTER_SPRINT "IsleofBalduranNShip_D3" "ARW503" + OUTER_SPRINT "IsleofBalduranNShip_D4" "ARW504" + OUTER_SPRINT "IsleofBalduranNDradeelsHouse" "ARW505" + OUTER_SPRINT "IsleofBalduranS" "ARW000" + OUTER_SPRINT "IsleofBalduranS_GreatHut" "ARW001" + OUTER_SPRINT "IsleofBalduranS_KaishasHut" "ARW002" + OUTER_SPRINT "IsleofBalduranS_LargeHut3" "ARW003" + OUTER_SPRINT "IsleofBalduranS_LargeHut2" "ARW004" + OUTER_SPRINT "IsleofBalduranS_LargeHut4" "ARW005" + OUTER_SPRINT "IsleofBalduranS_LargeHut1" "ARW006" + OUTER_SPRINT "IsleofBalduranS_HarborHut" "ARW007" + OUTER_SPRINT "IsleofBalduranS_StoreHut2" "ARW008" + OUTER_SPRINT "IsleofBalduranS_StoreHut1" "ARW009" + OUTER_SPRINT "IsleofBalduranS_StoreHut4" "ARW010" + OUTER_SPRINT "IsleofBalduranS_StoreHut3" "ARW011" + OUTER_SPRINT "WerewolfCaverns" "ARW012" + OUTER_SPRINT "UlgothsBeard" "ARU000" + OUTER_SPRINT "UlgothsBeard_Inn" "ARU001" + OUTER_SPRINT "UlgothsBeard_DemonsChamber" "ARU002" + OUTER_SPRINT "UlgothsBeard_Storehouse" "ARU003" + OUTER_SPRINT "UlgothsBeard_MendasHouse" "ARU004" + OUTER_SPRINT "UlgothsBeard_TherellasHouse" "ARU005" + OUTER_SPRINT "UlgothsBeard_House2" "ARU006" + OUTER_SPRINT "UlgothsBeard_House1" "ARU007" + OUTER_SPRINT "IceIsland" "ARU008" + OUTER_SPRINT "IceIslandMaze_L1" "ARU009" + OUTER_SPRINT "IceIslandMaze_L2" "ARU010" + + /* AREA_SCRIPTS (full list using the same var names as areas, with added _BCS at the end)*/ + //these variables are not needed for BG:EE, BGT, EET, but for some reason Tutu doesn't use the same names as areas, so they must be assigned + OUTER_SPRINT "NBaldursGate_TempleofHelm_BCS" "ARA002" + OUTER_SPRINT "NBaldursGate_BherensHouse_L1_BCS" "ARA004" + OUTER_SPRINT "NBaldursGate_BherensHouse_L2_BCS" "ARA005" + OUTER_SPRINT "NBaldursGate_RinniesHouse_L1_BCS" "ARA006" + OUTER_SPRINT "NBaldursGate_RinniesHouse_L2_BCS" "ARA007" + OUTER_SPRINT "NBaldursGate_House1_L1_BCS" "ARA008" + OUTER_SPRINT "NBaldursGate_House1_L2_BCS" "ARA009" + OUTER_SPRINT "NBaldursGate_JardaksHouse_L1_BCS" "ARA010" + OUTER_SPRINT "NBaldursGate_JardaksHouse_L2_BCS" "ARA011" + OUTER_SPRINT "NBaldursGate_House2_L1_BCS" "ARA012" + OUTER_SPRINT "NBaldursGate_House2_L2_BCS" "ARA013" + OUTER_SPRINT "NBaldursGate_House3_L1_BCS" "ARA014" + OUTER_SPRINT "NBaldursGate_House3_L2_BCS" "ARA015" + OUTER_SPRINT "NBaldursGate_House4_L1_BCS" "ARA016" + OUTER_SPRINT "NBaldursGate_House4_L2_BCS" "ARA017" + OUTER_SPRINT "NBaldursGate_House5_L1_BCS" "ARA018" + OUTER_SPRINT "NBaldursGate_House5_L2_BCS" "ARA019" + OUTER_SPRINT "NBaldursGate_House6_L1_BCS" "ARA020" + OUTER_SPRINT "NBaldursGate_House6_L2_BCS" "ARA021" + OUTER_SPRINT "NWBaldursGate_BCS" "AR7200" + OUTER_SPRINT "NWBaldursGate_SilvershieldEstate_L1_BCS" "AR7201" + OUTER_SPRINT "NWBaldursGate_SilvershieldEstate_L2_BCS" "AR7202" + OUTER_SPRINT "NEBaldursGate_SplurgingSturgeon_L1_BCS" "AR7203" + OUTER_SPRINT "NEBaldursGate_SplurgingSturgeon_L2_BCS" "AR7204" + OUTER_SPRINT "SEBaldursGate_Blade&Stars_L1_BCS" "AR7205" + OUTER_SPRINT "SEBaldursGate_Blade&Stars_L2_BCS" "AR7206" + OUTER_SPRINT "SEBaldursGate_Blade&Stars_L3_BCS" "AR7207" + OUTER_SPRINT "NBaldursGate_DucalPalace_L1_BCS" "AR7208" + OUTER_SPRINT "NBaldursGate_DucalPalace_L2_BCS" "AR7209" + OUTER_SPRINT "NBaldursGate_DucalPalace_L3_BCS" "AR7210" + OUTER_SPRINT "NBaldursGate_DucalPalace_Cellar_BCS" "AR7211" + OUTER_SPRINT "BaldursGate_Undercellars_BCS" "AR7212" + OUTER_SPRINT "NEBaldursGate_BlushingMermaid_L1_BCS" "AR7214" + OUTER_SPRINT "NEBaldursGate_BlushingMermaid_L2_BCS" "AR7215" + OUTER_SPRINT "NWBaldursGate_Helm&Cloak_L1_BCS" "AR7216" + OUTER_SPRINT "NWBaldursGate_Helm&Cloak_L2_BCS" "AR7217" + OUTER_SPRINT "NWBaldursGate_Helm&Cloak_L3_BCS" "AR7218" + OUTER_SPRINT "NBaldursGate_ThreeOldKegs_L1_BCS" "AR7219" + OUTER_SPRINT "NBaldursGate_ThreeOldKegs_L2_BCS" "AR7220" + OUTER_SPRINT "NBaldursGate_ThreeOldKegs_L3_BCS" "AR7221" + OUTER_SPRINT "Undercity_BCS" "AR7223" + OUTER_SPRINT "Undercity_TempleofBhaal_BCS" "AR7225" + OUTER_SPRINT "WBaldursGate_RagefastsHouse_BCS" "AR7226" + OUTER_SPRINT "SWBaldursGate_MerchantLeague_L1_BCS" "AR7227" + OUTER_SPRINT "SWBaldursGate_MerchantLeague_L2_BCS" "AR7228" + OUTER_SPRINT "SWBaldursGate_MerchantLeague_L3_BCS" "AR7229" + OUTER_SPRINT "WBaldursGate_HallofWonders_BCS" "AR7230" + OUTER_SPRINT "WBaldursGate_HighHouseofWonders_BCS" "AR7231" + OUTER_SPRINT "WBaldursGate_LadysHouse_BCS" "AR7232" + OUTER_SPRINT "BaldursGate_DocksLowLantern_D1_BCS" "AR7233" + OUTER_SPRINT "BaldursGate_DocksLowLantern_D2_BCS" "AR7234" + OUTER_SPRINT "BaldursGate_DocksLowLantern_D3_BCS" "AR7235" + OUTER_SPRINT "BaldursGate_DocksLowLantern_D4_BCS" "AR7236" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L1_BCS" "AR7237" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L6_BCS" "AR7238" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L2_BCS" "AR7239" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L3_BCS" "AR7240" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L4_BCS" "AR7241" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L5_BCS" "AR7242" + OUTER_SPRINT "CentralBaldursGate_OberonsEstate_L1_BCS" "AR7243" + OUTER_SPRINT "CentralBaldursGate_OberonsEstate_L2_BCS" "AR7244" + OUTER_SPRINT "CentralBaldursGate_OberonsEstate_L3_BCS" "AR7245" + OUTER_SPRINT "ThievesMaze_BCS" "AR7246" + OUTER_SPRINT "EBaldursGate_House5_BCS" "AR7248" + OUTER_SPRINT "NEBaldursGate_IlmatersShrine_BCS" "AR7249" + OUTER_SPRINT "EBaldursGate_House2_BCS" "AR7250" + OUTER_SPRINT "EBaldursGate_House3_BCS" "AR7251" + OUTER_SPRINT "EBaldursGate_House4_BCS" "AR7252" + OUTER_SPRINT "EBaldursGate_ThievesGuild_BCS" "AR7253" + OUTER_SPRINT "EBaldursGate_KeexieTavern_L1_BCS" "AR7254" + OUTER_SPRINT "NWBaldursGate_House3_L1_BCS" "AR7255" + OUTER_SPRINT "NWBaldursGate_House3_L2_BCS" "AR7256" + OUTER_SPRINT "NWBaldursGate_QuinnsHouse_L1_BCS" "AR7257" + OUTER_SPRINT "NWBaldursGate_QuinnsHouse_L2_BCS" "AR7258" + OUTER_SPRINT "NWBaldursGate_House1_L1_BCS" "AR7259" + OUTER_SPRINT "NWBaldursGate_House1_L2_BCS" "AR7260" + OUTER_SPRINT "NWBaldursGate_DegrodelsHouse_BCS" "AR7261" + OUTER_SPRINT "NWBaldursGate_LaertasHouse_L1_BCS" "AR7262" + OUTER_SPRINT "NWBaldursGate_House2_L1_BCS" "AR7263" + OUTER_SPRINT "NWBaldursGate_House2_L2_BCS" "AR7264" + OUTER_SPRINT "NWBaldursGate_Tavern_L1_BCS" "AR7265" + OUTER_SPRINT "NWBaldursGate_Tavern_L2_BCS" "AR7266" + OUTER_SPRINT "NWBaldursGate_PheirkasHouse_L1_BCS" "AR7267" + OUTER_SPRINT "NWBaldursGate_PheirkasHouse_L2_BCS" "AR7268" + OUTER_SPRINT "NWBaldursGate_House4_L1_BCS" "AR7269" + OUTER_SPRINT "NWBaldursGate_House4_L2_BCS" "AR7270" + OUTER_SPRINT "EBaldursGate_KeexieTavern_L2_BCS" "AR7271" + OUTER_SPRINT "NBaldursGate_BCS" "AR7300" + OUTER_SPRINT "WSewers_BCS" "AR7324" + OUTER_SPRINT "CentralSewers_BCS" "AR7325" + OUTER_SPRINT "ESewers_BCS" "AR7326" + OUTER_SPRINT "NEBaldursGate_BCS" "AR7400" + OUTER_SPRINT "NEBaldursGate_House2_L1_BCS" "AR7402" + OUTER_SPRINT "NEBaldursGate_House2_L2_BCS" "AR7403" + OUTER_SPRINT "NEBaldursGate_Store_BCS" "AR7404" + OUTER_SPRINT "NEBaldursGate_House1_L1_BCS" "AR7405" + OUTER_SPRINT "NEBaldursGate_House1_L2_BCS" "AR7406" + OUTER_SPRINT "NEBaldursGate_CountingHouse_L1_BCS" "AR7407" + OUTER_SPRINT "NEBaldursGate_CountingHouse_L2_BCS" "AR7408" + OUTER_SPRINT "WBaldursGate_BCS" "AR7600" + OUTER_SPRINT "SWBaldursGate_SevenSuns_L1_BCS" "AR7601" + OUTER_SPRINT "SWBaldursGate_SevenSuns_L2_BCS" "AR7602" + OUTER_SPRINT "SWBaldursGate_SevenSuns_Cellar_BCS" "AR7603" + OUTER_SPRINT "SWBaldursGate_FlamingFistHQ_Cellar_BCS" "AR7606" + OUTER_SPRINT "SWBaldursGate_FlamingFistHQ_L1_BCS" "AR7607" + OUTER_SPRINT "SWBaldursGate_FlamingFistHQ_L2_BCS" "AR7608" + OUTER_SPRINT "BaldursGateDocks_WaterQueensHouse_BCS" "AR7609" + OUTER_SPRINT "BaldursGateDocks_IronThrone_Cellar_BCS" "AR7611" + OUTER_SPRINT "BaldursGateDocks_IronThrone_L2_BCS" "AR7612" + OUTER_SPRINT "BaldursGateDocks_IronThrone_L3_BCS" "AR7613" + OUTER_SPRINT "BaldursGateDocks_IronThrone_L4_BCS" "AR7614" + OUTER_SPRINT "BaldursGateDocks_IronThrone_L5_BCS" "AR7615" + OUTER_SPRINT "BaldursGateDocks_IronThrone_L1_BCS" "AR7616" + OUTER_SPRINT "WBaldursGate_TremainsHouse_L1_BCS" "AR7617" + OUTER_SPRINT "WBaldursGate_TremainsHouse_L2_BCS" "AR7618" + OUTER_SPRINT "WBaldursGate_FentensHouse_L1_BCS" "AR7619" + OUTER_SPRINT "WBaldursGate_FentensHouse_L2_BCS" "AR7620" + OUTER_SPRINT "BaldursGateDocks_IronThroneRoof_BCS" "AR7621" + OUTER_SPRINT "CentralBaldursGate_BCS" "AR7700" + OUTER_SPRINT "BaldursGateDocks_Harbormaster_BCS" "AR7702" + OUTER_SPRINT "EBaldursGate_SorcerousSundries_L1_BCS" "AR7703" + OUTER_SPRINT "EBaldursGate_SorcerousSundries_L2_BCS" "AR7704" + OUTER_SPRINT "EBaldursGate_ElfsongTavern_L1_BCS" "AR7705" + OUTER_SPRINT "EBaldursGate_ElfsongTavern_L2_BCS" "AR7706" + OUTER_SPRINT "CentralBaldursGate_House3_L1_BCS" "AR7707" + OUTER_SPRINT "CentralBaldursGate_House3_L2_BCS" "AR7708" + OUTER_SPRINT "CentralBaldursGate_House2_L1_BCS" "AR7709" + OUTER_SPRINT "CentralBaldursGate_House2_L2_BCS" "AR7710" + OUTER_SPRINT "CentralBaldursGate_House1_L1_BCS" "AR7711" + OUTER_SPRINT "CentralBaldursGate_House1_L2_BCS" "AR7712" + OUTER_SPRINT "CentralBaldursGate_House5_L1_BCS" "AR7713" + OUTER_SPRINT "CentralBaldursGate_House5_L2_BCS" "AR7714" + OUTER_SPRINT "CentralBaldursGate_NadinesHouse_L1_BCS" "AR7715" + OUTER_SPRINT "CentralBaldursGate_NadinesHouse_L2_BCS" "AR7716" + OUTER_SPRINT "CentralBaldursGate_House6_L1_BCS" "AR7717" + OUTER_SPRINT "CentralBaldursGate_House6_L2_BCS" "AR7718" + OUTER_SPRINT "CentralBaldursGate_FeloniusManor_BCS" "AR7719" + OUTER_SPRINT "CentralBaldursGate_DrakonTavern_BCS" "AR7720" + OUTER_SPRINT "CentralBaldursGate_PoultryStore_BCS" "AR7721" + OUTER_SPRINT "CentralBaldursGate_House4_L1_BCS" "AR7722" + OUTER_SPRINT "CentralBaldursGate_House4_L2_BCS" "AR7723" + OUTER_SPRINT "CentralBaldursGate_GamblingTent1_BCS" "AR7724" + OUTER_SPRINT "CentralBaldursGate_GamblingTent2_BCS" "AR7725" + OUTER_SPRINT "CentralBaldursGate_DivinersTent_BCS" "AR7726" + OUTER_SPRINT "EBaldursGate_BCS" "AR7800" + OUTER_SPRINT "EBaldursGate_House6_L1_BCS" "AR7801" + OUTER_SPRINT "EBaldursGate_House6_L2_BCS" "AR7802" + OUTER_SPRINT "EBaldursGate_MaltzWeaponShop_L1_BCS" "AR7803" + OUTER_SPRINT "EBaldursGate_MaltzWeaponShop_L2_BCS" "AR7804" + OUTER_SPRINT "EBaldursGate_ArkionsHouse_L1_BCS" "AR7805" + OUTER_SPRINT "EBaldursGate_ArkionsHouse_L2_BCS" "AR7806" + OUTER_SPRINT "EBaldursGate_Inn_L1_BCS" "AR7807" + OUTER_SPRINT "EBaldursGate_Inn_L2_BCS" "AR7808" + OUTER_SPRINT "EBaldursGate_SilencesShop_BCS" "AR7809" + OUTER_SPRINT "EBaldursGate_LuckyAellos_BCS" "AR7810" + OUTER_SPRINT "EBaldursGate_House1_L1_BCS" "AR7811" + OUTER_SPRINT "EBaldursGate_House1_L2_BCS" "AR7812" + OUTER_SPRINT "SEBaldursGate_NemphresHouse_L1_BCS" "AR7813" + OUTER_SPRINT "SEBaldursGate_NemphresHouse_L2_BCS" "AR7814" + OUTER_SPRINT "WyrmsCrossing_BCS" "AR7900" + OUTER_SPRINT "WyrmsCrossingTenyasHouse_BCS" "AR7901" + OUTER_SPRINT "SWBaldursGate_BCS" "AR8000" + OUTER_SPRINT "SWBaldursGate_WivensHouse_L1_BCS" "AR8001" + OUTER_SPRINT "SWBaldursGate_WivensHouse_L2_BCS" "AR8002" + OUTER_SPRINT "SWBaldursGate_House3_L1_BCS" "AR8003" + OUTER_SPRINT "SWBaldursGate_House3_L2_BCS" "AR8004" + OUTER_SPRINT "SWBaldursGate_House1_L1_BCS" "AR8005" + OUTER_SPRINT "SWBaldursGate_House1_L2_BCS" "AR8006" + OUTER_SPRINT "SWBaldursGate_House2_L1_BCS" "AR8007" + OUTER_SPRINT "SWBaldursGate_House2_L2_BCS" "AR8008" + OUTER_SPRINT "SWBaldursGate_Tavern_L1_BCS" "AR8009" + OUTER_SPRINT "SWBaldursGate_Tavern_L2_BCS" "AR8010" + OUTER_SPRINT "SWBaldursGate_SuninsHouse_BCS" "AR8011" + OUTER_SPRINT "SWBaldursGate_WeaponsStore1_BCS" "AR8012" + OUTER_SPRINT "SWBaldursGate_YeOldeInn_L1_BCS" "AR8013" + OUTER_SPRINT "SWBaldursGate_YeOldeInn_L2_BCS" "AR8014" + OUTER_SPRINT "SWBaldursGate_PotionsStore2_BCS" "AR8015" + OUTER_SPRINT "SWBaldursGate_WeaponsStore2_BCS" "AR8016" + OUTER_SPRINT "SWBaldursGate_PotionsStore1_BCS" "AR8017" + OUTER_SPRINT "BaldursGateDocks_BCS" "AR8100" + OUTER_SPRINT "BaldursGateDocks_OgreMagiHouse_L1_BCS" "AR8101" + OUTER_SPRINT "BaldursGateDocks_OgreMagiHouse_L2_BCS" "AR8102" + OUTER_SPRINT "BaldursGateDocks_House2_L1_BCS" "AR8103" + OUTER_SPRINT "BaldursGateDocks_House2_L2_BCS" "AR8104" + OUTER_SPRINT "BaldursGateDocks_House1_L1_BCS" "AR8105" + OUTER_SPRINT "BaldursGateDocks_House1_L2_BCS" "AR8106" + OUTER_SPRINT "BaldursGateDocks_BasiliskWarehouse_BCS" "AR8107" + OUTER_SPRINT "BaldursGateDocks_NoraleesWarehouse_BCS" "AR8108" + OUTER_SPRINT "BaldursGateDocks_LarriazHouse_L1_BCS" "AR8109" + OUTER_SPRINT "BaldursGateDocks_LarriazHouse_L2_BCS" "AR8110" + OUTER_SPRINT "BaldursGateDocks_GhoraksHouse_L1_BCS" "AR8111" + OUTER_SPRINT "BaldursGateDocks_GhoraksHouse_L2_BCS" "AR8112" + OUTER_SPRINT "BaldursGateDocks_CordyrsHouse_L1_BCS" "AR8113" + OUTER_SPRINT "BaldursGateDocks_CordyrsHouse_L2_BCS" "AR8114" + OUTER_SPRINT "BaldursGateDocks_JopalinsTavern_BCS" "AR8115" + OUTER_SPRINT "SEBaldursGate_BCS" "AR8200" + OUTER_SPRINT "SEBaldursGate_Warehouse_BCS" "AR8201" + OUTER_SPRINT "SEBaldursGate_GeneralStore2_BCS" "AR8202" + OUTER_SPRINT "SEBaldursGate_NadarinsWarehouse_BCS" "AR8203" + OUTER_SPRINT "SEBaldursGate_House3_L1_BCS" "AR8204" + OUTER_SPRINT "SEBaldursGate_House3_L2_BCS" "AR8205" + OUTER_SPRINT "SEBaldursGate_Inn_L1_BCS" "AR8206" + OUTER_SPRINT "SEBaldursGate_Inn_L2_BCS" "AR8207" + OUTER_SPRINT "SEBaldursGate_House4_L1_BCS" "AR8208" + OUTER_SPRINT "SEBaldursGate_House4_L2_BCS" "AR8209" + OUTER_SPRINT "SEBaldursGate_House2_L1_BCS" "AR8210" + OUTER_SPRINT "SEBaldursGate_House2_L2_BCS" "AR8211" + OUTER_SPRINT "SEBaldursGate_GantolandansHouse_L1_BCS" "AR8212" + OUTER_SPRINT "SEBaldursGate_GantolandansHouse_L2_BCS" "AR8213" + OUTER_SPRINT "SEBaldursGate_House1_L1_BCS" "AR8214" + OUTER_SPRINT "SEBaldursGate_House1_L2_BCS" "AR8215" + OUTER_SPRINT "SEBaldursGate_TaxeksHouse_L1_BCS" "AR8216" + OUTER_SPRINT "SEBaldursGate_TaxeksHouse_L2_BCS" "AR8217" + OUTER_SPRINT "SEBaldursGate_GeneralStore1_BCS" "AR8220" + OUTER_SPRINT "FishingVillage_BCS" "AR8300" + OUTER_SPRINT "FishingVillage_AnkhegPit_BCS" "AR8301" + OUTER_SPRINT "FishingVillage_House1_BCS" "AR8302" + OUTER_SPRINT "FishingVillage_House2_BCS" "AR8303" + OUTER_SPRINT "FishingVillage_FarmerBrunsHouse_BCS" "AR8304" + OUTER_SPRINT "CloakwoodDruids_BCS" "AR8400" + OUTER_SPRINT "CloakwoodDruids_Treehouse_L1_BCS" "AR8401" + OUTER_SPRINT "CloakwoodDruids_Treehouse_L2_BCS" "AR8402" + OUTER_SPRINT "CloakwoodDruids_PetersCave_BCS" "AR8403" + OUTER_SPRINT "CloakwoodWyverns_BCS" "AR8500" + OUTER_SPRINT "CloakwoodMines_BCS" "AR8600" + OUTER_SPRINT "CloakwoodMines_L1_BCS" "AR8601" + OUTER_SPRINT "CloakwoodMines_L3_BCS" "AR8602" + OUTER_SPRINT "CloakwoodMines_L4_BCS" "AR8603" + OUTER_SPRINT "CloakwoodMines_L2_BCS" "AR8604" + OUTER_SPRINT "CloakwoodMines_Barracks_L1_BCS" "AR8605" + OUTER_SPRINT "CloakwoodMines_Barracks_L2_BCS" "AR8606" + OUTER_SPRINT "CloakwoodMines_MineLift_BCS" "AR8607" + OUTER_SPRINT "CloakwoodMines_Storehouse_BCS" "AR8608" + OUTER_SPRINT "CloakwoodMines_MineShed_BCS" "AR8609" + OUTER_SPRINT "BanditCamp_BCS" "AR8700" + OUTER_SPRINT "BanditCamp_RaemonsTent_BCS" "AR8701" + OUTER_SPRINT "BanditCamp_Tent2_BCS" "AR8702" + OUTER_SPRINT "BanditCamp_GnollCave_BCS" "AR8703" + OUTER_SPRINT "BanditCamp_TersusTent_BCS" "AR8704" + OUTER_SPRINT "BanditCamp_Tent1_BCS" "AR8705" + OUTER_SPRINT "BanditCamp_Tent3_BCS" "AR8706" + OUTER_SPRINT "BanditCamp_Tent4_BCS" "AR8707" + OUTER_SPRINT "CloakwoodNest_BCS" "AR8800" + OUTER_SPRINT "CloakwoodNestSpiderNest_BCS" "AR8801" + OUTER_SPRINT "CloakwoodLodge_BCS" "AR7000" + OUTER_SPRINT "CloakwoodLodgeHuntingLodge_BCS" "AR7015" + OUTER_SPRINT "FriendlyArmInn_BCS" "AR6800" + OUTER_SPRINT "FriendlyArmInn_L1_BCS" "AR6801" + OUTER_SPRINT "FriendlyArmInn_L2_BCS" "AR6802" + OUTER_SPRINT "FriendlyArmInn_L3_BCS" "AR6803" + OUTER_SPRINT "FriendlyArmInn_TempleofWisdom_BCS" "AR6804" + OUTER_SPRINT "FriendlyArmInn_House_BCS" "AR6805" + OUTER_SPRINT "FriendlyArmInn_JoiasHouse_BCS" "AR6806" + OUTER_SPRINT "Peldvale_BCS" "AR8900" + OUTER_SPRINT "Candlekeep_BCS" "AR0015" + OUTER_SPRINT "Candlekeep_PriestsQuarters_BCS" "AR6502" + OUTER_SPRINT "Candlekeep_Infirmary_BCS" "AR6505" + OUTER_SPRINT "Candlekeep_Storehouse_BCS" "AR6506" + OUTER_SPRINT "Candlekeep_Bunkhouse_BCS" "AR6507" + OUTER_SPRINT "Candlekeep_Library_L1_BCS" "AR6508" + OUTER_SPRINT "Candlekeep_Library_L2_BCS" "AR6509" + OUTER_SPRINT "Candlekeep_Library_L3_BCS" "AR6510" + OUTER_SPRINT "Candlekeep_Library_L4_BCS" "AR6511" + OUTER_SPRINT "Candlekeep_Library_L5_BCS" "AR6512" + OUTER_SPRINT "Candlekeep_Catacombs_L1Antechamber_BCS" "AR6513" + OUTER_SPRINT "Candlekeep_Library_L6_BCS" "AR6514" + OUTER_SPRINT "Candlekeep_Catacombs_L1_BCS" "AR6515" + OUTER_SPRINT "Candlekeep_Inn_L1_BCS" "AR6516" + OUTER_SPRINT "Candlekeep_Inn_L2_BCS" "AR6517" + OUTER_SPRINT "Candlekeep_Barracks_BCS" "AR6518" + OUTER_SPRINT "Candlekeep_Catacombs_L2_BCS" "AR6519" + OUTER_SPRINT "Candlekeep_Ch6_BCS" "AR6526" + OUTER_SPRINT "Candlekeep_Ch6_PriestsQuarters_BCS" "AR6527" + OUTER_SPRINT "Candlekeep_Ch6_Storehouse_BCS" "AR6528" + OUTER_SPRINT "Candlekeep_Ch6_Inn_L1_BCS" "AR6529" + OUTER_SPRINT "Candlekeep_Ch6_Inn_L2_BCS" "AR6530" + OUTER_SPRINT "Candlekeep_Ch6_Barracks_BCS" "AR6531" + OUTER_SPRINT "Candlekeep_Ch6_Bunkhouse_BCS" "AR6532" + OUTER_SPRINT "Candlekeep_Ch6_Infirmary_BCS" "AR6533" + OUTER_SPRINT "Candlekeep_ObesCellar_BCS" "AR6543" + OUTER_SPRINT "LionsWay_BCS" "AR6600" + OUTER_SPRINT "CoastWay_BCS" "AR6900" + OUTER_SPRINT "Larswood_BCS" "AR9000" + OUTER_SPRINT "SpiderWood_BCS" "AR9100" + OUTER_SPRINT "ShipwrecksCoast_BCS" "AR9200" + OUTER_SPRINT "HighHedge_BCS" "AR7100" + OUTER_SPRINT "HighHedge_House_BCS" "AR7101" + OUTER_SPRINT "HighHedge_ThalanthyrsAbode_BCS" "AR7102" + OUTER_SPRINT "Beregost_BCS" "AR6700" + OUTER_SPRINT "Beregost_ThunderhammerSmithy_BCS" "AR6701" + OUTER_SPRINT "Beregost_House19_BCS" "AR6702" + OUTER_SPRINT "Beregost_RedSheaf_L2_BCS" "AR6703" + OUTER_SPRINT "Beregost_JovialJuggler_L1_BCS" "AR6704" + OUTER_SPRINT "Beregost_JovialJuggler_L2F_BCS" "AR6705" + OUTER_SPRINT "Beregost_JovialJuggler_L2R_BCS" "AR6706" + OUTER_SPRINT "Beregost_BurningWizard_L1_BCS" "AR6707" + OUTER_SPRINT "Beregost_BurningWizard_L2_BCS" "AR6708" + OUTER_SPRINT "Beregost_House13_L1_BCS" "AR6709" + OUTER_SPRINT "Beregost_House13_L2_BCS" "AR6710" + OUTER_SPRINT "Beregost_House12_L1_BCS" "AR6711" + OUTER_SPRINT "Beregost_House12_L2_BCS" "AR6712" + OUTER_SPRINT "Beregost_MiriannesHouse_L1_BCS" "AR6713" + OUTER_SPRINT "Beregost_MiriannesHouse_L2_BCS" "AR6714" + OUTER_SPRINT "Beregost_LandrinsHouse_BCS" "AR6715" + OUTER_SPRINT "Beregost_House18_BCS" "AR6716" + OUTER_SPRINT "Beregost_House17_BCS" "AR6717" + OUTER_SPRINT "Beregost_House15_BCS" "AR6718" + OUTER_SPRINT "Beregost_House16_BCS" "AR6719" + OUTER_SPRINT "Beregost_TravenhurstManor_L1_BCS" "AR6720" + OUTER_SPRINT "Beregost_TravenhurstManor_L2_BCS" "AR6721" + OUTER_SPRINT "Beregost_ServantsQuarters_BCS" "AR6722" + OUTER_SPRINT "Beregost_House20_L1_BCS" "AR6723" + OUTER_SPRINT "Beregost_House20_L2_BCS" "AR6724" + OUTER_SPRINT "Beregost_House23_L1_BCS" "AR6725" + OUTER_SPRINT "Beregost_House23_L2_BCS" "AR6726" + OUTER_SPRINT "Beregost_House14_L1_BCS" "AR6727" + OUTER_SPRINT "Beregost_House14_L2_BCS" "AR6728" + OUTER_SPRINT "Beregost_House21_L1_BCS" "AR6729" + OUTER_SPRINT "Beregost_House21_L2_BCS" "AR6730" + OUTER_SPRINT "Beregost_House11_L1_BCS" "AR6731" + OUTER_SPRINT "Beregost_House11_L2_BCS" "AR6732" + OUTER_SPRINT "Beregost_FirebeadsHouse_L1_BCS" "AR6733" + OUTER_SPRINT "Beregost_FirebeadsHouse_L2_BCS" "AR6734" + OUTER_SPRINT "Beregost_House10_L1_BCS" "AR6735" + OUTER_SPRINT "Beregost_House10_L2_BCS" "AR6736" + OUTER_SPRINT "Beregost_House22_L1_BCS" "AR6737" + OUTER_SPRINT "Beregost_House22_L2_BCS" "AR6738" + OUTER_SPRINT "Beregost_House01_L1_BCS" "AR6739" + OUTER_SPRINT "Beregost_House01_L2_BCS" "AR6740" + OUTER_SPRINT "Beregost_House02_L1_BCS" "AR6741" + OUTER_SPRINT "Beregost_House02_L2_BCS" "AR6742" + OUTER_SPRINT "Beregost_House03_BCS" "AR6743" + OUTER_SPRINT "Beregost_House07_BCS" "AR6744" + OUTER_SPRINT "Beregost_House04_L1_BCS" "AR6745" + OUTER_SPRINT "Beregost_House04_L2_BCS" "AR6746" + OUTER_SPRINT "Beregost_House05_L1_BCS" "AR6747" + OUTER_SPRINT "Beregost_House05_L2_BCS" "AR6748" + OUTER_SPRINT "Beregost_House06_L1_BCS" "AR6749" + OUTER_SPRINT "Beregost_House06_L2_BCS" "AR6750" + OUTER_SPRINT "Beregost_FeldepostsInn_L1_BCS" "AR6751" + OUTER_SPRINT "Beregost_FeldepostsInn_L2_BCS" "AR6752" + OUTER_SPRINT "Beregost_KagainsStore_BCS" "AR6753" + OUTER_SPRINT "Beregost_House09_BCS" "AR6754" + OUTER_SPRINT "Beregost_House08_BCS" "AR6755" + OUTER_SPRINT "Beregost_House08_L2_BCS" "AR6756" + OUTER_SPRINT "Beregost_RedSheaf_L1_BCS" "AR6757" + OUTER_SPRINT "Temple_BCS" "AR9300" + OUTER_SPRINT "Temple_Vestibule_BCS" "AR9301" + OUTER_SPRINT "Temple_SongoftheMorning_BCS" "AR9302" + OUTER_SPRINT "MutaminsGarden_BCS" "AR9400" + OUTER_SPRINT "Lighthouse_BCS" "AR9500" + OUTER_SPRINT "Lighthouse_BlackAlaricsCave_BCS" "AR9501" + OUTER_SPRINT "RedCanyons_BCS" "AR9600" + OUTER_SPRINT "SouthBeregostRoad_BCS" "AR9700" + OUTER_SPRINT "SouthBeregostRoad_Cave_BCS" "AR9702" + OUTER_SPRINT "Ulcaster_BCS" "AR9799" + OUTER_SPRINT "UlcasterRuins_BCS" "AR9798" + OUTER_SPRINT "Gullykin_BCS" "AR9900" + OUTER_SPRINT "Gullykin_JenkalsHouse_L1_BCS" "AR9901" + OUTER_SPRINT "Gullykin_JenkalsHouse_Cellar_BCS" "AR9902" + OUTER_SPRINT "Gullykin_Winery_L1_BCS" "AR9903" + OUTER_SPRINT "Gullykin_Winery_Cellar_BCS" "AR9904" + OUTER_SPRINT "Gullykin_House1_L1_BCS" "AR9905" + OUTER_SPRINT "Gullykin_House1_Cellar_BCS" "AR9906" + OUTER_SPRINT "Gullykin_House3_L1_BCS" "AR9907" + OUTER_SPRINT "Gullykin_House3_Cellar_BCS" "AR9908" + OUTER_SPRINT "Gullykin_House4_L1_BCS" "AR9909" + OUTER_SPRINT "Gullykin_House4_Cellar_BCS" "AR9910" + OUTER_SPRINT "Gullykin_House5_L1_BCS" "AR9911" + OUTER_SPRINT "Gullykin_House5_Cellar_BCS" "AR9912" + OUTER_SPRINT "Gullykin_House2_L1_BCS" "AR9913" + OUTER_SPRINT "Gullykin_House2_Cellar_BCS" "AR9914" + OUTER_SPRINT "ArchaeologicalSite_BCS" "ARA100" + OUTER_SPRINT "ArchaeologicalSite_Tomb_BCS" "ARA101" + OUTER_SPRINT "FishermansLake_BCS" "AR3100" + OUTER_SPRINT "NorthNashkelRoad_BCS" "AR3200" + OUTER_SPRINT "LonelyPeaks_BCS" "AR3300" + OUTER_SPRINT "LonelyPeaks_Cave_BCS" "AR3301" + OUTER_SPRINT "FirewineBridge_BCS" "AR3400" + OUTER_SPRINT "CloakwoodWyverns_WyvernCave_BCS" "AR8501" + OUTER_SPRINT "BearRiver_BCS" "AR3499" + OUTER_SPRINT "XvartVillage_BCS" "AR3498" + OUTER_SPRINT "XvartVillage_Cave_BCS" "AR3497" + OUTER_SPRINT "Nashkel_BCS" "AR3700" + OUTER_SPRINT "Nashkel_Inn_BCS" "AR3701" + OUTER_SPRINT "Nashkel_TempleofHelm_BCS" "AR3702" + OUTER_SPRINT "Nashkel_Store_BCS" "AR3703" + OUTER_SPRINT "Nashkel_ManorHouse_L1_BCS" "AR3704" + OUTER_SPRINT "Nashkel_ManorHouse_L2_BCS" "AR3705" + OUTER_SPRINT "Nashkel_JosephsHouse_BCS" "AR3706" + OUTER_SPRINT "Nashkel_House1_BCS" "AR3707" + OUTER_SPRINT "Nashkel_House2_BCS" "AR3708" + OUTER_SPRINT "Nashkel_BelchingDragonTavern_BCS" "AR3709" + OUTER_SPRINT "Nashkel_Garrison_BCS" "AR3710" + OUTER_SPRINT "NashkelCarnival_BCS" "AR3800" + OUTER_SPRINT "NashkelCarnival_ArmorTent_BCS" "AR3801" + OUTER_SPRINT "NashkelCarnival_LotusTent_BCS" "AR3802" + OUTER_SPRINT "NashkelCarnival_VitiaresTent_BCS" "AR3803" + OUTER_SPRINT "NashkelCarnival_GamblingTent_BCS" "AR3804" + OUTER_SPRINT "NashkelCarnival_PotionTent_BCS" "AR3805" + OUTER_SPRINT "NashkelCarnival_ZordralsTent_BCS" "AR3806" + OUTER_SPRINT "NashkelCarnival_MagicItemsTent_BCS" "AR3807" + OUTER_SPRINT "NashkelCarnival_MeleeWeaponsTent_BCS" "AR3808" + OUTER_SPRINT "NashkelCarnival_RangedWeaponsTent_BCS" "AR3809" + OUTER_SPRINT "ValleyoftheTombs_BCS" "AR3900" + OUTER_SPRINT "ValleyoftheTombs_Tomb_BCS" "AR3901" + OUTER_SPRINT "GnollStronghold_BCS" "AR4100" + OUTER_SPRINT "GnollStronghold_XvartCave_BCS" "AR4101" + OUTER_SPRINT "GnollStronghold_TomeCave_BCS" "AR4102" + OUTER_SPRINT "GnollStronghold_CrawlerCave_BCS" "AR4103" + OUTER_SPRINT "DryadFalls_BCS" "AR4200" + OUTER_SPRINT "FirewineRuins_BCS" "AR3401" + OUTER_SPRINT "DryadFalls_Cave_BCS" "AR4199" + OUTER_SPRINT "FireLeafForest_BCS" "AR4300" + OUTER_SPRINT "NashkelMines_BCS" "AR4400" + OUTER_SPRINT "NashkelMines_L1_BCS" "AR4401" + OUTER_SPRINT "NashkelMines_L2_BCS" "AR4402" + OUTER_SPRINT "NashkelMines_L3_BCS" "AR4403" + OUTER_SPRINT "NashkelMines_L4_BCS" "AR4404" + OUTER_SPRINT "NashkelMines_MulaheysCave_BCS" "AR4405" + OUTER_SPRINT "NashkelMines_Cabin_BCS" "AR4406" + OUTER_SPRINT "GibberlingMountains_BCS" "AR4600" + OUTER_SPRINT "CandlekeepCaves_BCS" "AR6560" + OUTER_SPRINT "Encounter_Plains1_BCS" "AR4700" + OUTER_SPRINT "Encounter_Plains2_BCS" "AR4701" + OUTER_SPRINT "Encounter_Canyon1_BCS" "AR4800" + OUTER_SPRINT "Encounter_Canyon2_BCS" "AR4801" + OUTER_SPRINT "Encounter_Cliff1_BCS" "AR4900" + OUTER_SPRINT "Encounter_Cliff2_BCS" "AR4901" + OUTER_SPRINT "Encounter_Grassland1_BCS" "AR5100" + OUTER_SPRINT "Encounter_Grassland2_BCS" "AR5101" + OUTER_SPRINT "Encounter_Forest1_BCS" "AR5300" + OUTER_SPRINT "Encounter_Forest2_BCS" "AR5301" + OUTER_SPRINT "Encounter_Road_BCS" "AR5400" + + /* TOTSC Areas scripts */ + OUTER_SPRINT "Farmlands_BCS" "AR7500" + OUTER_SPRINT "FarmlandsFarmhouse_BCS" "AR7501" + OUTER_SPRINT "DurlagsTower_BCS" "ARD000" + OUTER_SPRINT "DurlagsTower_Cellar_BCS" "ARD001" + OUTER_SPRINT "DurlagsTower_L1_BCS" "ARD002" + OUTER_SPRINT "DurlagsTower_L2_BCS" "ARD003" + OUTER_SPRINT "DurlagsTower_L3_BCS" "ARD004" + OUTER_SPRINT "DurlagsTower_L4_BCS" "ARD005" + OUTER_SPRINT "DurlagsTower_Chessboard_BCS" "ARD006" + OUTER_SPRINT "DurlagsTower_IceChamber_BCS" "ARD007" + OUTER_SPRINT "DurlagsTower_FireChamber_BCS" "ARD008" + OUTER_SPRINT "DurlagsTower_AirChamber_BCS" "ARD009" + OUTER_SPRINT "DurlagsTower_EarthChamber_BCS" "ARD010" + OUTER_SPRINT "DurlagsTower_D1_BCS" "ARD011" + OUTER_SPRINT "DurlagsTower_D2_BCS" "ARD012" + OUTER_SPRINT "DurlagsTower_D3_BCS" "ARD013" + OUTER_SPRINT "DurlagsTower_D4_BCS" "ARD014" + OUTER_SPRINT "DurlagsTower_CompassRoom_BCS" "ARD015" + OUTER_SPRINT "DurlagsTower_DemonknightsChamber_BCS" "ARD016" + OUTER_SPRINT "IsleofBalduranN_BCS" "ARW500" + OUTER_SPRINT "IsleofBalduranNShip_D1_BCS" "ARW501" + OUTER_SPRINT "IsleofBalduranNShip_D2_BCS" "ARW502" + OUTER_SPRINT "IsleofBalduranNShip_D3_BCS" "ARW503" + OUTER_SPRINT "IsleofBalduranNShip_D4_BCS" "ARW504" + OUTER_SPRINT "IsleofBalduranNDradeelsHouse_BCS" "ARW505" + OUTER_SPRINT "IsleofBalduranS_BCS" "ARW000" + OUTER_SPRINT "IsleofBalduranS_GreatHut_BCS" "ARW001" + OUTER_SPRINT "IsleofBalduranS_KaishasHut_BCS" "ARW002" + OUTER_SPRINT "IsleofBalduranS_LargeHut3_BCS" "ARW003" + OUTER_SPRINT "IsleofBalduranS_LargeHut2_BCS" "ARW004" + OUTER_SPRINT "IsleofBalduranS_LargeHut4_BCS" "ARW005" + OUTER_SPRINT "IsleofBalduranS_LargeHut1_BCS" "ARW006" + OUTER_SPRINT "IsleofBalduranS_HarborHut_BCS" "ARW007" + OUTER_SPRINT "IsleofBalduranS_StoreHut2_BCS" "ARW008" + OUTER_SPRINT "IsleofBalduranS_StoreHut1_BCS" "ARW009" + OUTER_SPRINT "IsleofBalduranS_StoreHut4_BCS" "ARW010" + OUTER_SPRINT "IsleofBalduranS_StoreHut3_BCS" "ARW011" + OUTER_SPRINT "WerewolfCaverns_BCS" "ARW012" + OUTER_SPRINT "UlgothsBeard_BCS" "ARU000" + OUTER_SPRINT "UlgothsBeard_Inn_BCS" "ARU001" + OUTER_SPRINT "UlgothsBeard_DemonsChamber_BCS" "ARU002" + OUTER_SPRINT "UlgothsBeard_Storehouse_BCS" "ARU003" + OUTER_SPRINT "UlgothsBeard_MendasHouse_BCS" "ARU004" + OUTER_SPRINT "UlgothsBeard_TherellasHouse_BCS" "ARU005" + OUTER_SPRINT "UlgothsBeard_House2_BCS" "ARU006" + OUTER_SPRINT "UlgothsBeard_House1_BCS" "ARU007" + OUTER_SPRINT "IceIsland_BCS" "ARU008" + OUTER_SPRINT "IceIslandMaze_L1_BCS" "ARU009" + OUTER_SPRINT "IceIslandMaze_L2_BCS" "ARU010" +END diff --git a/iwdification/obg2_res/g3_tutu_cpmvars.tpa b/iwdification/obg2_res/g3_tutu_cpmvars.tpa new file mode 100644 index 0000000..b738613 --- /dev/null +++ b/iwdification/obg2_res/g3_tutu_cpmvars.tpa @@ -0,0 +1,1239 @@ +/* Declaration of Tutu Platform Variables */ +ACTION_IF GAME_IS ~tutu tutu_totsc~ THEN BEGIN + /* tp2, d, and baf parsing variables */ + OUTER_SPRINT "tutorbgt" "tutu" + OUTER_SPRINT "tutubgtbgee" "tutu" + OUTER_SPRINT "bgdreams" "DREAM" + OUTER_SPRINT "bgdream1" "2" + OUTER_SPRINT "bgdream2" "3" + OUTER_SPRINT "bgdream3" "4" + OUTER_SPRINT "bgdream4" "5" + OUTER_SPRINT "bgdream5" "6" + OUTER_SPRINT "bgdream6" "7" + OUTER_SPRINT "tutu_var" "_" + OUTER_SPRINT "tutu_scriptbg" "_"//BGT 'BG' prefix + OUTER_SPRINT "tutu_scripta" "_" + OUTER_SPRINT "tutu_scriptb" "_" + OUTER_SPRINT "tutu_scriptc" "_" + OUTER_SPRINT "tutu_scriptd" "_" + OUTER_SPRINT "tutu_scripte" "_" + OUTER_SPRINT "tutu_scriptf" "_" + OUTER_SPRINT "tutu_scriptg" "_" + OUTER_SPRINT "tutu_scripth" "_" + OUTER_SPRINT "tutu_scripti" "_" + OUTER_SPRINT "tutu_scriptj" "_" + OUTER_SPRINT "tutu_scriptk" "_" + OUTER_SPRINT "tutu_scriptl" "_" + OUTER_SPRINT "tutu_scriptm" "_" + OUTER_SPRINT "tutu_scriptn" "_" + OUTER_SPRINT "tutu_scripto" "_" + OUTER_SPRINT "tutu_scriptp" "_" + OUTER_SPRINT "tutu_scriptq" "_" + OUTER_SPRINT "tutu_scriptr" "_" + OUTER_SPRINT "tutu_scripts" "_" + OUTER_SPRINT "tutu_scriptt" "_" + OUTER_SPRINT "tutu_scriptu" "_" + OUTER_SPRINT "tutu_scriptv" "_" + OUTER_SPRINT "tutu_scriptw" "_" + OUTER_SPRINT "tutu_scriptx" "_" + OUTER_SPRINT "tutu_scripty" "_" + OUTER_SPRINT "tutu_scriptz" "_" + OUTER_SPRINT "percentage_sign" "%"//%" + + OUTER_SPRINT "tutu_imoen6" "_imoen6" + OUTER_SPRINT "tutu_viconi6" "_viconi6" + OUTER_SPRINT "tutu_skeleton_warrior" "_kelwa" + + /* EET naming convention */ + OUTER_SPRINT "eet_var" "" + + /* EET Worldmap*/ + OUTER_SET wmp_xCoord_SoA = 0 + OUTER_SET wmp_yCoord_SoA = 0 + OUTER_SET wmp_xCoord_ToB = 0 + OUTER_SET wmp_yCoord_ToB = 0 + OUTER_SET wmp_mapIcon_BG1 = 0 + OUTER_SET wmp_mapIcon_ToB = 0 + OUTER_SPRINT wmp_worldmap_ToB "worldm25" + + /* EET continuous journal/chapters system */ + OUTER_SET bg2_chapter_1 = 1 + OUTER_SET bg2_chapter_2 = 2 + OUTER_SET bg2_chapter_3 = 3 + OUTER_SET bg2_chapter_4 = 4 + OUTER_SET bg2_chapter_5 = 5 + OUTER_SET bg2_chapter_6 = 6 + OUTER_SET bg2_chapter_7 = 7 + OUTER_SET bg2_chapter_8 = 8 + OUTER_SET bg2_chapter_9 = 9 + OUTER_SET bg2_chapter_10 = 10 + + /* BGT/EET shutdown of D and BAF after BG1 content */ + OUTER_SPRINT ~BGT_VAR~ ~~ + + /* DVs are the same for Tutu/BGT, except for Imoen */ + OUTER_SPRINT "IMOEN_DV" "imoen" + + /* Items and Variables that need special handling */ + OUTER_SPRINT "KICKED_OUT" "KickedOut" + OUTER_SPRINT "tazokminhp" "TAZOKHP1" + + /* Tutu/BGT vs BGEE/EET Dialog states */ + OUTER_SET firebeadstate1 = 1 + OUTER_SET firebeadstate2 = 2 + OUTER_SET hentolstate1 = 1 + OUTER_SET housg3state0 = 0 + OUTER_SET housg3state5 = 5 + OUTER_SET xanpstate3 = 3 + OUTER_SET xanpstate4 = 4 + + //BGT Dialogues always appended, zero for Tutu + OUTER_SET BGTBEDWINState0 = 0 + OUTER_SET BGTBJAHEIState0 = 0 + OUTER_SET BGTBMINSCState0 = 0 + OUTER_SET BGTBVICONState0 = 0 + OUTER_SET BGTEDWINState0 = 0 + OUTER_SET BGTEDWINJState0 = 0 + OUTER_SET BGTEDWINPState0 = 0 + OUTER_SET BGTIMOEN2State0 = 0 + OUTER_SET BGTIMOENJState0 = 0 + OUTER_SET BGTIMOENPState0 = 0 + OUTER_SET BGTJAHEIJState0 = 0 + OUTER_SET BGTJAHEIPState0 = 0 + OUTER_SET BGTMINSCJState0 = 0 + OUTER_SET BGTMINSCPState0 = 0 + OUTER_SET BGTVICONJState0 = 0 + OUTER_SET BGTVICONPState0 = 0 + + //Never Ending Journey 2 compatibility appending, zero for Tutu + OUTER_SET BGTXANState0 = 0 + + //The Darkest Day compatibility appending, zero for Tutu + OUTER_SET BGTKAGAIPState0 = 0 + OUTER_SET BGTKIVANPState0 = 0 + OUTER_SET BGTSHARTPState0 = 0 + OUTER_SET BGTXZARPState0 = 0 + OUTER_SET BGTYESLIPState0 = 0 + + //Tortured Souls compatibility appending, zero for Tutu + OUTER_SET BGTBCORANState0 = 0 + OUTER_SET BGTCORANState0 = 0 + OUTER_SET BGTCORANJState0 = 0 + OUTER_SET BGTCORANPState0 = 0 + OUTER_SET BGTDYNAHJState0 = 0 + OUTER_SET BGTDYNAHPState0 = 0 + + /* Post Dialogue Files */ + OUTER_SPRINT "AJANTIS_POST" "_AJANTP" + OUTER_SPRINT "ALORA_POST" "_ALORAP" + OUTER_SPRINT "BRANWEN_POST" "_BRANWP" + OUTER_SPRINT "CORAN_POST" "_CORANP" + OUTER_SPRINT "DYNAHEIR_POST" "_DYNAHP" + OUTER_SPRINT "EDWIN_POST" "_EDWINP" + OUTER_SPRINT "ELDOTH_POST" "_ELDOTP" + OUTER_SPRINT "FALDORN_POST" "_FALDOP" + OUTER_SPRINT "GARRICK_POST" "_GARRIP" + OUTER_SPRINT "IMOEN_POST" "_IMOENP" + OUTER_SPRINT "JAHEIRA_POST" "_JAHEIP" + OUTER_SPRINT "KAGAIN_POST" "_KAGAIP" + OUTER_SPRINT "KHALID_POST" "_KHALIP" + OUTER_SPRINT "KIVAN_POST" "_KIVANP" + OUTER_SPRINT "MINSC_POST" "_MINSCP" + OUTER_SPRINT "MONTARON_POST" "_MONTAP" + OUTER_SPRINT "QUAYLE_POST" "_QUAYLP" + OUTER_SPRINT "SAFANA_POST" "_SAFANP" + OUTER_SPRINT "SHARTEEL_POST" "_SHARTP" + OUTER_SPRINT "SKIE_POST" "_SKIEP" + OUTER_SPRINT "TIAX_POST" "_TIAXP" + OUTER_SPRINT "VICONIA_POST" "_VICONP" + OUTER_SPRINT "XAN_POST" "_XANP" + OUTER_SPRINT "XZAR_POST" "_XZARP" + OUTER_SPRINT "YESLICK_POST" "_YESLIP" + + /* BG:EE Post Dialogue Files */ + OUTER_SPRINT "DORN_POST" "DORNP" + OUTER_SPRINT "NEERA_POST" "NEERAP" + OUTER_SPRINT "RASAAD_POST" "RASAADP" + + /* Banter Files */ + OUTER_SPRINT "AJANTIS_BANTER" "_BAJANT" + OUTER_SPRINT "ALORA_BANTER" "_BALORA" + OUTER_SPRINT "BRANWEN_BANTER" "_BBRANW" + OUTER_SPRINT "CORAN_BANTER" "_BCORAN" + OUTER_SPRINT "DYNAHEIR_BANTER" "_BDYNAH" + OUTER_SPRINT "EDWIN_BANTER" "_BEDWIN" + OUTER_SPRINT "ELDOTH_BANTER" "_BELDOT" + OUTER_SPRINT "FALDORN_BANTER" "_BFALDO" + OUTER_SPRINT "GARRICK_BANTER" "_BGARRI" + OUTER_SPRINT "IMOEN_BANTER" "_BIMOEN" + OUTER_SPRINT "JAHEIRA_BANTER" "_BJAHEI" + OUTER_SPRINT "KAGAIN_BANTER" "_BKAGAI" + OUTER_SPRINT "KHALID_BANTER" "_BKHALI" + OUTER_SPRINT "KIVAN_BANTER" "_BKIVAN" + OUTER_SPRINT "MINSC_BANTER" "_BMINSC" + OUTER_SPRINT "MONTARON_BANTER" "_BMONTA" + OUTER_SPRINT "QUAYLE_BANTER" "_BQUAYL" + OUTER_SPRINT "SAFANA_BANTER" "_BSAFAN" + OUTER_SPRINT "SHARTEEL_BANTER" "_BSHART" + OUTER_SPRINT "SKIE_BANTER" "_BSKIE" + OUTER_SPRINT "TIAX_BANTER" "_BTIAX" + OUTER_SPRINT "VICONIA_BANTER" "_BVICON" + OUTER_SPRINT "XAN_BANTER" "_BXANNN" + OUTER_SPRINT "XZAR_BANTER" "_BXZAR" + OUTER_SPRINT "YESLICK_BANTER" "_BYESLI" + + /* BG:EE Banter Files */ + OUTER_SPRINT "DORN_BANTER" "BDORN" + OUTER_SPRINT "NEERA_BANTER" "BNEERA" + OUTER_SPRINT "RASAAD_BANTER" "BRASAAD" + + /* Joined Dialogue Files */ + OUTER_SPRINT "AJANTIS_JOINED" "_AJANTJ" + OUTER_SPRINT "ALORA_JOINED" "_ALORAJ" + OUTER_SPRINT "BRANWEN_JOINED" "_BRANWJ" + OUTER_SPRINT "CORAN_JOINED" "_CORANJ" + OUTER_SPRINT "DYNAHEIR_JOINED" "_DYNAHJ" + OUTER_SPRINT "EDWIN_JOINED" "_EDWINJ" + OUTER_SPRINT "ELDOTH_JOINED" "_ELDOTJ" + OUTER_SPRINT "FALDORN_JOINED" "_FALDOJ" + OUTER_SPRINT "GARRICK_JOINED" "_GARRIJ" + OUTER_SPRINT "IMOEN_JOINED" "_IMOEN2" + OUTER_SPRINT "JAHEIRA_JOINED" "_JAHEIJ" + OUTER_SPRINT "KAGAIN_JOINED" "_KAGAIJ" + OUTER_SPRINT "KHALID_JOINED" "_KHALIJ" + OUTER_SPRINT "KIVAN_JOINED" "_KIVANJ" + OUTER_SPRINT "MINSC_JOINED" "_MINSCJ" + OUTER_SPRINT "MONTARON_JOINED" "_MONTAJ" + OUTER_SPRINT "QUAYLE_JOINED" "_QUAYLJ" + OUTER_SPRINT "SAFANA_JOINED" "_SAFANJ" + OUTER_SPRINT "SHARTEEL_JOINED" "_SHARTJ" + OUTER_SPRINT "SKIE_JOINED" "_SKIEJ" + OUTER_SPRINT "TIAX_JOINED" "_TIAXJ" + OUTER_SPRINT "VICONIA_JOINED" "_VICONJ" + OUTER_SPRINT "XAN_JOINED" "_XANJ" + OUTER_SPRINT "XZAR_JOINED" "_XZARJ" + OUTER_SPRINT "YESLICK_JOINED" "_YESLIJ" + + /* BG:EE Joined Dialogue Files */ + OUTER_SPRINT "DORN_JOINED" "DORNJ" + OUTER_SPRINT "NEERA_JOINED" "NEERAJ" + OUTER_SPRINT "RASAAD_JOINED" "RASAADJ" + + /* Chapters */ + OUTER_SPRINT "tutu_prologue" "1" + OUTER_SPRINT "tutu_prologue_reset" "0" + OUTER_SPRINT "tutu_chapter_1" "1" + OUTER_SPRINT "tutu_chapter_2" "2" + OUTER_SPRINT "tutu_chapter_3" "3" + OUTER_SPRINT "tutu_chapter_4" "4" + OUTER_SPRINT "tutu_chapter_5" "5" + OUTER_SPRINT "tutu_chapter_6" "6" + OUTER_SPRINT "tutu_chapter_7" "7" + + /* NPC override script compilation */ + OUTER_SPRINT "AJANTIS_BCS" "_AJANTIS" + OUTER_SPRINT "ALORA_BCS" "_ALORA" + OUTER_SPRINT "BRANWEN_BCS" "_BRANWE" + OUTER_SPRINT "CORAN_BCS" "_CORAN" + OUTER_SPRINT "DYNAHEIR_BCS" "_YNAHEIR" + OUTER_SPRINT "EDWIN_BCS" "_EDWIN" + OUTER_SPRINT "ELDOTH_BCS" "_ELDOTH" + OUTER_SPRINT "FALDORN_BCS" "_FALDO" + OUTER_SPRINT "GARRICK_BCS" "_GARRI" + OUTER_SPRINT "IMOEN_BCS" "_IMOEN2" + OUTER_SPRINT "JAHEIRA_BCS" "_JAHEIRA" + OUTER_SPRINT "KAGAIN_BCS" "_KAGAIN" + OUTER_SPRINT "KHALID_BCS" "_KHALID" + OUTER_SPRINT "KIVAN_BCS" "_KIVAN" + OUTER_SPRINT "MINSC_BCS" "_MINSC" + OUTER_SPRINT "MONTARON_BCS" "_ONTARON" + OUTER_SPRINT "QUAYLE_BCS" "_QUAYLE" + OUTER_SPRINT "SAFANA_BCS" "_SAFANA" + OUTER_SPRINT "SHARTEEL_BCS" "_HARTEEL" + OUTER_SPRINT "SKIE_BCS" "_SKIE" + OUTER_SPRINT "TIAX_BCS" "_TIAX" + OUTER_SPRINT "VICONIA_BCS" "_VICONIA" + OUTER_SPRINT "XAN_BCS" "_XAN" + OUTER_SPRINT "XZAR_BCS" "_XZAR" + OUTER_SPRINT "YESLICK_BCS" "_YESLICK" + + /* BG:EE NPC override script compilation */ + OUTER_SPRINT "DORN_BCS" "DORN" + OUTER_SPRINT "NEERA_BCS" "NEERA" + OUTER_SPRINT "RASAAD_BCS" "RASAAD" + + /* Areas */ + OUTER_SPRINT "NBaldursGate_TempleofHelm" "FW0002" + OUTER_SPRINT "NBaldursGate_BherensHouse_L1" "FW0004" + OUTER_SPRINT "NBaldursGate_BherensHouse_L2" "FW0005" + OUTER_SPRINT "NBaldursGate_RinniesHouse_L1" "FW0006" + OUTER_SPRINT "NBaldursGate_RinniesHouse_L2" "FW0007" + OUTER_SPRINT "NBaldursGate_House1_L1" "FW0008" + OUTER_SPRINT "NBaldursGate_House1_L2" "FW0009" + OUTER_SPRINT "NBaldursGate_JardaksHouse_L1" "FW0010" + OUTER_SPRINT "NBaldursGate_JardaksHouse_L2" "FW0011" + OUTER_SPRINT "NBaldursGate_House2_L1" "FW0012" + OUTER_SPRINT "NBaldursGate_House2_L2" "FW0013" + OUTER_SPRINT "NBaldursGate_House3_L1" "FW0014" + OUTER_SPRINT "NBaldursGate_House3_L2" "FW0015" + OUTER_SPRINT "NBaldursGate_House4_L1" "FW0016" + OUTER_SPRINT "NBaldursGate_House4_L2" "FW0017" + OUTER_SPRINT "NBaldursGate_House5_L1" "FW0018" + OUTER_SPRINT "NBaldursGate_House5_L2" "FW0019" + OUTER_SPRINT "NBaldursGate_House6_L1" "FW0020" + OUTER_SPRINT "NBaldursGate_House6_L2" "FW0021" + OUTER_SPRINT "NWBaldursGate" "FW0100" + OUTER_SPRINT "NWBaldursGate_SilvershieldEstate_L1" "FW0101" + OUTER_SPRINT "NWBaldursGate_SilvershieldEstate_L2" "FW0102" + OUTER_SPRINT "NEBaldursGate_SplurgingSturgeon_L1" "FW0103" + OUTER_SPRINT "NEBaldursGate_SplurgingSturgeon_L2" "FW0104" + OUTER_SPRINT "SEBaldursGate_Blade&Stars_L1" "FW0105" + OUTER_SPRINT "SEBaldursGate_Blade&Stars_L2" "FW0106" + OUTER_SPRINT "SEBaldursGate_Blade&Stars_L3" "FW0107" + OUTER_SPRINT "NBaldursGate_DucalPalace_L1" "FW0108" + OUTER_SPRINT "NBaldursGate_DucalPalace_L2" "FW0109" + OUTER_SPRINT "NBaldursGate_DucalPalace_L3" "FW0110" + OUTER_SPRINT "NBaldursGate_DucalPalace_Cellar" "FW0111" + OUTER_SPRINT "BaldursGate_Undercellars" "FW0112" + OUTER_SPRINT "NEBaldursGate_BlushingMermaid_L1" "FW0114" + OUTER_SPRINT "NEBaldursGate_BlushingMermaid_L2" "FW0115" + OUTER_SPRINT "NWBaldursGate_Helm&Cloak_L1" "FW0116" + OUTER_SPRINT "NWBaldursGate_Helm&Cloak_L2" "FW0117" + OUTER_SPRINT "NWBaldursGate_Helm&Cloak_L3" "FW0118" + OUTER_SPRINT "NBaldursGate_ThreeOldKegs_L1" "FW0119" + OUTER_SPRINT "NBaldursGate_ThreeOldKegs_L2" "FW0120" + OUTER_SPRINT "NBaldursGate_ThreeOldKegs_L3" "FW0121" + OUTER_SPRINT "Undercity" "FW0123" + OUTER_SPRINT "Undercity_TempleofBhaal" "FW0125" + OUTER_SPRINT "WBaldursGate_RagefastsHouse" "FW0126" + OUTER_SPRINT "SWBaldursGate_MerchantLeague_L1" "FW0127" + OUTER_SPRINT "SWBaldursGate_MerchantLeague_L2" "FW0128" + OUTER_SPRINT "SWBaldursGate_MerchantLeague_L3" "FW0129" + OUTER_SPRINT "WBaldursGate_HallofWonders" "FW0130" + OUTER_SPRINT "WBaldursGate_HighHouseofWonders" "FW0131" + OUTER_SPRINT "WBaldursGate_LadysHouse" "FW0132" + OUTER_SPRINT "BaldursGate_DocksLowLantern_D1" "FW0133" + OUTER_SPRINT "BaldursGate_DocksLowLantern_D2" "FW0134" + OUTER_SPRINT "BaldursGate_DocksLowLantern_D3" "FW0135" + OUTER_SPRINT "BaldursGate_DocksLowLantern_D4" "FW0136" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L1" "FW0137" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L6" "FW0138" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L2" "FW0139" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L3" "FW0140" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L4" "FW0141" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L5" "FW0142" + OUTER_SPRINT "CentralBaldursGate_OberonsEstate_L1" "FW0143" + OUTER_SPRINT "CentralBaldursGate_OberonsEstate_L2" "FW0144" + OUTER_SPRINT "CentralBaldursGate_OberonsEstate_L3" "FW0145" + OUTER_SPRINT "ThievesMaze" "FW0146" + OUTER_SPRINT "EBaldursGate_House5" "FW0148" + OUTER_SPRINT "NEBaldursGate_IlmatersShrine" "FW0149" + OUTER_SPRINT "EBaldursGate_House2" "FW0150" + OUTER_SPRINT "EBaldursGate_House3" "FW0151" + OUTER_SPRINT "EBaldursGate_House4" "FW0152" + OUTER_SPRINT "EBaldursGate_ThievesGuild" "FW0153" + OUTER_SPRINT "EBaldursGate_KeexieTavern_L1" "FW0154" + OUTER_SPRINT "NWBaldursGate_House3_L1" "FW0155" + OUTER_SPRINT "NWBaldursGate_House3_L2" "FW0156" + OUTER_SPRINT "NWBaldursGate_QuinnsHouse_L1" "FW0157" + OUTER_SPRINT "NWBaldursGate_QuinnsHouse_L2" "FW0158" + OUTER_SPRINT "NWBaldursGate_House1_L1" "FW0159" + OUTER_SPRINT "NWBaldursGate_House1_L2" "FW0160" + OUTER_SPRINT "NWBaldursGate_DegrodelsHouse" "FW0161" + OUTER_SPRINT "NWBaldursGate_LaertasHouse_L1" "FW0162" + OUTER_SPRINT "NWBaldursGate_House2_L1" "FW0163" + OUTER_SPRINT "NWBaldursGate_House2_L2" "FW0164" + OUTER_SPRINT "NWBaldursGate_Tavern_L1" "FW0165" + OUTER_SPRINT "NWBaldursGate_Tavern_L2" "FW0166" + OUTER_SPRINT "NWBaldursGate_PheirkasHouse_L1" "FW0167" + OUTER_SPRINT "NWBaldursGate_PheirkasHouse_L2" "FW0168" + OUTER_SPRINT "NWBaldursGate_House4_L1" "FW0169" + OUTER_SPRINT "NWBaldursGate_House4_L2" "FW0170" + OUTER_SPRINT "EBaldursGate_KeexieTavern_L2" "FW0171" + OUTER_SPRINT "NBaldursGate" "FW0200" + OUTER_SPRINT "WSewers" "FW0224" + OUTER_SPRINT "CentralSewers" "FW0225" + OUTER_SPRINT "ESewers" "FW0226" + OUTER_SPRINT "NEBaldursGate" "FW0300" + OUTER_SPRINT "NEBaldursGate_House2_L1" "FW0302" + OUTER_SPRINT "NEBaldursGate_House2_L2" "FW0303" + OUTER_SPRINT "NEBaldursGate_Store" "FW0304" + OUTER_SPRINT "NEBaldursGate_House1_L1" "FW0305" + OUTER_SPRINT "NEBaldursGate_House1_L2" "FW0306" + OUTER_SPRINT "NEBaldursGate_CountingHouse_L1" "FW0307" + OUTER_SPRINT "NEBaldursGate_CountingHouse_L2" "FW0308" + OUTER_SPRINT "WBaldursGate" "FW0600" + OUTER_SPRINT "SWBaldursGate_SevenSuns_L1" "FW0601" + OUTER_SPRINT "SWBaldursGate_SevenSuns_L2" "FW0602" + OUTER_SPRINT "SWBaldursGate_SevenSuns_Cellar" "FW0603" + OUTER_SPRINT "SWBaldursGate_FlamingFistHQ_Cellar" "FW0606" + OUTER_SPRINT "SWBaldursGate_FlamingFistHQ_L1" "FW0607" + OUTER_SPRINT "SWBaldursGate_FlamingFistHQ_L2" "FW0608" + OUTER_SPRINT "BaldursGateDocks_WaterQueensHouse" "FW0609" + OUTER_SPRINT "BaldursGateDocks_IronThrone_Cellar" "FW0611" + OUTER_SPRINT "BaldursGateDocks_IronThrone_L2" "FW0612" + OUTER_SPRINT "BaldursGateDocks_IronThrone_L3" "FW0613" + OUTER_SPRINT "BaldursGateDocks_IronThrone_L4" "FW0614" + OUTER_SPRINT "BaldursGateDocks_IronThrone_L5" "FW0615" + OUTER_SPRINT "BaldursGateDocks_IronThrone_L1" "FW0616" + OUTER_SPRINT "WBaldursGate_TremainsHouse_L1" "FW0617" + OUTER_SPRINT "WBaldursGate_TremainsHouse_L2" "FW0618" + OUTER_SPRINT "WBaldursGate_FentensHouse_L1" "FW0619" + OUTER_SPRINT "WBaldursGate_FentensHouse_L2" "FW0620" + OUTER_SPRINT "BaldursGateDocks_IronThroneRoof" "FW0621" + OUTER_SPRINT "CentralBaldursGate" "FW0700" + OUTER_SPRINT "BaldursGateDocks_Harbormaster" "FW0702" + OUTER_SPRINT "EBaldursGate_SorcerousSundries_L1" "FW0703" + OUTER_SPRINT "EBaldursGate_SorcerousSundries_L2" "FW0704" + OUTER_SPRINT "EBaldursGate_ElfsongTavern_L1" "FW0705" + OUTER_SPRINT "EBaldursGate_ElfsongTavern_L2" "FW0706" + OUTER_SPRINT "CentralBaldursGate_House3_L1" "FW0707" + OUTER_SPRINT "CentralBaldursGate_House3_L2" "FW0708" + OUTER_SPRINT "CentralBaldursGate_House2_L1" "FW0709" + OUTER_SPRINT "CentralBaldursGate_House2_L2" "FW0710" + OUTER_SPRINT "CentralBaldursGate_House1_L1" "FW0711" + OUTER_SPRINT "CentralBaldursGate_House1_L2" "FW0712" + OUTER_SPRINT "CentralBaldursGate_House5_L1" "FW0713" + OUTER_SPRINT "CentralBaldursGate_House5_L2" "FW0714" + OUTER_SPRINT "CentralBaldursGate_NadinesHouse_L1" "FW0715" + OUTER_SPRINT "CentralBaldursGate_NadinesHouse_L2" "FW0716" + OUTER_SPRINT "CentralBaldursGate_House6_L1" "FW0717" + OUTER_SPRINT "CentralBaldursGate_House6_L2" "FW0718" + OUTER_SPRINT "CentralBaldursGate_FeloniusManor" "FW0719" + OUTER_SPRINT "CentralBaldursGate_DrakonTavern" "FW0720" + OUTER_SPRINT "CentralBaldursGate_PoultryStore" "FW0721" + OUTER_SPRINT "CentralBaldursGate_House4_L1" "FW0722" + OUTER_SPRINT "CentralBaldursGate_House4_L2" "FW0723" + OUTER_SPRINT "CentralBaldursGate_GamblingTent1" "FW0724" + OUTER_SPRINT "CentralBaldursGate_GamblingTent2" "FW0725" + OUTER_SPRINT "CentralBaldursGate_DivinersTent" "FW0726" + OUTER_SPRINT "EBaldursGate" "FW0800" + OUTER_SPRINT "EBaldursGate_House6_L1" "FW0801" + OUTER_SPRINT "EBaldursGate_House6_L2" "FW0802" + OUTER_SPRINT "EBaldursGate_MaltzWeaponShop_L1" "FW0803" + OUTER_SPRINT "EBaldursGate_MaltzWeaponShop_L2" "FW0804" + OUTER_SPRINT "EBaldursGate_ArkionsHouse_L1" "FW0805" + OUTER_SPRINT "EBaldursGate_ArkionsHouse_L2" "FW0806" + OUTER_SPRINT "EBaldursGate_Inn_L1" "FW0807" + OUTER_SPRINT "EBaldursGate_Inn_L2" "FW0808" + OUTER_SPRINT "EBaldursGate_SilencesShop" "FW0809" + OUTER_SPRINT "EBaldursGate_LuckyAellos" "FW0810" + OUTER_SPRINT "EBaldursGate_House1_L1" "FW0811" + OUTER_SPRINT "EBaldursGate_House1_L2" "FW0812" + OUTER_SPRINT "SEBaldursGate_NemphresHouse_L1" "FW0813" + OUTER_SPRINT "SEBaldursGate_NemphresHouse_L2" "FW0814" + OUTER_SPRINT "WyrmsCrossing" "FW0900" + OUTER_SPRINT "WyrmsCrossingTenyasHouse" "FW0901" + OUTER_SPRINT "SWBaldursGate" "FW1100" + OUTER_SPRINT "SWBaldursGate_WivensHouse_L1" "FW1101" + OUTER_SPRINT "SWBaldursGate_WivensHouse_L2" "FW1102" + OUTER_SPRINT "SWBaldursGate_House3_L1" "FW1103" + OUTER_SPRINT "SWBaldursGate_House3_L2" "FW1104" + OUTER_SPRINT "SWBaldursGate_House1_L1" "FW1105" + OUTER_SPRINT "SWBaldursGate_House1_L2" "FW1106" + OUTER_SPRINT "SWBaldursGate_House2_L1" "FW1107" + OUTER_SPRINT "SWBaldursGate_House2_L2" "FW1108" + OUTER_SPRINT "SWBaldursGate_Tavern_L1" "FW1109" + OUTER_SPRINT "SWBaldursGate_Tavern_L2" "FW1110" + OUTER_SPRINT "SWBaldursGate_SuninsHouse" "FW1111" + OUTER_SPRINT "SWBaldursGate_WeaponsStore1" "FW1112" + OUTER_SPRINT "SWBaldursGate_YeOldeInn_L1" "FW1113" + OUTER_SPRINT "SWBaldursGate_YeOldeInn_L2" "FW1114" + OUTER_SPRINT "SWBaldursGate_PotionsStore2" "FW1115" + OUTER_SPRINT "SWBaldursGate_WeaponsStore2" "FW1116" + OUTER_SPRINT "SWBaldursGate_PotionsStore1" "FW1117" + OUTER_SPRINT "BaldursGateDocks" "FW1200" + OUTER_SPRINT "BaldursGateDocks_OgreMagiHouse_L1" "FW1201" + OUTER_SPRINT "BaldursGateDocks_OgreMagiHouse_L2" "FW1202" + OUTER_SPRINT "BaldursGateDocks_House2_L1" "FW1203" + OUTER_SPRINT "BaldursGateDocks_House2_L2" "FW1204" + OUTER_SPRINT "BaldursGateDocks_House1_L1" "FW1205" + OUTER_SPRINT "BaldursGateDocks_House1_L2" "FW1206" + OUTER_SPRINT "BaldursGateDocks_BasiliskWarehouse" "FW1207" + OUTER_SPRINT "BaldursGateDocks_NoraleesWarehouse" "FW1208" + OUTER_SPRINT "BaldursGateDocks_LarriazHouse_L1" "FW1209" + OUTER_SPRINT "BaldursGateDocks_LarriazHouse_L2" "FW1210" + OUTER_SPRINT "BaldursGateDocks_GhoraksHouse_L1" "FW1211" + OUTER_SPRINT "BaldursGateDocks_GhoraksHouse_L2" "FW1212" + OUTER_SPRINT "BaldursGateDocks_CordyrsHouse_L1" "FW1213" + OUTER_SPRINT "BaldursGateDocks_CordyrsHouse_L2" "FW1214" + OUTER_SPRINT "BaldursGateDocks_JopalinsTavern" "FW1215" + OUTER_SPRINT "SEBaldursGate" "FW1300" + OUTER_SPRINT "SEBaldursGate_Warehouse" "FW1301" + OUTER_SPRINT "SEBaldursGate_GeneralStore2" "FW1302" + OUTER_SPRINT "SEBaldursGate_NadarinsWarehouse" "FW1303" + OUTER_SPRINT "SEBaldursGate_House3_L1" "FW1304" + OUTER_SPRINT "SEBaldursGate_House3_L2" "FW1305" + OUTER_SPRINT "SEBaldursGate_Inn_L1" "FW1306" + OUTER_SPRINT "SEBaldursGate_Inn_L2" "FW1307" + OUTER_SPRINT "SEBaldursGate_House4_L1" "FW1308" + OUTER_SPRINT "SEBaldursGate_House4_L2" "FW1309" + OUTER_SPRINT "SEBaldursGate_House2_L1" "FW1310" + OUTER_SPRINT "SEBaldursGate_House2_L2" "FW1311" + OUTER_SPRINT "SEBaldursGate_GantolandansHouse_L1" "FW1312" + OUTER_SPRINT "SEBaldursGate_GantolandansHouse_L2" "FW1313" + OUTER_SPRINT "SEBaldursGate_House1_L1" "FW1314" + OUTER_SPRINT "SEBaldursGate_House1_L2" "FW1315" + OUTER_SPRINT "SEBaldursGate_TaxeksHouse_L1" "FW1316" + OUTER_SPRINT "SEBaldursGate_TaxeksHouse_L2" "FW1317" + OUTER_SPRINT "SEBaldursGate_GeneralStore1" "FW1320" + OUTER_SPRINT "FishingVillage" "FW1400" + OUTER_SPRINT "FishingVillage_AnkhegPit" "FW1401" + OUTER_SPRINT "FishingVillage_House1" "FW1402" + OUTER_SPRINT "FishingVillage_House2" "FW1403" + OUTER_SPRINT "FishingVillage_FarmerBrunsHouse" "FW1404" + OUTER_SPRINT "CloakwoodDruids" "FW1600" + OUTER_SPRINT "CloakwoodDruids_Treehouse_L1" "FW1601" + OUTER_SPRINT "CloakwoodDruids_Treehouse_L2" "FW1602" + OUTER_SPRINT "CloakwoodDruids_PetersCave" "FW1603" + OUTER_SPRINT "CloakwoodWyverns" "FW1700" + OUTER_SPRINT "CloakwoodMines" "FW1800" + OUTER_SPRINT "CloakwoodMines_L1" "FW1801" + OUTER_SPRINT "CloakwoodMines_L3" "FW1802" + OUTER_SPRINT "CloakwoodMines_L4" "FW1803" + OUTER_SPRINT "CloakwoodMines_L2" "FW1804" + OUTER_SPRINT "CloakwoodMines_Barracks_L1" "FW1805" + OUTER_SPRINT "CloakwoodMines_Barracks_L2" "FW1806" + OUTER_SPRINT "CloakwoodMines_MineLift" "FW1807" + OUTER_SPRINT "CloakwoodMines_Storehouse" "FW1808" + OUTER_SPRINT "CloakwoodMines_MineShed" "FW1809" + OUTER_SPRINT "BanditCamp" "FW1900" + OUTER_SPRINT "BanditCamp_RaemonsTent" "FW1901" + OUTER_SPRINT "BanditCamp_Tent2" "FW1902" + OUTER_SPRINT "BanditCamp_GnollCave" "FW1903" + OUTER_SPRINT "BanditCamp_TersusTent" "FW1904" + OUTER_SPRINT "BanditCamp_Tent1" "FW1905" + OUTER_SPRINT "BanditCamp_Tent3" "FW1906" + OUTER_SPRINT "BanditCamp_Tent4" "FW1907" + OUTER_SPRINT "CloakwoodNest" "FW2100" + OUTER_SPRINT "CloakwoodNestSpiderNest" "FW2101" + OUTER_SPRINT "CloakwoodLodge" "FW2200" + OUTER_SPRINT "CloakwoodLodgeHuntingLodge" "FW2215" + OUTER_SPRINT "FriendlyArmInn" "FW2300" + OUTER_SPRINT "FriendlyArmInn_L1" "FW2301" + OUTER_SPRINT "FriendlyArmInn_L2" "FW2302" + OUTER_SPRINT "FriendlyArmInn_L3" "FW2303" + OUTER_SPRINT "FriendlyArmInn_TempleofWisdom" "FW2304" + OUTER_SPRINT "FriendlyArmInn_House" "FW2305" + OUTER_SPRINT "FriendlyArmInn_JoiasHouse" "FW2306" + OUTER_SPRINT "Peldvale" "FW2400" + OUTER_SPRINT "Candlekeep" "FW2600" + OUTER_SPRINT "Candlekeep_PriestsQuarters" "FW2602" + OUTER_SPRINT "Candlekeep_Infirmary" "FW2605" + OUTER_SPRINT "Candlekeep_Storehouse" "FW2606" + OUTER_SPRINT "Candlekeep_Bunkhouse" "FW2607" + OUTER_SPRINT "Candlekeep_Library_L1" "FW2608" + OUTER_SPRINT "Candlekeep_Library_L2" "FW2609" + OUTER_SPRINT "Candlekeep_Library_L3" "FW2610" + OUTER_SPRINT "Candlekeep_Library_L4" "FW2611" + OUTER_SPRINT "Candlekeep_Library_L5" "FW2612" + OUTER_SPRINT "Candlekeep_Catacombs_L1Antechamber" "FW2613" + OUTER_SPRINT "Candlekeep_Library_L6" "FW2614" + OUTER_SPRINT "Candlekeep_Catacombs_L1" "FW2615" + OUTER_SPRINT "Candlekeep_Inn_L1" "FW2616" + OUTER_SPRINT "Candlekeep_Inn_L2" "FW2617" + OUTER_SPRINT "Candlekeep_Barracks" "FW2618" + OUTER_SPRINT "Candlekeep_Catacombs_L2" "FW2619" + OUTER_SPRINT "Candlekeep_Ch6" "FW2626" + OUTER_SPRINT "Candlekeep_Ch6_PriestsQuarters" "FW2627" + OUTER_SPRINT "Candlekeep_Ch6_Storehouse" "FW2628" + OUTER_SPRINT "Candlekeep_Ch6_Inn_L1" "FW2629" + OUTER_SPRINT "Candlekeep_Ch6_Inn_L2" "FW2630" + OUTER_SPRINT "Candlekeep_Ch6_Barracks" "FW2631" + OUTER_SPRINT "Candlekeep_Ch6_Bunkhouse" "FW2632" + OUTER_SPRINT "Candlekeep_Ch6_Infirmary" "FW2633" + OUTER_SPRINT "Candlekeep_ObesCellar" "FW2643" + OUTER_SPRINT "LionsWay" "FW2700" + OUTER_SPRINT "CoastWay" "FW2800" + OUTER_SPRINT "Larswood" "FW2900" + OUTER_SPRINT "SpiderWood" "FW3000" + OUTER_SPRINT "ShipwrecksCoast" "FW3100" + OUTER_SPRINT "HighHedge" "FW3200" + OUTER_SPRINT "HighHedge_House" "FW3201" + OUTER_SPRINT "HighHedge_ThalanthyrsAbode" "FW3202" + OUTER_SPRINT "Beregost" "FW3300" + OUTER_SPRINT "Beregost_ThunderhammerSmithy" "FW3301" + OUTER_SPRINT "Beregost_House19" "FW3302" + OUTER_SPRINT "Beregost_RedSheaf_L2" "FW3303" + OUTER_SPRINT "Beregost_JovialJuggler_L1" "FW3304" + OUTER_SPRINT "Beregost_JovialJuggler_L2F" "FW3305" + OUTER_SPRINT "Beregost_JovialJuggler_L2R" "FW3306" + OUTER_SPRINT "Beregost_BurningWizard_L1" "FW3307" + OUTER_SPRINT "Beregost_BurningWizard_L2" "FW3308" + OUTER_SPRINT "Beregost_House13_L1" "FW3309" + OUTER_SPRINT "Beregost_House13_L2" "FW3310" + OUTER_SPRINT "Beregost_House12_L1" "FW3311" + OUTER_SPRINT "Beregost_House12_L2" "FW3312" + OUTER_SPRINT "Beregost_MiriannesHouse_L1" "FW3313" + OUTER_SPRINT "Beregost_MiriannesHouse_L2" "FW3314" + OUTER_SPRINT "Beregost_LandrinsHouse" "FW3315" + OUTER_SPRINT "Beregost_House18" "FW3316" + OUTER_SPRINT "Beregost_House17" "FW3317" + OUTER_SPRINT "Beregost_House15" "FW3318" + OUTER_SPRINT "Beregost_House16" "FW3319" + OUTER_SPRINT "Beregost_TravenhurstManor_L1" "FW3320" + OUTER_SPRINT "Beregost_TravenhurstManor_L2" "FW3321" + OUTER_SPRINT "Beregost_ServantsQuarters" "FW3322" + OUTER_SPRINT "Beregost_House20_L1" "FW3323" + OUTER_SPRINT "Beregost_House20_L2" "FW3324" + OUTER_SPRINT "Beregost_House23_L1" "FW3325" + OUTER_SPRINT "Beregost_House23_L2" "FW3326" + OUTER_SPRINT "Beregost_House14_L1" "FW3327" + OUTER_SPRINT "Beregost_House14_L2" "FW3328" + OUTER_SPRINT "Beregost_House21_L1" "FW3329" + OUTER_SPRINT "Beregost_House21_L2" "FW3330" + OUTER_SPRINT "Beregost_House11_L1" "FW3331" + OUTER_SPRINT "Beregost_House11_L2" "FW3332" + OUTER_SPRINT "Beregost_FirebeadsHouse_L1" "FW3333" + OUTER_SPRINT "Beregost_FirebeadsHouse_L2" "FW3334" + OUTER_SPRINT "Beregost_House10_L1" "FW3335" + OUTER_SPRINT "Beregost_House10_L2" "FW3336" + OUTER_SPRINT "Beregost_House22_L1" "FW3337" + OUTER_SPRINT "Beregost_House22_L2" "FW3338" + OUTER_SPRINT "Beregost_House01_L1" "FW3339" + OUTER_SPRINT "Beregost_House01_L2" "FW3340" + OUTER_SPRINT "Beregost_House02_L1" "FW3341" + OUTER_SPRINT "Beregost_House02_L2" "FW3342" + OUTER_SPRINT "Beregost_House03" "FW3343" + OUTER_SPRINT "Beregost_House07" "FW3344" + OUTER_SPRINT "Beregost_House04_L1" "FW3345" + OUTER_SPRINT "Beregost_House04_L2" "FW3346" + OUTER_SPRINT "Beregost_House05_L1" "FW3347" + OUTER_SPRINT "Beregost_House05_L2" "FW3348" + OUTER_SPRINT "Beregost_House06_L1" "FW3349" + OUTER_SPRINT "Beregost_House06_L2" "FW3350" + OUTER_SPRINT "Beregost_FeldepostsInn_L1" "FW3351" + OUTER_SPRINT "Beregost_FeldepostsInn_L2" "FW3352" + OUTER_SPRINT "Beregost_KagainsStore" "FW3353" + OUTER_SPRINT "Beregost_House09" "FW3354" + OUTER_SPRINT "Beregost_House08" "FW3355" + OUTER_SPRINT "Beregost_House08_L2" "FW3356" + OUTER_SPRINT "Beregost_RedSheaf_L1" "FW3357" + OUTER_SPRINT "Temple" "FW3400" + OUTER_SPRINT "Temple_Vestibule" "FW3401" + OUTER_SPRINT "Temple_SongoftheMorning" "FW3402" + OUTER_SPRINT "MutaminsGarden" "FW3500" + OUTER_SPRINT "Lighthouse" "FW3600" + OUTER_SPRINT "Lighthouse_BlackAlaricsCave" "FW3601" + OUTER_SPRINT "RedCanyons" "FW3700" + OUTER_SPRINT "SouthBeregostRoad" "FW3800" + OUTER_SPRINT "SouthBeregostRoad_Cave" "FW3802" + OUTER_SPRINT "Ulcaster" "FW3900" + OUTER_SPRINT "UlcasterRuins" "FW3901" + OUTER_SPRINT "Gullykin" "FW4000" + OUTER_SPRINT "Gullykin_JenkalsHouse_L1" "FW4001" + OUTER_SPRINT "Gullykin_JenkalsHouse_Cellar" "FW4002" + OUTER_SPRINT "Gullykin_Winery_L1" "FW4003" + OUTER_SPRINT "Gullykin_Winery_Cellar" "FW4004" + OUTER_SPRINT "Gullykin_House1_L1" "FW4005" + OUTER_SPRINT "Gullykin_House1_Cellar" "FW4006" + OUTER_SPRINT "Gullykin_House3_L1" "FW4007" + OUTER_SPRINT "Gullykin_House3_Cellar" "FW4008" + OUTER_SPRINT "Gullykin_House4_L1" "FW4009" + OUTER_SPRINT "Gullykin_House4_Cellar" "FW4010" + OUTER_SPRINT "Gullykin_House5_L1" "FW4011" + OUTER_SPRINT "Gullykin_House5_Cellar" "FW4012" + OUTER_SPRINT "Gullykin_House2_L1" "FW4013" + OUTER_SPRINT "Gullykin_House2_Cellar" "FW4014" + OUTER_SPRINT "ArchaeologicalSite" "FW4100" + OUTER_SPRINT "ArchaeologicalSite_Tomb" "FW4101" + OUTER_SPRINT "FishermansLake" "FW4200" + OUTER_SPRINT "NorthNashkelRoad" "FW4300" + OUTER_SPRINT "LonelyPeaks" "FW4400" + OUTER_SPRINT "LonelyPeaks_Cave" "FW4401" + OUTER_SPRINT "FirewineBridge" "FW4500" + OUTER_SPRINT "CloakwoodWyverns_WyvernCave" "FW4501" + OUTER_SPRINT "BearRiver" "FW4600" + OUTER_SPRINT "XvartVillage" "FW4700" + OUTER_SPRINT "XvartVillage_Cave" "FW4701" + OUTER_SPRINT "Nashkel" "FW4800" + OUTER_SPRINT "Nashkel_Inn" "FW4801" + OUTER_SPRINT "Nashkel_TempleofHelm" "FW4802" + OUTER_SPRINT "Nashkel_Store" "FW4803" + OUTER_SPRINT "Nashkel_ManorHouse_L1" "FW4804" + OUTER_SPRINT "Nashkel_ManorHouse_L2" "FW4805" + OUTER_SPRINT "Nashkel_JosephsHouse" "FW4806" + OUTER_SPRINT "Nashkel_House1" "FW4807" + OUTER_SPRINT "Nashkel_House2" "FW4808" + OUTER_SPRINT "Nashkel_BelchingDragonTavern" "FW4809" + OUTER_SPRINT "Nashkel_Garrison" "FW4810" + OUTER_SPRINT "NashkelCarnival" "FW4900" + OUTER_SPRINT "NashkelCarnival_ArmorTent" "FW4901" + OUTER_SPRINT "NashkelCarnival_LotusTent" "FW4902" + OUTER_SPRINT "NashkelCarnival_VitiaresTent" "FW4903" + OUTER_SPRINT "NashkelCarnival_GamblingTent" "FW4904" + OUTER_SPRINT "NashkelCarnival_PotionTent" "FW4905" + OUTER_SPRINT "NashkelCarnival_ZordralsTent" "FW4906" + OUTER_SPRINT "NashkelCarnival_MagicItemsTent" "FW4907" + OUTER_SPRINT "NashkelCarnival_MeleeWeaponsTent" "FW4908" + OUTER_SPRINT "NashkelCarnival_RangedWeaponsTent" "FW4909" + OUTER_SPRINT "ValleyoftheTombs" "FW5000" + OUTER_SPRINT "ValleyoftheTombs_Tomb" "FW5001" + OUTER_SPRINT "GnollStronghold" "FW5100" + OUTER_SPRINT "GnollStronghold_XvartCave" "FW5101" + OUTER_SPRINT "GnollStronghold_TomeCave" "FW5102" + OUTER_SPRINT "GnollStronghold_CrawlerCave" "FW5103" + OUTER_SPRINT "DryadFalls" "FW5200" + OUTER_SPRINT "FirewineRuins" "FW5201" + OUTER_SPRINT "DryadFalls_Cave" "FW5202" + OUTER_SPRINT "FireLeafForest" "FW5300" + OUTER_SPRINT "NashkelMines" "FW5400" + OUTER_SPRINT "NashkelMines_L1" "FW5401" + OUTER_SPRINT "NashkelMines_L2" "FW5402" + OUTER_SPRINT "NashkelMines_L3" "FW5403" + OUTER_SPRINT "NashkelMines_L4" "FW5404" + OUTER_SPRINT "NashkelMines_MulaheysCave" "FW5405" + OUTER_SPRINT "NashkelMines_Cabin" "FW5406" + OUTER_SPRINT "GibberlingMountains" "FW5500" + OUTER_SPRINT "CandlekeepCaves" "FW5506" + OUTER_SPRINT "Encounter_Plains1" "FW5600" + OUTER_SPRINT "Encounter_Plains2" "FW5601" + OUTER_SPRINT "Encounter_Canyon1" "FW5700" + OUTER_SPRINT "Encounter_Canyon2" "FW5701" + OUTER_SPRINT "Encounter_Cliff1" "FW5800" + OUTER_SPRINT "Encounter_Cliff2" "FW5801" + OUTER_SPRINT "Encounter_Grassland1" "FW5900" + OUTER_SPRINT "Encounter_Grassland2" "FW5901" + OUTER_SPRINT "Encounter_Forest1" "FW6000" + OUTER_SPRINT "Encounter_Forest2" "FW6001" + OUTER_SPRINT "Encounter_Road" "FW6100" + + /* TOTSC Areas; BGT requires it, but separation needed for Tutu */ + OUTER_SPRINT "Farmlands" "FW0400" + OUTER_SPRINT "FarmlandsFarmhouse" "FW0401" + OUTER_SPRINT "DurlagsTower" "FW0500" + OUTER_SPRINT "DurlagsTower_Cellar" "FW0501" + OUTER_SPRINT "DurlagsTower_L1" "FW0502" + OUTER_SPRINT "DurlagsTower_L2" "FW0503" + OUTER_SPRINT "DurlagsTower_L3" "FW0504" + OUTER_SPRINT "DurlagsTower_L4" "FW0505" + OUTER_SPRINT "DurlagsTower_Chessboard" "FW0506" + OUTER_SPRINT "DurlagsTower_IceChamber" "FW0507" + OUTER_SPRINT "DurlagsTower_FireChamber" "FW0508" + OUTER_SPRINT "DurlagsTower_AirChamber" "FW0509" + OUTER_SPRINT "DurlagsTower_EarthChamber" "FW0510" + OUTER_SPRINT "DurlagsTower_D1" "FW0511" + OUTER_SPRINT "DurlagsTower_D2" "FW0512" + OUTER_SPRINT "DurlagsTower_D3" "FW0513" + OUTER_SPRINT "DurlagsTower_D4" "FW0514" + OUTER_SPRINT "DurlagsTower_CompassRoom" "FW0515" + OUTER_SPRINT "DurlagsTower_DemonknightsChamber" "FW0516" + OUTER_SPRINT "IsleofBalduranN" "FW1500" + OUTER_SPRINT "IsleofBalduranNShip_D1" "FW1501" + OUTER_SPRINT "IsleofBalduranNShip_D2" "FW1502" + OUTER_SPRINT "IsleofBalduranNShip_D3" "FW1503" + OUTER_SPRINT "IsleofBalduranNShip_D4" "FW1504" + OUTER_SPRINT "IsleofBalduranNDradeelsHouse" "FW1505" + OUTER_SPRINT "IsleofBalduranS" "FW2000" + OUTER_SPRINT "IsleofBalduranS_GreatHut" "FW2001" + OUTER_SPRINT "IsleofBalduranS_KaishasHut" "FW2002" + OUTER_SPRINT "IsleofBalduranS_LargeHut3" "FW2003" + OUTER_SPRINT "IsleofBalduranS_LargeHut2" "FW2004" + OUTER_SPRINT "IsleofBalduranS_LargeHut4" "FW2005" + OUTER_SPRINT "IsleofBalduranS_LargeHut1" "FW2006" + OUTER_SPRINT "IsleofBalduranS_HarborHut" "FW2007" + OUTER_SPRINT "IsleofBalduranS_StoreHut2" "FW2008" + OUTER_SPRINT "IsleofBalduranS_StoreHut1" "FW2009" + OUTER_SPRINT "IsleofBalduranS_StoreHut4" "FW2010" + OUTER_SPRINT "IsleofBalduranS_StoreHut3" "FW2011" + OUTER_SPRINT "WerewolfCaverns" "FW2012" + OUTER_SPRINT "UlgothsBeard" "FW1000" + OUTER_SPRINT "UlgothsBeard_Inn" "FW1001" + OUTER_SPRINT "UlgothsBeard_DemonsChamber" "FW1002" + OUTER_SPRINT "UlgothsBeard_Storehouse" "FW1003" + OUTER_SPRINT "UlgothsBeard_MendasHouse" "FW1004" + OUTER_SPRINT "UlgothsBeard_TherellasHouse" "FW1005" + OUTER_SPRINT "UlgothsBeard_House2" "FW1006" + OUTER_SPRINT "UlgothsBeard_House1" "FW1007" + OUTER_SPRINT "IceIsland" "FW1008" + OUTER_SPRINT "IceIslandMaze_L1" "FW1009" + OUTER_SPRINT "IceIslandMaze_L2" "FW1010" + + /* AREA_SCRIPTS (full list using the same var names as areas, with added _BCS at the end)*/ + //these variables are not needed for BG:EE, BGT, EET, but for some reason Tutu doesn't use the same names as areas, so they must be assigned + OUTER_SPRINT "NBaldursGate_TempleofHelm_BCS" "_AR0002" + OUTER_SPRINT "NBaldursGate_BherensHouse_L1_BCS" "_AR0004" + OUTER_SPRINT "NBaldursGate_BherensHouse_L2_BCS" "_AR0005" + OUTER_SPRINT "NBaldursGate_RinniesHouse_L1_BCS" "_AR0006" + OUTER_SPRINT "NBaldursGate_RinniesHouse_L2_BCS" "_AR0007" + OUTER_SPRINT "NBaldursGate_House1_L1_BCS" "_AR0008" + OUTER_SPRINT "NBaldursGate_House1_L2_BCS" "_AR0009" + OUTER_SPRINT "NBaldursGate_JardaksHouse_L1_BCS" "_AR0010" + OUTER_SPRINT "NBaldursGate_JardaksHouse_L2_BCS" "_AR0011" + OUTER_SPRINT "NBaldursGate_House2_L1_BCS" "_AR0012" + OUTER_SPRINT "NBaldursGate_House2_L2_BCS" "_AR0013" + OUTER_SPRINT "NBaldursGate_House3_L1_BCS" "_AR0014" + OUTER_SPRINT "NBaldursGate_House3_L2_BCS" "_AR0015" + OUTER_SPRINT "NBaldursGate_House4_L1_BCS" "_AR0016" + OUTER_SPRINT "NBaldursGate_House4_L2_BCS" "_AR0017" + OUTER_SPRINT "NBaldursGate_House5_L1_BCS" "_AR0018" + OUTER_SPRINT "NBaldursGate_House5_L2_BCS" "_AR0019" + OUTER_SPRINT "NBaldursGate_House6_L1_BCS" "_AR0020" + OUTER_SPRINT "NBaldursGate_House6_L2_BCS" "_AR0021" + OUTER_SPRINT "NWBaldursGate_BCS" "_AR0100" + OUTER_SPRINT "NWBaldursGate_SilvershieldEstate_L1_BCS" "_AR0101" + OUTER_SPRINT "NWBaldursGate_SilvershieldEstate_L2_BCS" "_AR0102" + OUTER_SPRINT "NEBaldursGate_SplurgingSturgeon_L1_BCS" "_AR0103" + OUTER_SPRINT "NEBaldursGate_SplurgingSturgeon_L2_BCS" "_AR0104" + OUTER_SPRINT "SEBaldursGate_Blade&Stars_L1_BCS" "_AR0105" + OUTER_SPRINT "SEBaldursGate_Blade&Stars_L2_BCS" "_AR0106" + OUTER_SPRINT "SEBaldursGate_Blade&Stars_L3_BCS" "_AR0107" + OUTER_SPRINT "NBaldursGate_DucalPalace_L1_BCS" "_AR0108" + OUTER_SPRINT "NBaldursGate_DucalPalace_L2_BCS" "_AR0109" + OUTER_SPRINT "NBaldursGate_DucalPalace_L3_BCS" "_AR0110" + OUTER_SPRINT "NBaldursGate_DucalPalace_Cellar_BCS" "_AR0111" + OUTER_SPRINT "BaldursGate_Undercellars_BCS" "_AR0112" + OUTER_SPRINT "NEBaldursGate_BlushingMermaid_L1_BCS" "_AR0114" + OUTER_SPRINT "NEBaldursGate_BlushingMermaid_L2_BCS" "_AR0115" + OUTER_SPRINT "NWBaldursGate_Helm&Cloak_L1_BCS" "_AR0116" + OUTER_SPRINT "NWBaldursGate_Helm&Cloak_L2_BCS" "_AR0117" + OUTER_SPRINT "NWBaldursGate_Helm&Cloak_L3_BCS" "_AR0118" + OUTER_SPRINT "NBaldursGate_ThreeOldKegs_L1_BCS" "_AR0119" + OUTER_SPRINT "NBaldursGate_ThreeOldKegs_L2_BCS" "_AR0120" + OUTER_SPRINT "NBaldursGate_ThreeOldKegs_L3_BCS" "_AR0121" + OUTER_SPRINT "Undercity_BCS" "_AR0123" + OUTER_SPRINT "Undercity_TempleofBhaal_BCS" "_AR0125" + OUTER_SPRINT "WBaldursGate_RagefastsHouse_BCS" "_AR0126" + OUTER_SPRINT "SWBaldursGate_MerchantLeague_L1_BCS" "_AR0127" + OUTER_SPRINT "SWBaldursGate_MerchantLeague_L2_BCS" "_AR0128" + OUTER_SPRINT "SWBaldursGate_MerchantLeague_L3_BCS" "_AR0129" + OUTER_SPRINT "WBaldursGate_HallofWonders_BCS" "_AR0130" + OUTER_SPRINT "WBaldursGate_HighHouseofWonders_BCS" "_AR0131" + OUTER_SPRINT "WBaldursGate_LadysHouse_BCS" "_AR0132" + OUTER_SPRINT "BaldursGate_DocksLowLantern_D1_BCS" "_AR0133" + OUTER_SPRINT "BaldursGate_DocksLowLantern_D2_BCS" "_AR0134" + OUTER_SPRINT "BaldursGate_DocksLowLantern_D3_BCS" "_AR0135" + OUTER_SPRINT "BaldursGate_DocksLowLantern_D4_BCS" "_AR0136" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L1_BCS" "_AR0137" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L6_BCS" "_AR0138" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L2_BCS" "_AR0139" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L3_BCS" "_AR0140" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L4_BCS" "_AR0141" + OUTER_SPRINT "NBaldursGate_RamazithsTower_L5_BCS" "_AR0142" + OUTER_SPRINT "CentralBaldursGate_OberonsEstate_L1_BCS" "_AR0143" + OUTER_SPRINT "CentralBaldursGate_OberonsEstate_L2_BCS" "_AR0144" + OUTER_SPRINT "CentralBaldursGate_OberonsEstate_L3_BCS" "_AR0145" + OUTER_SPRINT "ThievesMaze_BCS" "_AR0146" + OUTER_SPRINT "EBaldursGate_House5_BCS" "_AR0148" + OUTER_SPRINT "NEBaldursGate_IlmatersShrine_BCS" "_AR0149" + OUTER_SPRINT "EBaldursGate_House2_BCS" "_AR0150" + OUTER_SPRINT "EBaldursGate_House3_BCS" "_AR0151" + OUTER_SPRINT "EBaldursGate_House4_BCS" "_AR0152" + OUTER_SPRINT "EBaldursGate_ThievesGuild_BCS" "_AR0153" + OUTER_SPRINT "EBaldursGate_KeexieTavern_L1_BCS" "_AR0154" + OUTER_SPRINT "NWBaldursGate_House3_L1_BCS" "_AR0155" + OUTER_SPRINT "NWBaldursGate_House3_L2_BCS" "_AR0156" + OUTER_SPRINT "NWBaldursGate_QuinnsHouse_L1_BCS" "_AR0157" + OUTER_SPRINT "NWBaldursGate_QuinnsHouse_L2_BCS" "_AR0158" + OUTER_SPRINT "NWBaldursGate_House1_L1_BCS" "_AR0159" + OUTER_SPRINT "NWBaldursGate_House1_L2_BCS" "_AR0160" + OUTER_SPRINT "NWBaldursGate_DegrodelsHouse_BCS" "_AR0161" + OUTER_SPRINT "NWBaldursGate_LaertasHouse_L1_BCS" "_AR0162" + OUTER_SPRINT "NWBaldursGate_House2_L1_BCS" "_AR0163" + OUTER_SPRINT "NWBaldursGate_House2_L2_BCS" "_AR0164" + OUTER_SPRINT "NWBaldursGate_Tavern_L1_BCS" "_AR0165" + OUTER_SPRINT "NWBaldursGate_Tavern_L2_BCS" "_AR0166" + OUTER_SPRINT "NWBaldursGate_PheirkasHouse_L1_BCS" "_AR0167" + OUTER_SPRINT "NWBaldursGate_PheirkasHouse_L2_BCS" "_AR0168" + OUTER_SPRINT "NWBaldursGate_House4_L1_BCS" "_AR0169" + OUTER_SPRINT "NWBaldursGate_House4_L2_BCS" "_AR0170" + OUTER_SPRINT "EBaldursGate_KeexieTavern_L2_BCS" "_AR0171" + OUTER_SPRINT "NBaldursGate_BCS" "_AR0200" + OUTER_SPRINT "WSewers_BCS" "_AR0224" + OUTER_SPRINT "CentralSewers_BCS" "_AR0225" + OUTER_SPRINT "ESewers_BCS" "_AR0226" + OUTER_SPRINT "NEBaldursGate_BCS" "_AR0300" + OUTER_SPRINT "NEBaldursGate_House2_L1_BCS" "_AR0302" + OUTER_SPRINT "NEBaldursGate_House2_L2_BCS" "_AR0303" + OUTER_SPRINT "NEBaldursGate_Store_BCS" "_AR0304" + OUTER_SPRINT "NEBaldursGate_House1_L1_BCS" "_AR0305" + OUTER_SPRINT "NEBaldursGate_House1_L2_BCS" "_AR0306" + OUTER_SPRINT "NEBaldursGate_CountingHouse_L1_BCS" "_AR0307" + OUTER_SPRINT "NEBaldursGate_CountingHouse_L2_BCS" "_AR0308" + OUTER_SPRINT "WBaldursGate_BCS" "_AR0600" + OUTER_SPRINT "SWBaldursGate_SevenSuns_L1_BCS" "_AR0601" + OUTER_SPRINT "SWBaldursGate_SevenSuns_L2_BCS" "_AR0602" + OUTER_SPRINT "SWBaldursGate_SevenSuns_Cellar_BCS" "_AR0603" + OUTER_SPRINT "SWBaldursGate_FlamingFistHQ_Cellar_BCS" "_AR0606" + OUTER_SPRINT "SWBaldursGate_FlamingFistHQ_L1_BCS" "_AR0607" + OUTER_SPRINT "SWBaldursGate_FlamingFistHQ_L2_BCS" "_AR0608" + OUTER_SPRINT "BaldursGateDocks_WaterQueensHouse_BCS" "_AR0609" + OUTER_SPRINT "BaldursGateDocks_IronThrone_Cellar_BCS" "_AR0611" + OUTER_SPRINT "BaldursGateDocks_IronThrone_L2_BCS" "_AR0612" + OUTER_SPRINT "BaldursGateDocks_IronThrone_L3_BCS" "_AR0613" + OUTER_SPRINT "BaldursGateDocks_IronThrone_L4_BCS" "_AR0614" + OUTER_SPRINT "BaldursGateDocks_IronThrone_L5_BCS" "_AR0615" + OUTER_SPRINT "BaldursGateDocks_IronThrone_L1_BCS" "_AR0616" + OUTER_SPRINT "WBaldursGate_TremainsHouse_L1_BCS" "_AR0617" + OUTER_SPRINT "WBaldursGate_TremainsHouse_L2_BCS" "_AR0618" + OUTER_SPRINT "WBaldursGate_FentensHouse_L1_BCS" "_AR0619" + OUTER_SPRINT "WBaldursGate_FentensHouse_L2_BCS" "_AR0620" + OUTER_SPRINT "BaldursGateDocks_IronThroneRoof_BCS" "_AR0621" + OUTER_SPRINT "CentralBaldursGate_BCS" "_AR0700" + OUTER_SPRINT "BaldursGateDocks_Harbormaster_BCS" "_AR0702" + OUTER_SPRINT "EBaldursGate_SorcerousSundries_L1_BCS" "_AR0703" + OUTER_SPRINT "EBaldursGate_SorcerousSundries_L2_BCS" "_AR0704" + OUTER_SPRINT "EBaldursGate_ElfsongTavern_L1_BCS" "_AR0705" + OUTER_SPRINT "EBaldursGate_ElfsongTavern_L2_BCS" "_AR0706" + OUTER_SPRINT "CentralBaldursGate_House3_L1_BCS" "_AR0707" + OUTER_SPRINT "CentralBaldursGate_House3_L2_BCS" "_AR0708" + OUTER_SPRINT "CentralBaldursGate_House2_L1_BCS" "_AR0709" + OUTER_SPRINT "CentralBaldursGate_House2_L2_BCS" "_AR0710" + OUTER_SPRINT "CentralBaldursGate_House1_L1_BCS" "_AR0711" + OUTER_SPRINT "CentralBaldursGate_House1_L2_BCS" "_AR0712" + OUTER_SPRINT "CentralBaldursGate_House5_L1_BCS" "_AR0713" + OUTER_SPRINT "CentralBaldursGate_House5_L2_BCS" "_AR0714" + OUTER_SPRINT "CentralBaldursGate_NadinesHouse_L1_BCS" "_AR0715" + OUTER_SPRINT "CentralBaldursGate_NadinesHouse_L2_BCS" "_AR0716" + OUTER_SPRINT "CentralBaldursGate_House6_L1_BCS" "_AR0717" + OUTER_SPRINT "CentralBaldursGate_House6_L2_BCS" "_AR0718" + OUTER_SPRINT "CentralBaldursGate_FeloniusManor_BCS" "_AR0719" + OUTER_SPRINT "CentralBaldursGate_DrakonTavern_BCS" "_AR0720" + OUTER_SPRINT "CentralBaldursGate_PoultryStore_BCS" "_AR0721" + OUTER_SPRINT "CentralBaldursGate_House4_L1_BCS" "_AR0722" + OUTER_SPRINT "CentralBaldursGate_House4_L2_BCS" "_AR0723" + OUTER_SPRINT "CentralBaldursGate_GamblingTent1_BCS" "_AR0724" + OUTER_SPRINT "CentralBaldursGate_GamblingTent2_BCS" "_AR0725" + OUTER_SPRINT "CentralBaldursGate_DivinersTent_BCS" "_AR0726" + OUTER_SPRINT "EBaldursGate_BCS" "_AR0800" + OUTER_SPRINT "EBaldursGate_House6_L1_BCS" "_AR0801" + OUTER_SPRINT "EBaldursGate_House6_L2_BCS" "_AR0802" + OUTER_SPRINT "EBaldursGate_MaltzWeaponShop_L1_BCS" "_AR0803" + OUTER_SPRINT "EBaldursGate_MaltzWeaponShop_L2_BCS" "_AR0804" + OUTER_SPRINT "EBaldursGate_ArkionsHouse_L1_BCS" "_AR0805" + OUTER_SPRINT "EBaldursGate_ArkionsHouse_L2_BCS" "_AR0806" + OUTER_SPRINT "EBaldursGate_Inn_L1_BCS" "_AR0807" + OUTER_SPRINT "EBaldursGate_Inn_L2_BCS" "_AR0808" + OUTER_SPRINT "EBaldursGate_SilencesShop_BCS" "_AR0809" + OUTER_SPRINT "EBaldursGate_LuckyAellos_BCS" "_AR0810" + OUTER_SPRINT "EBaldursGate_House1_L1_BCS" "_AR0811" + OUTER_SPRINT "EBaldursGate_House1_L2_BCS" "_AR0812" + OUTER_SPRINT "SEBaldursGate_NemphresHouse_L1_BCS" "_AR0813" + OUTER_SPRINT "SEBaldursGate_NemphresHouse_L2_BCS" "_AR0814" + OUTER_SPRINT "WyrmsCrossing_BCS" "_AR0900" + OUTER_SPRINT "WyrmsCrossingTenyasHouse_BCS" "_AR0901" + OUTER_SPRINT "SWBaldursGate_BCS" "_AR1100" + OUTER_SPRINT "SWBaldursGate_WivensHouse_L1_BCS" "_AR1101" + OUTER_SPRINT "SWBaldursGate_WivensHouse_L2_BCS" "_AR1102" + OUTER_SPRINT "SWBaldursGate_House3_L1_BCS" "_AR1103" + OUTER_SPRINT "SWBaldursGate_House3_L2_BCS" "_AR1104" + OUTER_SPRINT "SWBaldursGate_House1_L1_BCS" "_AR1105" + OUTER_SPRINT "SWBaldursGate_House1_L2_BCS" "_AR1106" + OUTER_SPRINT "SWBaldursGate_House2_L1_BCS" "_AR1107" + OUTER_SPRINT "SWBaldursGate_House2_L2_BCS" "_AR1108" + OUTER_SPRINT "SWBaldursGate_Tavern_L1_BCS" "_AR1109" + OUTER_SPRINT "SWBaldursGate_Tavern_L2_BCS" "_AR1110" + OUTER_SPRINT "SWBaldursGate_SuninsHouse_BCS" "_AR1111" + OUTER_SPRINT "SWBaldursGate_WeaponsStore1_BCS" "_AR1112" + OUTER_SPRINT "SWBaldursGate_YeOldeInn_L1_BCS" "_AR1113" + OUTER_SPRINT "SWBaldursGate_YeOldeInn_L2_BCS" "_AR1114" + OUTER_SPRINT "SWBaldursGate_PotionsStore2_BCS" "_AR1115" + OUTER_SPRINT "SWBaldursGate_WeaponsStore2_BCS" "_AR1116" + OUTER_SPRINT "SWBaldursGate_PotionsStore1_BCS" "_AR1117" + OUTER_SPRINT "BaldursGateDocks_BCS" "_AR1200" + OUTER_SPRINT "BaldursGateDocks_OgreMagiHouse_L1_BCS" "_AR1201" + OUTER_SPRINT "BaldursGateDocks_OgreMagiHouse_L2_BCS" "_AR1202" + OUTER_SPRINT "BaldursGateDocks_House2_L1_BCS" "_AR1203" + OUTER_SPRINT "BaldursGateDocks_House2_L2_BCS" "_AR1204" + OUTER_SPRINT "BaldursGateDocks_House1_L1_BCS" "_AR1205" + OUTER_SPRINT "BaldursGateDocks_House1_L2_BCS" "_AR1206" + OUTER_SPRINT "BaldursGateDocks_BasiliskWarehouse_BCS" "_AR1207" + OUTER_SPRINT "BaldursGateDocks_NoraleesWarehouse_BCS" "_AR1208" + OUTER_SPRINT "BaldursGateDocks_LarriazHouse_L1_BCS" "_AR1209" + OUTER_SPRINT "BaldursGateDocks_LarriazHouse_L2_BCS" "_AR1210" + OUTER_SPRINT "BaldursGateDocks_GhoraksHouse_L1_BCS" "_AR1211" + OUTER_SPRINT "BaldursGateDocks_GhoraksHouse_L2_BCS" "_AR1212" + OUTER_SPRINT "BaldursGateDocks_CordyrsHouse_L1_BCS" "_AR1213" + OUTER_SPRINT "BaldursGateDocks_CordyrsHouse_L2_BCS" "_AR1214" + OUTER_SPRINT "BaldursGateDocks_JopalinsTavern_BCS" "_AR1215" + OUTER_SPRINT "SEBaldursGate_BCS" "_AR1300" + OUTER_SPRINT "SEBaldursGate_Warehouse_BCS" "_AR1301" + OUTER_SPRINT "SEBaldursGate_GeneralStore2_BCS" "_AR1302" + OUTER_SPRINT "SEBaldursGate_NadarinsWarehouse_BCS" "_AR1303" + OUTER_SPRINT "SEBaldursGate_House3_L1_BCS" "_AR1304" + OUTER_SPRINT "SEBaldursGate_House3_L2_BCS" "_AR1305" + OUTER_SPRINT "SEBaldursGate_Inn_L1_BCS" "_AR1306" + OUTER_SPRINT "SEBaldursGate_Inn_L2_BCS" "_AR1307" + OUTER_SPRINT "SEBaldursGate_House4_L1_BCS" "_AR1308" + OUTER_SPRINT "SEBaldursGate_House4_L2_BCS" "_AR1309" + OUTER_SPRINT "SEBaldursGate_House2_L1_BCS" "_AR1310" + OUTER_SPRINT "SEBaldursGate_House2_L2_BCS" "_AR1311" + OUTER_SPRINT "SEBaldursGate_GantolandansHouse_L1_BCS" "_AR1312" + OUTER_SPRINT "SEBaldursGate_GantolandansHouse_L2_BCS" "_AR1313" + OUTER_SPRINT "SEBaldursGate_House1_L1_BCS" "_AR1314" + OUTER_SPRINT "SEBaldursGate_House1_L2_BCS" "_AR1315" + OUTER_SPRINT "SEBaldursGate_TaxeksHouse_L1_BCS" "_AR1316" + OUTER_SPRINT "SEBaldursGate_TaxeksHouse_L2_BCS" "_AR1317" + OUTER_SPRINT "SEBaldursGate_GeneralStore1_BCS" "_AR1320" + OUTER_SPRINT "FishingVillage_BCS" "_AR1400" + OUTER_SPRINT "FishingVillage_AnkhegPit_BCS" "_AR1401" + OUTER_SPRINT "FishingVillage_House1_BCS" "_AR1402" + OUTER_SPRINT "FishingVillage_House2_BCS" "_AR1403" + OUTER_SPRINT "FishingVillage_FarmerBrunsHouse_BCS" "_AR1404" + OUTER_SPRINT "CloakwoodDruids_BCS" "_AR1600" + OUTER_SPRINT "CloakwoodDruids_Treehouse_L1_BCS" "_AR1601" + OUTER_SPRINT "CloakwoodDruids_Treehouse_L2_BCS" "_AR1602" + OUTER_SPRINT "CloakwoodDruids_PetersCave_BCS" "_AR1603" + OUTER_SPRINT "CloakwoodWyverns_BCS" "_AR1700" + OUTER_SPRINT "CloakwoodMines_BCS" "_AR1800" + OUTER_SPRINT "CloakwoodMines_L1_BCS" "_AR1801" + OUTER_SPRINT "CloakwoodMines_L3_BCS" "_AR1802" + OUTER_SPRINT "CloakwoodMines_L4_BCS" "_AR1803" + OUTER_SPRINT "CloakwoodMines_L2_BCS" "_AR1804" + OUTER_SPRINT "CloakwoodMines_Barracks_L1_BCS" "_AR1805" + OUTER_SPRINT "CloakwoodMines_Barracks_L2_BCS" "_AR1806" + OUTER_SPRINT "CloakwoodMines_MineLift_BCS" "_AR1807" + OUTER_SPRINT "CloakwoodMines_Storehouse_BCS" "_AR1808" + OUTER_SPRINT "CloakwoodMines_MineShed_BCS" "_AR1809" + OUTER_SPRINT "BanditCamp_BCS" "_AR1900" + OUTER_SPRINT "BanditCamp_RaemonsTent_BCS" "_AR1901" + OUTER_SPRINT "BanditCamp_Tent2_BCS" "_AR1902" + OUTER_SPRINT "BanditCamp_GnollCave_BCS" "_AR1903" + OUTER_SPRINT "BanditCamp_TersusTent_BCS" "_AR1904" + OUTER_SPRINT "BanditCamp_Tent1_BCS" "_AR1905" + OUTER_SPRINT "BanditCamp_Tent3_BCS" "_AR1906" + OUTER_SPRINT "BanditCamp_Tent4_BCS" "_AR1907" + OUTER_SPRINT "CloakwoodNest_BCS" "_AR2100" + OUTER_SPRINT "CloakwoodNestSpiderNest_BCS" "_AR2101" + OUTER_SPRINT "CloakwoodLodge_BCS" "_AR2200" + OUTER_SPRINT "CloakwoodLodgeHuntingLodge_BCS" "_AR2215" + OUTER_SPRINT "FriendlyArmInn_BCS" "_AR2300" + OUTER_SPRINT "FriendlyArmInn_L1_BCS" "_AR2301" + OUTER_SPRINT "FriendlyArmInn_L2_BCS" "_AR2302" + OUTER_SPRINT "FriendlyArmInn_L3_BCS" "_AR2303" + OUTER_SPRINT "FriendlyArmInn_TempleofWisdom_BCS" "_AR2304" + OUTER_SPRINT "FriendlyArmInn_House_BCS" "_AR2305" + OUTER_SPRINT "FriendlyArmInn_JoiasHouse_BCS" "_AR2306" + OUTER_SPRINT "Peldvale_BCS" "_AR2400" + OUTER_SPRINT "Candlekeep_BCS" "_AR2600" + OUTER_SPRINT "Candlekeep_PriestsQuarters_BCS" "_AR2602" + OUTER_SPRINT "Candlekeep_Infirmary_BCS" "_AR2605" + OUTER_SPRINT "Candlekeep_Storehouse_BCS" "_AR2606" + OUTER_SPRINT "Candlekeep_Bunkhouse_BCS" "_AR2607" + OUTER_SPRINT "Candlekeep_Library_L1_BCS" "_AR2608" + OUTER_SPRINT "Candlekeep_Library_L2_BCS" "_AR2609" + OUTER_SPRINT "Candlekeep_Library_L3_BCS" "_AR2610" + OUTER_SPRINT "Candlekeep_Library_L4_BCS" "_AR2611" + OUTER_SPRINT "Candlekeep_Library_L5_BCS" "_AR2612" + OUTER_SPRINT "Candlekeep_Catacombs_L1Antechamber_BCS" "_AR2613" + OUTER_SPRINT "Candlekeep_Library_L6_BCS" "_AR2614" + OUTER_SPRINT "Candlekeep_Catacombs_L1_BCS" "_AR2615" + OUTER_SPRINT "Candlekeep_Inn_L1_BCS" "_AR2616" + OUTER_SPRINT "Candlekeep_Inn_L2_BCS" "_AR2617" + OUTER_SPRINT "Candlekeep_Barracks_BCS" "_AR2618" + OUTER_SPRINT "Candlekeep_Catacombs_L2_BCS" "_AR2619" + OUTER_SPRINT "Candlekeep_Ch6_BCS" "_AR2626" + OUTER_SPRINT "Candlekeep_Ch6_PriestsQuarters_BCS" "_AR2627" + OUTER_SPRINT "Candlekeep_Ch6_Storehouse_BCS" "_AR2628" + OUTER_SPRINT "Candlekeep_Ch6_Inn_L1_BCS" "_AR2629" + OUTER_SPRINT "Candlekeep_Ch6_Inn_L2_BCS" "_AR2630" + OUTER_SPRINT "Candlekeep_Ch6_Barracks_BCS" "_AR2631" + OUTER_SPRINT "Candlekeep_Ch6_Bunkhouse_BCS" "_AR2632" + OUTER_SPRINT "Candlekeep_Ch6_Infirmary_BCS" "_AR2633" + OUTER_SPRINT "Candlekeep_ObesCellar_BCS" "_AR2643" + OUTER_SPRINT "LionsWay_BCS" "_AR2700" + OUTER_SPRINT "CoastWay_BCS" "_AR2800" + OUTER_SPRINT "Larswood_BCS" "_AR2900" + OUTER_SPRINT "SpiderWood_BCS" "_AR3000" + OUTER_SPRINT "ShipwrecksCoast_BCS" "_AR3100" + OUTER_SPRINT "HighHedge_BCS" "_AR3200" + OUTER_SPRINT "HighHedge_House_BCS" "_AR3201" + OUTER_SPRINT "HighHedge_ThalanthyrsAbode_BCS" "_AR3202" + OUTER_SPRINT "Beregost_BCS" "_AR3300" + OUTER_SPRINT "Beregost_ThunderhammerSmithy_BCS" "_AR3301" + OUTER_SPRINT "Beregost_House19_BCS" "_AR3302" + OUTER_SPRINT "Beregost_RedSheaf_L2_BCS" "_AR3303" + OUTER_SPRINT "Beregost_JovialJuggler_L1_BCS" "_AR3304" + OUTER_SPRINT "Beregost_JovialJuggler_L2F_BCS" "_AR3305" + OUTER_SPRINT "Beregost_JovialJuggler_L2R_BCS" "_AR3306" + OUTER_SPRINT "Beregost_BurningWizard_L1_BCS" "_AR3307" + OUTER_SPRINT "Beregost_BurningWizard_L2_BCS" "_AR3308" + OUTER_SPRINT "Beregost_House13_L1_BCS" "_AR3309" + OUTER_SPRINT "Beregost_House13_L2_BCS" "_AR3310" + OUTER_SPRINT "Beregost_House12_L1_BCS" "_AR3311" + OUTER_SPRINT "Beregost_House12_L2_BCS" "_AR3312" + OUTER_SPRINT "Beregost_MiriannesHouse_L1_BCS" "_AR3313" + OUTER_SPRINT "Beregost_MiriannesHouse_L2_BCS" "_AR3314" + OUTER_SPRINT "Beregost_LandrinsHouse_BCS" "_AR3315" + OUTER_SPRINT "Beregost_House18_BCS" "_AR3316" + OUTER_SPRINT "Beregost_House17_BCS" "_AR3317" + OUTER_SPRINT "Beregost_House15_BCS" "_AR3318" + OUTER_SPRINT "Beregost_House16_BCS" "_AR3319" + OUTER_SPRINT "Beregost_TravenhurstManor_L1_BCS" "_AR3320" + OUTER_SPRINT "Beregost_TravenhurstManor_L2_BCS" "_AR3321" + OUTER_SPRINT "Beregost_ServantsQuarters_BCS" "_AR3322" + OUTER_SPRINT "Beregost_House20_L1_BCS" "_AR3323" + OUTER_SPRINT "Beregost_House20_L2_BCS" "_AR3324" + OUTER_SPRINT "Beregost_House23_L1_BCS" "_AR3325" + OUTER_SPRINT "Beregost_House23_L2_BCS" "_AR3326" + OUTER_SPRINT "Beregost_House14_L1_BCS" "_AR3327" + OUTER_SPRINT "Beregost_House14_L2_BCS" "_AR3328" + OUTER_SPRINT "Beregost_House21_L1_BCS" "_AR3329" + OUTER_SPRINT "Beregost_House21_L2_BCS" "_AR3330" + OUTER_SPRINT "Beregost_House11_L1_BCS" "_AR3331" + OUTER_SPRINT "Beregost_House11_L2_BCS" "_AR3332" + OUTER_SPRINT "Beregost_FirebeadsHouse_L1_BCS" "_AR3333" + OUTER_SPRINT "Beregost_FirebeadsHouse_L2_BCS" "_AR3334" + OUTER_SPRINT "Beregost_House10_L1_BCS" "_AR3335" + OUTER_SPRINT "Beregost_House10_L2_BCS" "_AR3336" + OUTER_SPRINT "Beregost_House22_L1_BCS" "_AR3337" + OUTER_SPRINT "Beregost_House22_L2_BCS" "_AR3338" + OUTER_SPRINT "Beregost_House01_L1_BCS" "_AR3339" + OUTER_SPRINT "Beregost_House01_L2_BCS" "_AR3340" + OUTER_SPRINT "Beregost_House02_L1_BCS" "_AR3341" + OUTER_SPRINT "Beregost_House02_L2_BCS" "_AR3342" + OUTER_SPRINT "Beregost_House03_BCS" "_AR3343" + OUTER_SPRINT "Beregost_House07_BCS" "_AR3344" + OUTER_SPRINT "Beregost_House04_L1_BCS" "_AR3345" + OUTER_SPRINT "Beregost_House04_L2_BCS" "_AR3346" + OUTER_SPRINT "Beregost_House05_L1_BCS" "_AR3347" + OUTER_SPRINT "Beregost_House05_L2_BCS" "_AR3348" + OUTER_SPRINT "Beregost_House06_L1_BCS" "_AR3349" + OUTER_SPRINT "Beregost_House06_L2_BCS" "_AR3350" + OUTER_SPRINT "Beregost_FeldepostsInn_L1_BCS" "_AR3351" + OUTER_SPRINT "Beregost_FeldepostsInn_L2_BCS" "_AR3352" + OUTER_SPRINT "Beregost_KagainsStore_BCS" "_AR3353" + OUTER_SPRINT "Beregost_House09_BCS" "_AR3354" + OUTER_SPRINT "Beregost_House08_BCS" "_AR3355" + OUTER_SPRINT "Beregost_House08_L2_BCS" "_AR3356" + OUTER_SPRINT "Beregost_RedSheaf_L1_BCS" "_AR3357" + OUTER_SPRINT "Temple_BCS" "_AR3400" + OUTER_SPRINT "Temple_Vestibule_BCS" "_AR3401" + OUTER_SPRINT "Temple_SongoftheMorning_BCS" "_AR3402" + OUTER_SPRINT "MutaminsGarden_BCS" "_AR3500" + OUTER_SPRINT "Lighthouse_BCS" "_AR3600" + OUTER_SPRINT "Lighthouse_BlackAlaricsCave_BCS" "_AR3601" + OUTER_SPRINT "RedCanyons_BCS" "_AR3700" + OUTER_SPRINT "SouthBeregostRoad_BCS" "_AR3800" + OUTER_SPRINT "SouthBeregostRoad_Cave_BCS" "_AR3802" + OUTER_SPRINT "Ulcaster_BCS" "_AR3900" + OUTER_SPRINT "UlcasterRuins_BCS" "_AR3901" + OUTER_SPRINT "Gullykin_BCS" "_AR4000" + OUTER_SPRINT "Gullykin_JenkalsHouse_L1_BCS" "_AR4001" + OUTER_SPRINT "Gullykin_JenkalsHouse_Cellar_BCS" "_AR4002" + OUTER_SPRINT "Gullykin_Winery_L1_BCS" "_AR4003" + OUTER_SPRINT "Gullykin_Winery_Cellar_BCS" "_AR4004" + OUTER_SPRINT "Gullykin_House1_L1_BCS" "_AR4005" + OUTER_SPRINT "Gullykin_House1_Cellar_BCS" "_AR4006" + OUTER_SPRINT "Gullykin_House3_L1_BCS" "_AR4007" + OUTER_SPRINT "Gullykin_House3_Cellar_BCS" "_AR4008" + OUTER_SPRINT "Gullykin_House4_L1_BCS" "_AR4009" + OUTER_SPRINT "Gullykin_House4_Cellar_BCS" "_AR4010" + OUTER_SPRINT "Gullykin_House5_L1_BCS" "_AR4011" + OUTER_SPRINT "Gullykin_House5_Cellar_BCS" "_AR4012" + OUTER_SPRINT "Gullykin_House2_L1_BCS" "_AR4013" + OUTER_SPRINT "Gullykin_House2_Cellar_BCS" "_AR4014" + OUTER_SPRINT "ArchaeologicalSite_BCS" "_AR4100" + OUTER_SPRINT "ArchaeologicalSite_Tomb_BCS" "_AR4101" + OUTER_SPRINT "FishermansLake_BCS" "_AR4200" + OUTER_SPRINT "NorthNashkelRoad_BCS" "_AR4300" + OUTER_SPRINT "LonelyPeaks_BCS" "_AR4400" + OUTER_SPRINT "LonelyPeaks_Cave_BCS" "_AR4401" + OUTER_SPRINT "FirewineBridge_BCS" "_AR4500" + OUTER_SPRINT "CloakwoodWyverns_WyvernCave_BCS" "_AR4501" + OUTER_SPRINT "BearRiver_BCS" "_AR4600" + OUTER_SPRINT "XvartVillage_BCS" "_AR4700" + OUTER_SPRINT "XvartVillage_Cave_BCS" "_AR4701" + OUTER_SPRINT "Nashkel_BCS" "_AR4800" + OUTER_SPRINT "Nashkel_Inn_BCS" "_AR4801" + OUTER_SPRINT "Nashkel_TempleofHelm_BCS" "_AR4802" + OUTER_SPRINT "Nashkel_Store_BCS" "_AR4803" + OUTER_SPRINT "Nashkel_ManorHouse_L1_BCS" "_AR4804" + OUTER_SPRINT "Nashkel_ManorHouse_L2_BCS" "_AR4805" + OUTER_SPRINT "Nashkel_JosephsHouse_BCS" "_AR4806" + OUTER_SPRINT "Nashkel_House1_BCS" "_AR4807" + OUTER_SPRINT "Nashkel_House2_BCS" "_AR4808" + OUTER_SPRINT "Nashkel_BelchingDragonTavern_BCS" "_AR4809" + OUTER_SPRINT "Nashkel_Garrison_BCS" "_AR4810" + OUTER_SPRINT "NashkelCarnival_BCS" "_AR4900" + OUTER_SPRINT "NashkelCarnival_ArmorTent_BCS" "_AR4901" + OUTER_SPRINT "NashkelCarnival_LotusTent_BCS" "_AR4902" + OUTER_SPRINT "NashkelCarnival_VitiaresTent_BCS" "_AR4903" + OUTER_SPRINT "NashkelCarnival_GamblingTent_BCS" "_AR4904" + OUTER_SPRINT "NashkelCarnival_PotionTent_BCS" "_AR4905" + OUTER_SPRINT "NashkelCarnival_ZordralsTent_BCS" "_AR4906" + OUTER_SPRINT "NashkelCarnival_MagicItemsTent_BCS" "_AR4907" + OUTER_SPRINT "NashkelCarnival_MeleeWeaponsTent_BCS" "_AR4908" + OUTER_SPRINT "NashkelCarnival_RangedWeaponsTent_BCS" "_AR4909" + OUTER_SPRINT "ValleyoftheTombs_BCS" "_AR5000" + OUTER_SPRINT "ValleyoftheTombs_Tomb_BCS" "_AR5001" + OUTER_SPRINT "GnollStronghold_BCS" "_AR5100" + OUTER_SPRINT "GnollStronghold_XvartCave_BCS" "_AR5101" + OUTER_SPRINT "GnollStronghold_TomeCave_BCS" "_AR5102" + OUTER_SPRINT "GnollStronghold_CrawlerCave_BCS" "_AR5103" + OUTER_SPRINT "DryadFalls_BCS" "_AR5200" + OUTER_SPRINT "FirewineRuins_BCS" "_AR5201" + OUTER_SPRINT "DryadFalls_Cave_BCS" "_AR5202" + OUTER_SPRINT "FireLeafForest_BCS" "_AR5300" + OUTER_SPRINT "NashkelMines_BCS" "_AR5400" + OUTER_SPRINT "NashkelMines_L1_BCS" "_AR5401" + OUTER_SPRINT "NashkelMines_L2_BCS" "_AR5402" + OUTER_SPRINT "NashkelMines_L3_BCS" "_AR5403" + OUTER_SPRINT "NashkelMines_L4_BCS" "_AR5404" + OUTER_SPRINT "NashkelMines_MulaheysCave_BCS" "_AR5405" + OUTER_SPRINT "NashkelMines_Cabin_BCS" "_AR5406" + OUTER_SPRINT "GibberlingMountains_BCS" "_AR5500" + OUTER_SPRINT "CandlekeepCaves_BCS" "_AR5506" + OUTER_SPRINT "Encounter_Plains1_BCS" "_AR5600" + OUTER_SPRINT "Encounter_Plains2_BCS" "_AR5601" + OUTER_SPRINT "Encounter_Canyon1_BCS" "_AR5700" + OUTER_SPRINT "Encounter_Canyon2_BCS" "_AR5701" + OUTER_SPRINT "Encounter_Cliff1_BCS" "_AR5800" + OUTER_SPRINT "Encounter_Cliff2_BCS" "_AR5801" + OUTER_SPRINT "Encounter_Grassland1_BCS" "_AR5900" + OUTER_SPRINT "Encounter_Grassland2_BCS" "_AR5901" + OUTER_SPRINT "Encounter_Forest1_BCS" "_AR6000" + OUTER_SPRINT "Encounter_Forest2_BCS" "_AR6001" + OUTER_SPRINT "Encounter_Road_BCS" "_AR6100" + + /* TOTSC Areas scripts */ + OUTER_SPRINT "Farmlands_BCS" "_AR0400" + OUTER_SPRINT "FarmlandsFarmhouse_BCS" "_AR0401" + OUTER_SPRINT "DurlagsTower_BCS" "_AR0500" + OUTER_SPRINT "DurlagsTower_Cellar_BCS" "_AR0501" + OUTER_SPRINT "DurlagsTower_L1_BCS" "_AR0502" + OUTER_SPRINT "DurlagsTower_L2_BCS" "_AR0503" + OUTER_SPRINT "DurlagsTower_L3_BCS" "_AR0504" + OUTER_SPRINT "DurlagsTower_L4_BCS" "_AR0505" + OUTER_SPRINT "DurlagsTower_Chessboard_BCS" "_AR0506" + OUTER_SPRINT "DurlagsTower_IceChamber_BCS" "_AR0507" + OUTER_SPRINT "DurlagsTower_FireChamber_BCS" "_AR0508" + OUTER_SPRINT "DurlagsTower_AirChamber_BCS" "_AR0509" + OUTER_SPRINT "DurlagsTower_EarthChamber_BCS" "_AR0510" + OUTER_SPRINT "DurlagsTower_D1_BCS" "_AR0511" + OUTER_SPRINT "DurlagsTower_D2_BCS" "_AR0512" + OUTER_SPRINT "DurlagsTower_D3_BCS" "_AR0513" + OUTER_SPRINT "DurlagsTower_D4_BCS" "_AR0514" + OUTER_SPRINT "DurlagsTower_CompassRoom_BCS" "_AR0515" + OUTER_SPRINT "DurlagsTower_DemonknightsChamber_BCS" "_AR0516" + OUTER_SPRINT "IsleofBalduranN_BCS" "_AR1500" + OUTER_SPRINT "IsleofBalduranNShip_D1_BCS" "_AR1501" + OUTER_SPRINT "IsleofBalduranNShip_D2_BCS" "_AR1502" + OUTER_SPRINT "IsleofBalduranNShip_D3_BCS" "_AR1503" + OUTER_SPRINT "IsleofBalduranNShip_D4_BCS" "_AR1504" + OUTER_SPRINT "IsleofBalduranNDradeelsHouse_BCS" "_AR1505" + OUTER_SPRINT "IsleofBalduranS_BCS" "_AR2000" + OUTER_SPRINT "IsleofBalduranS_GreatHut_BCS" "_AR2001" + OUTER_SPRINT "IsleofBalduranS_KaishasHut_BCS" "_AR2002" + OUTER_SPRINT "IsleofBalduranS_LargeHut3_BCS" "_AR2003" + OUTER_SPRINT "IsleofBalduranS_LargeHut2_BCS" "_AR2004" + OUTER_SPRINT "IsleofBalduranS_LargeHut4_BCS" "_AR2005" + OUTER_SPRINT "IsleofBalduranS_LargeHut1_BCS" "_AR2006" + OUTER_SPRINT "IsleofBalduranS_HarborHut_BCS" "_AR2007" + OUTER_SPRINT "IsleofBalduranS_StoreHut2_BCS" "_AR2008" + OUTER_SPRINT "IsleofBalduranS_StoreHut1_BCS" "_AR2009" + OUTER_SPRINT "IsleofBalduranS_StoreHut4_BCS" "_AR2010" + OUTER_SPRINT "IsleofBalduranS_StoreHut3_BCS" "_AR2011" + OUTER_SPRINT "WerewolfCaverns_BCS" "_AR2012" + OUTER_SPRINT "UlgothsBeard_BCS" "_AR1000" + OUTER_SPRINT "UlgothsBeard_Inn_BCS" "_AR1001" + OUTER_SPRINT "UlgothsBeard_DemonsChamber_BCS" "_AR1002" + OUTER_SPRINT "UlgothsBeard_Storehouse_BCS" "_AR1003" + OUTER_SPRINT "UlgothsBeard_MendasHouse_BCS" "_AR1004" + OUTER_SPRINT "UlgothsBeard_TherellasHouse_BCS" "_AR1005" + OUTER_SPRINT "UlgothsBeard_House2_BCS" "_AR1006" + OUTER_SPRINT "UlgothsBeard_House1_BCS" "_AR1007" + OUTER_SPRINT "IceIsland_BCS" "_AR1008" + OUTER_SPRINT "IceIslandMaze_L1_BCS" "_AR1009" + OUTER_SPRINT "IceIslandMaze_L2_BCS" "_AR1010" +END diff --git a/iwdification/obg2_res/gshoutt.bam b/iwdification/obg2_res/gshoutt.bam new file mode 100644 index 0000000..5c6fbb3 Binary files /dev/null and b/iwdification/obg2_res/gshoutt.bam differ diff --git a/iwdification/obg2_res/gsolac1.bam b/iwdification/obg2_res/gsolac1.bam new file mode 100644 index 0000000..062f264 Binary files /dev/null and b/iwdification/obg2_res/gsolac1.bam differ diff --git a/iwdification/obg2_res/gsolac2.bam b/iwdification/obg2_res/gsolac2.bam new file mode 100644 index 0000000..e5c8b95 Binary files /dev/null and b/iwdification/obg2_res/gsolac2.bam differ diff --git a/iwdification/obg2_res/harmh.bam b/iwdification/obg2_res/harmh.bam new file mode 100644 index 0000000..be594ec Binary files /dev/null and b/iwdification/obg2_res/harmh.bam differ diff --git a/iwdification/obg2_res/icelant.bam b/iwdification/obg2_res/icelant.bam new file mode 100644 index 0000000..e7d51fd Binary files /dev/null and b/iwdification/obg2_res/icelant.bam differ diff --git a/iwdification/obg2_res/idobone.bam b/iwdification/obg2_res/idobone.bam new file mode 100644 index 0000000..11f22da Binary files /dev/null and b/iwdification/obg2_res/idobone.bam differ diff --git a/iwdification/obg2_res/idpro313.pro b/iwdification/obg2_res/idpro313.pro new file mode 100644 index 0000000..33030e7 Binary files /dev/null and b/iwdification/obg2_res/idpro313.pro differ diff --git a/iwdification/eff/immunity.eff b/iwdification/obg2_res/immunity.eff similarity index 100% rename from iwdification/eff/immunity.eff rename to iwdification/obg2_res/immunity.eff diff --git a/iwdification/obg2_res/invoch.bam b/iwdification/obg2_res/invoch.bam new file mode 100644 index 0000000..3448407 Binary files /dev/null and b/iwdification/obg2_res/invoch.bam differ diff --git a/iwdification/obg2_res/lodisrt.bam b/iwdification/obg2_res/lodisrt.bam new file mode 100644 index 0000000..5126dc0 Binary files /dev/null and b/iwdification/obg2_res/lodisrt.bam differ diff --git a/iwdification/obg2_res/mfmisst.bam b/iwdification/obg2_res/mfmisst.bam new file mode 100644 index 0000000..c7924a4 Binary files /dev/null and b/iwdification/obg2_res/mfmisst.bam differ diff --git a/iwdification/obg2_res/mfmissx.bam b/iwdification/obg2_res/mfmissx.bam new file mode 100644 index 0000000..f4216ef Binary files /dev/null and b/iwdification/obg2_res/mfmissx.bam differ diff --git a/iwdification/bam/cdid736v.bam b/iwdification/obg2_res/moeldaa.bam similarity index 100% rename from iwdification/bam/cdid736v.bam rename to iwdification/obg2_res/moeldaa.bam diff --git a/iwdification/obg2_res/mrageh.bam b/iwdification/obg2_res/mrageh.bam new file mode 100644 index 0000000..d14a46c Binary files /dev/null and b/iwdification/obg2_res/mrageh.bam differ diff --git a/iwdification/obg2_res/mragex.bam b/iwdification/obg2_res/mragex.bam new file mode 100644 index 0000000..116a97d Binary files /dev/null and b/iwdification/obg2_res/mragex.bam differ diff --git a/iwdification/obg2_res/msumm1h.bam b/iwdification/obg2_res/msumm1h.bam new file mode 100644 index 0000000..55113f1 Binary files /dev/null and b/iwdification/obg2_res/msumm1h.bam differ diff --git a/iwdification/obg2_res/msumm1x.bam b/iwdification/obg2_res/msumm1x.bam new file mode 100644 index 0000000..c9dce9c Binary files /dev/null and b/iwdification/obg2_res/msumm1x.bam differ diff --git a/iwdification/obg2_res/mswordh.bam b/iwdification/obg2_res/mswordh.bam new file mode 100644 index 0000000..689646a Binary files /dev/null and b/iwdification/obg2_res/mswordh.bam differ diff --git a/iwdification/obg2_res/mtouchh.bam b/iwdification/obg2_res/mtouchh.bam new file mode 100644 index 0000000..314e52f Binary files /dev/null and b/iwdification/obg2_res/mtouchh.bam differ diff --git a/iwdification/obg2_res/necroh.bam b/iwdification/obg2_res/necroh.bam new file mode 100644 index 0000000..f33cc46 Binary files /dev/null and b/iwdification/obg2_res/necroh.bam differ diff --git a/iwdification/obg2_res/ofsphet.bam b/iwdification/obg2_res/ofsphet.bam new file mode 100644 index 0000000..f4178df Binary files /dev/null and b/iwdification/obg2_res/ofsphet.bam differ diff --git a/iwdification/obg2_res/paralh.bam b/iwdification/obg2_res/paralh.bam new file mode 100644 index 0000000..2377868 Binary files /dev/null and b/iwdification/obg2_res/paralh.bam differ diff --git a/iwdification/obg2_res/paralh_ee.bam b/iwdification/obg2_res/paralh_ee.bam new file mode 100644 index 0000000..b39f083 Binary files /dev/null and b/iwdification/obg2_res/paralh_ee.bam differ diff --git a/iwdification/obg2_res/pfirea.bam b/iwdification/obg2_res/pfirea.bam new file mode 100644 index 0000000..1b5cedf Binary files /dev/null and b/iwdification/obg2_res/pfirea.bam differ diff --git a/iwdification/obg2_res/pfirex.bam b/iwdification/obg2_res/pfirex.bam new file mode 100644 index 0000000..b031946 Binary files /dev/null and b/iwdification/obg2_res/pfirex.bam differ diff --git a/iwdification/bam/cdiplybb.bam b/iwdification/obg2_res/pincers.bam similarity index 100% rename from iwdification/bam/cdiplybb.bam rename to iwdification/obg2_res/pincers.bam diff --git a/iwdification/obg2_res/rwotfah.bam b/iwdification/obg2_res/rwotfah.bam new file mode 100644 index 0000000..44656ff Binary files /dev/null and b/iwdification/obg2_res/rwotfah.bam differ diff --git a/iwdification/obg2_res/s5-20.itm b/iwdification/obg2_res/s5-20.itm new file mode 100644 index 0000000..7e9680e Binary files /dev/null and b/iwdification/obg2_res/s5-20.itm differ diff --git a/iwdification/obg2_res/schargh.bam b/iwdification/obg2_res/schargh.bam new file mode 100644 index 0000000..c3a003e Binary files /dev/null and b/iwdification/obg2_res/schargh.bam differ diff --git a/iwdification/obg2_res/sclouda.bam b/iwdification/obg2_res/sclouda.bam new file mode 100644 index 0000000..272b4e6 Binary files /dev/null and b/iwdification/obg2_res/sclouda.bam differ diff --git a/iwdification/obg2_res/scloudr.bam b/iwdification/obg2_res/scloudr.bam new file mode 100644 index 0000000..fb88aa2 Binary files /dev/null and b/iwdification/obg2_res/scloudr.bam differ diff --git a/iwdification/obg2_res/scroll.baf b/iwdification/obg2_res/scroll.baf new file mode 100644 index 0000000..9da21ea --- /dev/null +++ b/iwdification/obg2_res/scroll.baf @@ -0,0 +1,7 @@ +IF + Global("cd_iwdification_add","MYAREA",0) +THEN + RESPONSE #100 + SetGlobal("cd_iwdification_add","MYAREA",1) + ActionOverride("%params_1%",CreateItem("%item%",0,0,0)) +END diff --git a/iwdification/obg2_res/scroll_placement.tpa b/iwdification/obg2_res/scroll_placement.tpa new file mode 100644 index 0000000..280af38 --- /dev/null +++ b/iwdification/obg2_res/scroll_placement.tpa @@ -0,0 +1,336 @@ +///// \\\\\ +///// scatter some arcane scrolls \\\\\ +///// \\\\\ + +OUTER_SPRINT tutu_var "" + +ACTION_CLEAR_ARRAY cd_scroll_container +ACTION_CLEAR_ARRAY cd_scroll_creature + +COPY_EXISTING ~rndscrol.2da~ ~override~ // replace second grease with expeditous retreat + REPLACE_TEXTUALLY ~[ %TAB%]scrl66[ %TAB%]+scrl66[ %TAB%]~ ~ scrl66 %WIZARD_EXPEDITIOUS_RETREAT_SCROLL% ~ + PRETTY_PRINT_2DA + +// bg content +ACTION_IF GAME_IS ~eet bgee tutu tutu_totsc bgt~ BEGIN + ACTION_IF GAME_IS ~eet~ BEGIN INCLUDE ~EET/other/cpmvars/eet_cpmvars.tpa~ END + ACTION_IF GAME_IS ~bgee~ BEGIN INCLUDE ~%obg2_res_path%/g3_bgee_cpmvars.tpa~ END + ACTION_IF GAME_IS ~tutu tutu_totsc~ BEGIN INCLUDE ~%obg2_res_path%/g3_tutu_cpmvars.tpa~ END + ACTION_IF GAME_IS ~bgt~ BEGIN INCLUDE ~%obg2_res_path%/g3_bgt_cpmvars.tpa~ END + + ACTION_DEFINE_ASSOCIATIVE_ARRAY cd_scroll_container BEGIN + ~%SouthBeregostRoad_Cave_BCS%~ , Container1 => ~%WIZARD_EXPEDITIOUS_RETREAT_SCROLL%~ + ~%ValleyoftheTombs_Tomb_BCS%~ , Container1 => ~%WIZARD_SNILLOCS_SNOWBALL_SWARM_SCROLL%~ + ~%UlcasterRuins_BCS%~ , Body2 => ~%WIZARD_ICELANCE_SCROLL%~ + ~%BaldursGateDocks_IronThrone_L4_BCS%~ , Container8 => ~%WIZARD_EMOTION_COURAGE_SCROLL%~ + ~%IsleofBalduranNShip_D3_BCS%~ , Container8 => ~%WIZARD_EMOTION_FEAR_SCROLL%~ + ~%BanditCamp_Tent1_BCS%~ , Container2 => ~%WIZARD_SHADOW_MONSTERS_SCROLL%~ + ~%CloakwoodNestSpiderNest_BCS%~ , Container1 => ~%WIZARD_SHOUT_SCROLL%~ + ~%DurlagsTower_D2_BCS%~ , Container36 => ~%WIZARD_VITRIOLIC_SPHERE_SCROLL%~ + ~%Candlekeep_Catacombs_L1_BCS%~ , Container5 => ~%WIZARD_SHADOW_MONSTERS_SCROLL%~ + END + + ACTION_DEFINE_ASSOCIATIVE_ARRAY cd_scroll_creature BEGIN + ~%tutu_var%cuchol~ => ~%WIZARD_MORDENKAINENS_FORCE_MISSILES_SCROLL%~ + ~%tutu_var%jemby~ => ~%WIZARD_DECASTAVE_SCROLL%~ + END + + ACTION_IF VARIABLE_IS_SET WIZARD_CATS_GRACE_SCROLL BEGIN + + ACTION_DEFINE_ASSOCIATIVE_ARRAY cd_scroll_container BEGIN + ~%GnollStronghold_CrawlerCave_BCS%~ , carrio => ~%WIZARD_CATS_GRACE_SCROLL%~ + END + + END + + ACTION_IF GAME_INCLUDES sod BEGIN + + ACTION_DEFINE_ASSOCIATIVE_ARRAY cd_scroll_container BEGIN + bd1200 , Sarcophagus02 => ~%WIZARD_CONJURE_LESSER_WATER_ELEMENTAL_SCROLL%~ + bd2100 , chest => ~%WIZARD_EMOTION_HOPE_SCROLL%~ + bd0130 , Bookcase_secret02 => ~%WIZARD_SHROUD_OF_FLAME_SCROLL%~ + bd4300 , Shelf1 => ~%WIZARD_SUMMON_SHADOW_SCROLL%~ + END + + END + +END + +ACTION_IF GAME_IS ~eet bg2ee bgt bg2 tob~ BEGIN + + COPY_EXISTING ~ar0082.are~ ~override~ + ~ar0812.are~ ~override~ + WRITE_ASCIIE 0x94 ~%SOURCE_RES%~ #8 // assign area script + + ACTION_DEFINE_ASSOCIATIVE_ARRAY cd_scroll_container BEGIN + ar0082 , Container1 => ~%WIZARD_DECASTAVE_SCROLL%~ // crooked crane lich + ar0812 , Container1 => ~%WIZARD_LANCE_OF_DISRUPTION_SCROLL%~ // graveyard tomb + ar1904 , Container1 => ~%WIZARD_MORDENKAINENS_FORCE_MISSILES_SCROLL%~ // troll mound + ar0808 , Table1 => ~%WIZARD_VITRIOLIC_SPHERE_SCROLL%~ // bodhi's lair, ch 6 + ar1401 , Container10 => ~%WIZARD_CONJURE_WATER_ELEMENTAL_SCROLL%~ // shadow temple + ar0205 , Container6 => ~%WIZARD_DARTS_OF_BONE_SCROLL%~ // unseeing eye lair + ar2207 , Shelf2 => ~%WIZARD_ACID_STORM_SCROLL%~ // dierex + ar2300 , icbone01 => ~%WIZARD_MALAVONS_RAGE_SCROLL%~ // bone golem in sahuagin city + ar2400 , Container4 => ~%WIZARD_MONSTER_SUMMONING_5_SCROLL%~ // underdark illithid + ar1800 , Container1 => ~%WIZARD_GREAT_SHOUT_SCROLL%~ // north forest + ar2802 , Container4 => ~%WIZARD_MIND_BLANK_SCROLL%~ // suldanesselar home + END + + ACTION_IF VARIABLE_IS_SET WIZARD_SOUL_EATER_SCROLL BEGIN + + ACTION_DEFINE_ASSOCIATIVE_ARRAY cd_scroll_container BEGIN + ar1506 , Container2 => ~%WIZARD_SOUL_EATER_SCROLL%~ // asylum test, troll room + END + + END + + ACTION_DEFINE_ASSOCIATIVE_ARRAY cd_scroll_creature BEGIN + ~slmage2~ => ~%WIZARD_BELTYNS_BURNING_BLOOD_SCROLL%~ // slaver wizard in slums ship + ~firmag01~ => ~%WIZARD_ANTIMAGIC_SHELL_SCROLL%~ // conster, in firkraag's lair + ~ceskel01~ => ~%WIZARD_MONSTER_SUMMONING_4_SCROLL%~ // skel warrior in trademeet crypt + ~ppcowled~ => ~%WIZARD_SHADES_SCROLL%~ // perth in brynnlaw + ~hlmage~ => ~%WIZARD_SUFFOCATE_SCROLL%~ // controlled mage in sewer illithid lair + END + + ACTION_IF GAME_INCLUDES tob BEGIN + + COPY_EXISTING ~ar3022.are~ ~override~ + WRITE_ASCIIE 0x94 ~%SOURCE_RES%~ #8 // assign area script + + ACTION_DEFINE_ASSOCIATIVE_ARRAY cd_scroll_container BEGIN + ar3001 , Container24 => ~%WIZARD_LICH_TOUCH_SCROLL%~ // wk level 1 + ar3021 , Container5 => ~%WIZARD_OTILUKES_FREEZING_SPHERE_SCROLL%~ // wk 4, mind flayers + ar3022 , Container5 => ~%WIZARD_MONSTER_SUMMONING_7_SCROLL%~ // wk 4, githyanki + ar5006 , Container5 => ~%WIZARD_TROLLISH_FORTITUDE_SCROLL%~ // saradush prison + ar6300 , Container1 => ~%WIZARD_MORDENKAINENS_SWORD_IWD_SCROLL%~ // oasis + END + + ACTION_IF VARIABLE_IS_SET WIZARD_SEVEN_EYES_SCROLL BEGIN + + ACTION_DEFINE_ASSOCIATIVE_ARRAY cd_scroll_container BEGIN + ar5203 , Container1 => ~%WIZARD_SEVEN_EYES_SCROLL%~ // ys siege camp + END + + END + + ACTION_DEFINE_ASSOCIATIVE_ARRAY cd_scroll_creature BEGIN + ~dragblue~ => ~%WIZARD_ICELANCE_SCROLL%~ // abazigal + ~hgnya01~ => ~%WIZARD_EMOTION_FEAR_SCROLL%~ // nyalee + ~senlich~ => ~%WIZARD_IRON_BODY_SCROLL%~ // sendai's lich + END + + END + +END + +ACTION_PHP_EACH cd_scroll_container AS params => item BEGIN + + EXTEND_BOTTOM ~%params_0%.bcs~ ~%obg2_res_path%/scroll.baf~ EVALUATE_BUFFER + +END + +ACTION_PHP_EACH cd_scroll_creature AS creature => item BEGIN + + COPY_EXISTING ~%creature%.cre~ ~override~ // mage in fisherman's lake + ADD_CRE_ITEM ~%item%~ #0 #0 #0 ~NONE~ ~INV8~ + +END + +///// \\\\\ +///// assign a few to joinables for flavor \\\\\ +///// \\\\\ + +COPY_EXISTING ~aerie6.cre~ ~override~ + ~aerie7.cre~ ~override~ + ~aerie9.cre~ ~override~ + ~aerie10.cre~ ~override~ + ~aerie11.cre~ ~override~ + ~aerie12.cre~ ~override~ + READ_BYTE 0x273 class + PATCH_IF class = 14 BEGIN // sanity check, make sure we haven't been changed by some mod + READ_BYTE 0x235 mage_level + PATCH_IF mage_level > 2 BEGIN + ADD_KNOWN_SPELL ~%WIZARD_SNILLOCS_SNOWBALL_SWARM%~ #1 ~wizard~ + PATCH_IF mage_level > 6 BEGIN + ADD_KNOWN_SPELL ~%WIZARD_EMOTION_COURAGE%~ #3 ~wizard~ + END + END + END + BUT_ONLY IF_EXISTS + +COPY_EXISTING ~edwin7.cre~ ~override~ + ~edwin9.cre~ ~override~ + ~edwin11.cre~ ~override~ + ~edwin12.cre~ ~override~ + ~edwin13.cre~ ~override~ + ~edwin15.cre~ ~override~ + ~%tutu_var%edwin.cre~ ~override~ + ~%tutu_var%edwin2.cre~ ~override~ + ~%tutu_var%edwin4.cre~ ~override~ + ~%tutu_var%edwin6.cre~ ~override~ + READ_BYTE 0x273 class + READ_SHORT 0x246 kit + PATCH_IF ((class = 1) AND (kit = 0x80)) BEGIN // sanity check, make sure we haven't been changed by some mod + READ_BYTE 0x234 mage_level + PATCH_IF mage_level > 2 BEGIN + ADD_KNOWN_SPELL ~%WIZARD_SNILLOCS_SNOWBALL_SWARM%~ #1 ~wizard~ + PATCH_IF mage_level > 6 BEGIN + ADD_KNOWN_SPELL ~%WIZARD_VITRIOLIC_SPHERE%~ #3 ~wizard~ + PATCH_IF mage_level > 8 BEGIN + ADD_KNOWN_SPELL ~%WIZARD_SUMMON_SHADOW%~ #4 ~wizard~ + END + END + END + END + BUT_ONLY IF_EXISTS + +COPY_EXISTING ~haer10.cre~ ~override~ + ~haer11.cre~ ~override~ + ~haer13.cre~ ~override~ + ~haer15.cre~ ~override~ + ~haer19.cre~ ~override~ + READ_BYTE 0x273 class + READ_SHORT 0x246 kit + PATCH_IF ((class = 5) AND (kit = 0x400d)) BEGIN // sanity check, make sure we haven't been changed by some mod + READ_BYTE 0x234 mage_level + PATCH_IF mage_level > 6 BEGIN + ADD_KNOWN_SPELL ~%WIZARD_LANCE_OF_DISRUPTION%~ #2 ~wizard~ + PATCH_IF mage_level > 9 BEGIN + ADD_KNOWN_SPELL ~%WIZARD_MORDENKAINENS_FORCE_MISSILES%~ #3 ~wizard~ + END + END + END + BUT_ONLY IF_EXISTS + +COPY_EXISTING ~imoen6.cre~ ~override~ + ~imoen10.cre~ ~override~ + ~imoen15.cre~ ~override~ + ~imoen211.cre~ ~override~ + ~imoen213.cre~ ~override~ + READ_LONG 0x010 dual // block of flags including the dual-class bits + READ_BYTE 0x273 class + PATCH_IF ((class = 13) AND ((dual & BIT6) = BIT6)) BEGIN // sanity check, make sure we haven't been changed by some mod + READ_BYTE 0x234 mage_level + PATCH_IF mage_level > 2 BEGIN + PATCH_IF VARIABLE_IS_SET WIZARD_CATS_GRACE BEGIN + ADD_KNOWN_SPELL ~%WIZARD_CATS_GRACE%~ #1 ~wizard~ + END + PATCH_IF mage_level > 8 BEGIN + ADD_KNOWN_SPELL ~%WIZARD_DEMI_SHADOW_MONSTERS%~ #4 ~wizard~ + END + END + END + BUT_ONLY IF_EXISTS + +COPY_EXISTING ~jan8.cre~ ~override~ + ~jan10.cre~ ~override~ + ~jan11.cre~ ~override~ + ~jan12.cre~ ~override~ + ~jan15.cre~ ~override~ + READ_BYTE 0x273 class + PATCH_IF class = 13 BEGIN // sanity check, make sure we haven't been changed by some mod + READ_BYTE 0x234 mage_level + PATCH_IF mage_level > 6 BEGIN + ADD_KNOWN_SPELL ~%WIZARD_SHOUT%~ #3 ~wizard~ + ADD_KNOWN_SPELL ~%WIZARD_EMOTION_COURAGE%~ #3 ~wizard~ + ADD_KNOWN_SPELL ~%WIZARD_SHADOW_MONSTERS%~ #3 ~wizard~ + END + END + BUT_ONLY IF_EXISTS + +COPY_EXISTING ~nalia8.cre~ ~override~ + ~nalia10.cre~ ~override~ + ~nalia11.cre~ ~override~ + ~nalia13.cre~ ~override~ + ~nalia15.cre~ ~override~ + ~nalia18.cre~ ~override~ + READ_LONG 0x010 dual // block of flags including the dual-class bits + READ_BYTE 0x273 class + PATCH_IF ((class = 13) AND ((dual & BIT6) = BIT6)) BEGIN // sanity check, make sure we haven't been changed by some mod + READ_BYTE 0x234 mage_level + PATCH_IF mage_level > 4 BEGIN + ADD_KNOWN_SPELL ~%WIZARD_ICELANCE%~ #2 ~wizard~ + PATCH_IF mage_level > 8 BEGIN + ADD_KNOWN_SPELL ~%WIZARD_CONJURE_LESSER_WATER_ELEMENTAL%~ #4 ~wizard~ + END + END + END + BUT_ONLY IF_EXISTS + +COPY_EXISTING ~%tutu_var%dynahe.cre~ ~override~ + ~%tutu_var%dynahe2.cre~ ~override~ + ~%tutu_var%dynahe4.cre~ ~override~ + ~%tutu_var%dynahe6.cre~ ~override~ + READ_BYTE 0x273 class + READ_SHORT 0x246 kit + PATCH_IF ((class = 1) AND (kit = 0x800)) BEGIN // sanity check, make sure we haven't been changed by some mod + READ_BYTE 0x234 mage_level + PATCH_IF mage_level > 4 BEGIN + ADD_KNOWN_SPELL ~%WIZARD_LANCE_OF_DISRUPTION%~ #2 ~wizard~ + END + END + BUT_ONLY IF_EXISTS + +COPY_EXISTING ~%tutu_var%eldoth.cre~ ~override~ + ~%tutu_var%eldoth5.cre~ ~override~ + READ_BYTE 0x273 class + PATCH_IF class = 5 BEGIN // sanity check, make sure we haven't been changed by some mod + READ_BYTE 0x234 mage_level + PATCH_IF mage_level > 3 BEGIN + ADD_KNOWN_SPELL ~%WIZARD_SNILLOCS_SNOWBALL_SWARM%~ #1 ~wizard~ + END + END + BUT_ONLY IF_EXISTS + +COPY_EXISTING ~%tutu_var%garric.cre~ ~override~ + ~%tutu_var%garric2.cre~ ~override~ + ~%tutu_var%garric4.cre~ ~override~ + ~%tutu_var%garric6.cre~ ~override~ + READ_BYTE 0x273 class + PATCH_IF class = 5 BEGIN // sanity check, make sure we haven't been changed by some mod + READ_BYTE 0x234 mage_level + PATCH_IF mage_level > 1 BEGIN + ADD_KNOWN_SPELL ~%WIZARD_EXPEDITIOUS_RETREAT%~ #0 ~wizard~ + END + END + BUT_ONLY IF_EXISTS + +COPY_EXISTING ~%tutu_var%quayle.cre~ ~override~ + ~%tutu_var%quayle4.cre~ ~override~ + ~%tutu_var%quayle6.cre~ ~override~ + READ_BYTE 0x273 class + READ_SHORT 0x246 kit + PATCH_IF ((class = 14) AND (kit = 0x400)) BEGIN // sanity check, make sure we haven't been changed by some mod + READ_BYTE 0x235 mage_level + PATCH_IF mage_level > 2 BEGIN + PATCH_IF VARIABLE_IS_SET WIZARD_CATS_GRACE BEGIN + ADD_KNOWN_SPELL ~%WIZARD_CATS_GRACE%~ #1 ~wizard~ + END + END + END + BUT_ONLY IF_EXISTS + +COPY_EXISTING ~%tutu_var%xan.cre~ ~override~ + ~%tutu_var%xan4.cre~ ~override~ + ~%tutu_var%xan6.cre~ ~override~ + READ_BYTE 0x273 class + READ_SHORT 0x246 kit + PATCH_IF ((class = 1) AND (kit = 0x200)) BEGIN // sanity check, make sure we haven't been changed by some mod + ADD_KNOWN_SPELL ~%WIZARD_EXPEDITIOUS_RETREAT%~ #1 ~wizard~ + END + BUT_ONLY IF_EXISTS + +COPY_EXISTING ~%tutu_var%xzar.cre~ ~override~ + ~%tutu_var%xzar2.cre~ ~override~ + ~%tutu_var%xzar4.cre~ ~override~ + ~%tutu_var%xzar6.cre~ ~override~ + READ_BYTE 0x273 class + READ_SHORT 0x246 kit + PATCH_IF ((class = 1) AND (kit = 0x1000)) BEGIN // sanity check, make sure we haven't been changed by some mod + READ_BYTE 0x234 mage_level + PATCH_IF mage_level > 2 BEGIN + ADD_KNOWN_SPELL ~%WIZARD_DECASTAVE%~ #1 ~wizard~ + END + END + BUT_ONLY IF_EXISTS + \ No newline at end of file diff --git a/iwdification/obg2_res/sgrowta.bam b/iwdification/obg2_res/sgrowta.bam new file mode 100644 index 0000000..d1c27f7 Binary files /dev/null and b/iwdification/obg2_res/sgrowta.bam differ diff --git a/iwdification/obg2_res/sgrowtx.bam b/iwdification/obg2_res/sgrowtx.bam new file mode 100644 index 0000000..b8ddb32 Binary files /dev/null and b/iwdification/obg2_res/sgrowtx.bam differ diff --git a/iwdification/obg2_res/shoutt.bam b/iwdification/obg2_res/shoutt.bam new file mode 100644 index 0000000..440a82d Binary files /dev/null and b/iwdification/obg2_res/shoutt.bam differ diff --git a/iwdification/obg2_res/soflamc.bam b/iwdification/obg2_res/soflamc.bam new file mode 100644 index 0000000..60a0000 Binary files /dev/null and b/iwdification/obg2_res/soflamc.bam differ diff --git a/iwdification/obg2_res/sohopex.bam b/iwdification/obg2_res/sohopex.bam new file mode 100644 index 0000000..9eff3fe Binary files /dev/null and b/iwdification/obg2_res/sohopex.bam differ diff --git a/iwdification/obg2_res/solatc1.bam b/iwdification/obg2_res/solatc1.bam new file mode 100644 index 0000000..d491650 Binary files /dev/null and b/iwdification/obg2_res/solatc1.bam differ diff --git a/iwdification/obg2_res/solatc2.bam b/iwdification/obg2_res/solatc2.bam new file mode 100644 index 0000000..68f0fb4 Binary files /dev/null and b/iwdification/obg2_res/solatc2.bam differ diff --git a/iwdification/bam/cdid618a.bam b/iwdification/obg2_res/sppr616a.bam similarity index 100% rename from iwdification/bam/cdid618a.bam rename to iwdification/obg2_res/sppr616a.bam diff --git a/iwdification/obg2_res/spwi516a.bam b/iwdification/obg2_res/spwi516a.bam new file mode 100644 index 0000000..215597f Binary files /dev/null and b/iwdification/obg2_res/spwi516a.bam differ diff --git a/iwdification/obg2_res/spwi516b.bam b/iwdification/obg2_res/spwi516b.bam new file mode 100644 index 0000000..866c6e2 Binary files /dev/null and b/iwdification/obg2_res/spwi516b.bam differ diff --git a/iwdification/obg2_res/spwi516c.bam b/iwdification/obg2_res/spwi516c.bam new file mode 100644 index 0000000..b32effb Binary files /dev/null and b/iwdification/obg2_res/spwi516c.bam differ diff --git a/iwdification/obg2_res/spwi520a.bam b/iwdification/obg2_res/spwi520a.bam new file mode 100644 index 0000000..8daa9f9 Binary files /dev/null and b/iwdification/obg2_res/spwi520a.bam differ diff --git a/iwdification/obg2_res/spwi520b.bam b/iwdification/obg2_res/spwi520b.bam new file mode 100644 index 0000000..40e54b4 Binary files /dev/null and b/iwdification/obg2_res/spwi520b.bam differ diff --git a/iwdification/obg2_res/spwi520c.bam b/iwdification/obg2_res/spwi520c.bam new file mode 100644 index 0000000..6dd5e3c Binary files /dev/null and b/iwdification/obg2_res/spwi520c.bam differ diff --git a/iwdification/obg2_res/spwi521a.bam b/iwdification/obg2_res/spwi521a.bam new file mode 100644 index 0000000..92e4cc8 Binary files /dev/null and b/iwdification/obg2_res/spwi521a.bam differ diff --git a/iwdification/obg2_res/spwi521b.bam b/iwdification/obg2_res/spwi521b.bam new file mode 100644 index 0000000..5ffb060 Binary files /dev/null and b/iwdification/obg2_res/spwi521b.bam differ diff --git a/iwdification/obg2_res/spwi521c.bam b/iwdification/obg2_res/spwi521c.bam new file mode 100644 index 0000000..23c7d48 Binary files /dev/null and b/iwdification/obg2_res/spwi521c.bam differ diff --git a/iwdification/obg2_res/spwi601a.bam b/iwdification/obg2_res/spwi601a.bam new file mode 100644 index 0000000..d266c62 Binary files /dev/null and b/iwdification/obg2_res/spwi601a.bam differ diff --git a/iwdification/obg2_res/spwi601b.bam b/iwdification/obg2_res/spwi601b.bam new file mode 100644 index 0000000..b55bb31 Binary files /dev/null and b/iwdification/obg2_res/spwi601b.bam differ diff --git a/iwdification/obg2_res/spwi601c.bam b/iwdification/obg2_res/spwi601c.bam new file mode 100644 index 0000000..b5d6b8b Binary files /dev/null and b/iwdification/obg2_res/spwi601c.bam differ diff --git a/iwdification/obg2_res/sshellc.bam b/iwdification/obg2_res/sshellc.bam new file mode 100644 index 0000000..6c2e7ce Binary files /dev/null and b/iwdification/obg2_res/sshellc.bam differ diff --git a/iwdification/obg2_res/ssswarr.bam b/iwdification/obg2_res/ssswarr.bam new file mode 100644 index 0000000..cb82dfb Binary files /dev/null and b/iwdification/obg2_res/ssswarr.bam differ diff --git a/iwdification/obg2_res/ssswart.bam b/iwdification/obg2_res/ssswart.bam new file mode 100644 index 0000000..4c47a78 Binary files /dev/null and b/iwdification/obg2_res/ssswart.bam differ diff --git a/iwdification/obg2_res/ssswarx.bam b/iwdification/obg2_res/ssswarx.bam new file mode 100644 index 0000000..498a83a Binary files /dev/null and b/iwdification/obg2_res/ssswarx.bam differ diff --git a/iwdification/bam/cdistone.bam b/iwdification/obg2_res/sstonea.bam similarity index 100% rename from iwdification/bam/cdistone.bam rename to iwdification/obg2_res/sstonea.bam diff --git a/iwdification/obg2_res/suffoca.bam b/iwdification/obg2_res/suffoca.bam new file mode 100644 index 0000000..c65cdff Binary files /dev/null and b/iwdification/obg2_res/suffoca.bam differ diff --git a/iwdification/obg2_res/sunscoh.bam b/iwdification/obg2_res/sunscoh.bam new file mode 100644 index 0000000..e81ae1e Binary files /dev/null and b/iwdification/obg2_res/sunscoh.bam differ diff --git a/iwdification/obg2_res/tra_18.wav b/iwdification/obg2_res/tra_18.wav new file mode 100644 index 0000000..92b7849 Binary files /dev/null and b/iwdification/obg2_res/tra_18.wav differ diff --git a/iwdification/obg2_res/tra_55.wav b/iwdification/obg2_res/tra_55.wav new file mode 100644 index 0000000..8f65b61 Binary files /dev/null and b/iwdification/obg2_res/tra_55.wav differ diff --git a/iwdification/obg2_res/tra_56.wav b/iwdification/obg2_res/tra_56.wav new file mode 100644 index 0000000..fddb9b7 Binary files /dev/null and b/iwdification/obg2_res/tra_56.wav differ diff --git a/iwdification/obg2_res/tra_59.wav b/iwdification/obg2_res/tra_59.wav new file mode 100644 index 0000000..ce26640 Binary files /dev/null and b/iwdification/obg2_res/tra_59.wav differ diff --git a/iwdification/obg2_res/tsprayt.bam b/iwdification/obg2_res/tsprayt.bam new file mode 100644 index 0000000..c20c29c Binary files /dev/null and b/iwdification/obg2_res/tsprayt.bam differ diff --git a/iwdification/obg2_res/uwardx.bam b/iwdification/obg2_res/uwardx.bam new file mode 100644 index 0000000..6f7e07a Binary files /dev/null and b/iwdification/obg2_res/uwardx.bam differ diff --git a/iwdification/obg2_res/vsphert.bam b/iwdification/obg2_res/vsphert.bam new file mode 100644 index 0000000..2d82f9c Binary files /dev/null and b/iwdification/obg2_res/vsphert.bam differ diff --git a/iwdification/obg2_res/vspherx.bam b/iwdification/obg2_res/vspherx.bam new file mode 100644 index 0000000..e87d3f7 Binary files /dev/null and b/iwdification/obg2_res/vspherx.bam differ diff --git a/iwdification/obg2_res/whirlwx.vvc b/iwdification/obg2_res/whirlwx.vvc new file mode 100644 index 0000000..3646e34 Binary files /dev/null and b/iwdification/obg2_res/whirlwx.vvc differ diff --git a/iwdification/baf/zosa.baf b/iwdification/obg2_res/zosa.baf similarity index 91% rename from iwdification/baf/zosa.baf rename to iwdification/obg2_res/zosa.baf index 1f36a22..6559b0d 100644 --- a/iwdification/baf/zosa.baf +++ b/iwdification/obg2_res/zosa.baf @@ -1,16 +1,16 @@ -/* -IF - OR(1) - InMyArea("cdid613") -THEN - RESPONSE #100 - DestroySelf() -END -*/ - -IF - !Global("CDIZOSA","GLOBAL",0) -THEN - RESPONSE #100 - DestroySelf() +/* +IF + OR(1) + InMyArea("cdid613") +THEN + RESPONSE #100 + DestroySelf() +END +*/ + +IF + !Global("CDIZOSA","GLOBAL",0) +THEN + RESPONSE #100 + DestroySelf() END \ No newline at end of file diff --git a/iwdification/pro/cdi207.pro b/iwdification/pro/cdi207.pro deleted file mode 100644 index 142d95b..0000000 Binary files a/iwdification/pro/cdi207.pro and /dev/null differ diff --git a/iwdification/pro/cdi209.pro b/iwdification/pro/cdi209.pro deleted file mode 100644 index 857f2b2..0000000 Binary files a/iwdification/pro/cdi209.pro and /dev/null differ diff --git a/iwdification/pro/cdi211.pro b/iwdification/pro/cdi211.pro deleted file mode 100644 index a14118e..0000000 Binary files a/iwdification/pro/cdi211.pro and /dev/null differ diff --git a/iwdification/pro/cdi211a.pro b/iwdification/pro/cdi211a.pro deleted file mode 100644 index ae68b1b..0000000 Binary files a/iwdification/pro/cdi211a.pro and /dev/null differ diff --git a/iwdification/pro/cdi213.pro b/iwdification/pro/cdi213.pro deleted file mode 100644 index 66d9a1c..0000000 Binary files a/iwdification/pro/cdi213.pro and /dev/null differ diff --git a/iwdification/pro/cdi213a.pro b/iwdification/pro/cdi213a.pro deleted file mode 100644 index b07ad6d..0000000 Binary files a/iwdification/pro/cdi213a.pro and /dev/null differ diff --git a/iwdification/pro/cdi215.pro b/iwdification/pro/cdi215.pro deleted file mode 100644 index 31e6ff1..0000000 Binary files a/iwdification/pro/cdi215.pro and /dev/null differ diff --git a/iwdification/pro/cdi217.pro b/iwdification/pro/cdi217.pro deleted file mode 100644 index f8f1b99..0000000 Binary files a/iwdification/pro/cdi217.pro and /dev/null differ diff --git a/iwdification/pro/cdi237.pro b/iwdification/pro/cdi237.pro deleted file mode 100644 index 1fb5d69..0000000 Binary files a/iwdification/pro/cdi237.pro and /dev/null differ diff --git a/iwdification/pro/cdi251.pro b/iwdification/pro/cdi251.pro deleted file mode 100644 index 8b4003a..0000000 Binary files a/iwdification/pro/cdi251.pro and /dev/null differ diff --git a/iwdification/pro/cdi255.pro b/iwdification/pro/cdi255.pro deleted file mode 100644 index 2571e3c..0000000 Binary files a/iwdification/pro/cdi255.pro and /dev/null differ diff --git a/iwdification/pro/cdi266.pro b/iwdification/pro/cdi266.pro deleted file mode 100644 index 0a88dbc..0000000 Binary files a/iwdification/pro/cdi266.pro and /dev/null differ diff --git a/iwdification/pro/cdi269.pro b/iwdification/pro/cdi269.pro deleted file mode 100644 index 2233dfa..0000000 Binary files a/iwdification/pro/cdi269.pro and /dev/null differ diff --git a/iwdification/pro/cdi277.pro b/iwdification/pro/cdi277.pro deleted file mode 100644 index 6873c24..0000000 Binary files a/iwdification/pro/cdi277.pro and /dev/null differ diff --git a/iwdification/pro/cdi281.pro b/iwdification/pro/cdi281.pro deleted file mode 100644 index 5508aea..0000000 Binary files a/iwdification/pro/cdi281.pro and /dev/null differ diff --git a/iwdification/pro/cdi282.pro b/iwdification/pro/cdi282.pro deleted file mode 100644 index f6473dc..0000000 Binary files a/iwdification/pro/cdi282.pro and /dev/null differ diff --git a/iwdification/pro/cdi298.pro b/iwdification/pro/cdi298.pro deleted file mode 100644 index 658c0cc..0000000 Binary files a/iwdification/pro/cdi298.pro and /dev/null differ diff --git a/iwdification/pro/cdi299.pro b/iwdification/pro/cdi299.pro deleted file mode 100644 index cfe631c..0000000 Binary files a/iwdification/pro/cdi299.pro and /dev/null differ diff --git a/iwdification/pro/cdi300.pro b/iwdification/pro/cdi300.pro deleted file mode 100644 index a0a333e..0000000 Binary files a/iwdification/pro/cdi300.pro and /dev/null differ diff --git a/iwdification/pro/cdi300a.pro b/iwdification/pro/cdi300a.pro deleted file mode 100644 index b07ad6d..0000000 Binary files a/iwdification/pro/cdi300a.pro and /dev/null differ diff --git a/iwdification/pro/cdi301.pro b/iwdification/pro/cdi301.pro deleted file mode 100644 index 99a4f46..0000000 Binary files a/iwdification/pro/cdi301.pro and /dev/null differ diff --git a/iwdification/pro/cdi301a.pro b/iwdification/pro/cdi301a.pro deleted file mode 100644 index b07ad6d..0000000 Binary files a/iwdification/pro/cdi301a.pro and /dev/null differ diff --git a/iwdification/pro/cdi303.pro b/iwdification/pro/cdi303.pro deleted file mode 100644 index c309b3e..0000000 Binary files a/iwdification/pro/cdi303.pro and /dev/null differ diff --git a/iwdification/pro/cdi307.pro b/iwdification/pro/cdi307.pro deleted file mode 100644 index c52f953..0000000 Binary files a/iwdification/pro/cdi307.pro and /dev/null differ diff --git a/iwdification/pro/cdi307a.pro b/iwdification/pro/cdi307a.pro deleted file mode 100644 index d7bc3b3..0000000 Binary files a/iwdification/pro/cdi307a.pro and /dev/null differ diff --git a/iwdification/pro/cdi309.pro b/iwdification/pro/cdi309.pro deleted file mode 100644 index 3b03ad5..0000000 Binary files a/iwdification/pro/cdi309.pro and /dev/null differ diff --git a/iwdification/pro/cdi309a.pro b/iwdification/pro/cdi309a.pro deleted file mode 100644 index b07ad6d..0000000 Binary files a/iwdification/pro/cdi309a.pro and /dev/null differ diff --git a/iwdification/pro/cdi312.pro b/iwdification/pro/cdi312.pro deleted file mode 100644 index 514e604..0000000 Binary files a/iwdification/pro/cdi312.pro and /dev/null differ diff --git a/iwdification/pro/cdi313.pro b/iwdification/pro/cdi313.pro deleted file mode 100644 index cfd5c1a..0000000 Binary files a/iwdification/pro/cdi313.pro and /dev/null differ diff --git a/iwdification/pro/cdi313a.pro b/iwdification/pro/cdi313a.pro deleted file mode 100644 index 251f546..0000000 Binary files a/iwdification/pro/cdi313a.pro and /dev/null differ diff --git a/iwdification/pro/cdi315.pro b/iwdification/pro/cdi315.pro deleted file mode 100644 index e77ff2b..0000000 Binary files a/iwdification/pro/cdi315.pro and /dev/null differ diff --git a/iwdification/pro/cdi316.pro b/iwdification/pro/cdi316.pro deleted file mode 100644 index 63dee55..0000000 Binary files a/iwdification/pro/cdi316.pro and /dev/null differ diff --git a/iwdification/pro/cdi317.pro b/iwdification/pro/cdi317.pro deleted file mode 100644 index 0f87710..0000000 Binary files a/iwdification/pro/cdi317.pro and /dev/null differ diff --git a/iwdification/pro/cdi317a.pro b/iwdification/pro/cdi317a.pro deleted file mode 100644 index b07ad6d..0000000 Binary files a/iwdification/pro/cdi317a.pro and /dev/null differ diff --git a/iwdification/pro/cdi319.pro b/iwdification/pro/cdi319.pro deleted file mode 100644 index 05c1251..0000000 Binary files a/iwdification/pro/cdi319.pro and /dev/null differ diff --git a/iwdification/pro/cdi407.pro b/iwdification/pro/cdi407.pro deleted file mode 100644 index d4efc95..0000000 Binary files a/iwdification/pro/cdi407.pro and /dev/null differ diff --git a/iwdification/pro/cdimfm.pro b/iwdification/pro/cdimfm.pro deleted file mode 100644 index a7b0283..0000000 Binary files a/iwdification/pro/cdimfm.pro and /dev/null differ diff --git a/iwdification/pro/cdimfm2.pro b/iwdification/pro/cdimfm2.pro deleted file mode 100644 index cef8a0e..0000000 Binary files a/iwdification/pro/cdimfm2.pro and /dev/null differ diff --git a/iwdification/pro/cdisalau.pro b/iwdification/pro/cdisalau.pro deleted file mode 100644 index 92a3f15..0000000 Binary files a/iwdification/pro/cdisalau.pro and /dev/null differ diff --git a/iwdification/pro/cdishrod.pro b/iwdification/pro/cdishrod.pro deleted file mode 100644 index 3f179e5..0000000 Binary files a/iwdification/pro/cdishrod.pro and /dev/null differ diff --git a/iwdification/pro/cdisunsc.pro b/iwdification/pro/cdisunsc.pro deleted file mode 100644 index e0ce3fb..0000000 Binary files a/iwdification/pro/cdisunsc.pro and /dev/null differ diff --git a/iwdification/pro/cdiswave.pro b/iwdification/pro/cdiswave.pro deleted file mode 100644 index 1f1f41a..0000000 Binary files a/iwdification/pro/cdiswave.pro and /dev/null differ diff --git a/iwdification/pro/cdiuward.pro b/iwdification/pro/cdiuward.pro deleted file mode 100644 index 8a8727b..0000000 Binary files a/iwdification/pro/cdiuward.pro and /dev/null differ diff --git a/iwdification/pro/cdivrnp.pro b/iwdification/pro/cdivrnp.pro deleted file mode 100644 index 9e42386..0000000 Binary files a/iwdification/pro/cdivrnp.pro and /dev/null differ diff --git a/iwdification/pro/cdivrpo.pro b/iwdification/pro/cdivrpo.pro deleted file mode 100644 index 7610b16..0000000 Binary files a/iwdification/pro/cdivrpo.pro and /dev/null differ diff --git a/iwdification/pro/cdiwallm.pro b/iwdification/pro/cdiwallm.pro deleted file mode 100644 index a0c6a80..0000000 Binary files a/iwdification/pro/cdiwallm.pro and /dev/null differ diff --git a/iwdification/pro/cdiwhira.pro b/iwdification/pro/cdiwhira.pro deleted file mode 100644 index ac62db9..0000000 Binary files a/iwdification/pro/cdiwhira.pro and /dev/null differ diff --git a/iwdification/pro/cdiwhirl.pro b/iwdification/pro/cdiwhirl.pro deleted file mode 100644 index 8913f0e..0000000 Binary files a/iwdification/pro/cdiwhirl.pro and /dev/null differ diff --git a/iwdification/readme-iwdification.html b/iwdification/readme-iwdification.html index 0ee8ce6..21faa8b 100644 --- a/iwdification/readme-iwdification.html +++ b/iwdification/readme-iwdification.html @@ -29,10 +29,13 @@

IWDification

A Gibberlings Three Mod
- Authors:
CamDawg and DavidW

-

Version Beta 6
- Languages: English
+ Languages: English, French
Platforms: Windows, Mac OS X, and Linux
GitHub: Gibberlings3/iwdification

@@ -43,10 +46,9 @@

Overview

-

IWDification is a mod to bring some of the elements of Icewind Dale into the Baldur's Gate series of games. A lot of this project is based upon the work of the IWD-in-BG2 conversion project, which later formed the backbone of IWDEE.

-

The mod is currently an open beta so expect some bugs here and there. Please report them on the forums so that they can be addressed.

+

IWDification is a mod to bring some of the elements of Icewind Dale into the Baldur's Gate series of games. A lot of this project is based upon the work of the discontinued IWD-in-BG2 conversion project, which later formed the backbone of IWDEE.

+

Please report any bugs on the forums so that they can be addressed.

-

 

Compatibility

@@ -56,12 +58,10 @@

Compatibility

IWDification works on all IE games that use the Baldur's Gate II engine, which includes the original Baldur's Gate II (Shadows of Amn with or without Throne of Bhaal), the two major Baldur's Gate conversion mods (Tutu and BGT), and the Enhanced Editions of Baldur's Gate and Baldur's Gate II. Content will be adjusted as appropriate for the detected platform--e.g. no +5 items or ninth level spells will be added to a Tutu or BGEE game.

-

For EE games:

-

- All arcane and divine spells are available. In addition, the animations from IWD will be used for various summons--e.g. the shadows summoned by the spell Shades will use the IWD 'large shadow' animation, umber hulks and trolls from Monster Summoning will look like IWD hulks and trolls, etc.

-

For non-EE games:

-

TobEx is highly recommended for players using the spell packs on the original games. Without TobEx, spell selection screens during character creation are limited to 24 spells, as are spellbook pages. Since there are more than 24 spells available at some levels you will not be able to see all spells available or be able to select them. Cat's Grace, a second-level arcane spell, relies on functionality provided by TobEx and will be skipped if it's not detected.

-

The fourth-level divine spell Giant Insect relies on Infinity Animations, as the beetles summoned by the spell do not have animations in the original BG2, and will be skipped without the mod being installed. One of the summons (yeti) for the sixth-level arcane spell Monster Summoning IV will not be available without Infinity Animations, though the spell will otherwise work with the other two summon options. Polymorph Self will also have an additional option, Boring Beetle, if IA is installed. If IWD animations are detected, they will be used for varous summons, as they are for EE games.

+

For non-EE games:

+

You will see references to "original" or "vanilla" BG2 to differentiate it from the Enhanced Editions. Note that this includes any installation running on the original BG2 engine, notably BGT or Tutu.

+

TobEx is highly recommended for players using the spell packs on the original games. Without TobEx, spell selection screens during character creation are limited to 24 spells, as are spellbook pages. Since there are more than 24 spells available at some levels you will not be able to see all spells available or be able to select them. Cat's Grace, a second-level arcane spell, relies on functionality provided by TobEx and will be skipped if it's not detected.

+

The fourth-level divine spell Giant Insect relies on Infinity Animations, as the beetles summoned by the spell do not have animations in the original BG2, and will be skipped without the mod being installed. Polymorph Self and druidic shapeshifting will also have an additional option, Boring Beetle, if IA is installed.

@@ -70,16 +70,13 @@

Bug Reporting

-

If you should encounter any bugs, please report them to the authors at the IWDification forum. In addition, IWDification is available on GitHub, so fixes and changes can be submitted by the community.

+

If you should encounter any bugs, please report them to the authors at the IWDification forum. In addition, IWDification is available on GitHub, so fixes and changes can be submitted by the community.

Known Issues

Two-handed axes use the same combat and paperdoll animations as halberds.

-

Contact Other Plane has no dialogue written, and is therefore unavailable at present.

-

Arcane spell scrolls are only available in stores, and the new arcane and divine spells are currently not utilized by enemies. This is something that future versions will address.

-

Known Issues (Non-EE Games)

-

Many of the cosmetic effects for the new spells are too transparent; a review is planned for the next version.

-

The Cat's Grace spell (part of the Arcane Spell Pack) requires TobEx for its unique dexterity modifications. Giant Insect (part of the Divine Spell Pack) requires the beetle animation, part of Infinity Animations. In addition, Monster Summoning IV (Arcane Spell Pack) will have yetis as a summoning option if the yeti animation and Infinity Animations is installed; otherwise the spell will still work with the other summoning options.

-

Just like IWD-in-BG2, a small number of spells cannot currently be converted at all. The current list is: Seven Eyes, Soul Eater, (Great) Shout, Mordenkainen's Force Missiles, Spiritual Wrath, Mold Touch, Wall of Moonlight, and Smashing Wave. A few other spells are converted a bit suboptimally, and don't work quite the way they did in IWD. The current list is Blood Rage, Animal Rage, Static Charge, and Whirlwind. Spells which use cloud (or cloud-like) projectiles are simulated in a very roundabout fashion; the upshot is that the visuals don't always reflect their actual area of effect and don't look as nice as they do in IWD or in the EE engine.

-
+

Contact Other Plane has no dialogue written, and is therefore unavailable at present.

+

Known Issues (Non-EE Games)

+

For the Arcane and Divine Spell Packs, not all spells could be converted to the original Baldur's Gate II engine. The Cat's Grace spell (part of the Arcane Spell Pack) requires TobEx for its unique dexterity modifications. Giant Insect (part of the Divine Spell Pack) requires the beetle animation, part of Infinity Animations. Soul Eater, Seven Eyes, Favor of Ilmater, Smashing Wave, Wall of Moonlight, and Spiritual Wrath are not available. All of the compromises made for the Arcane or Divine Spell Packs can be found in the notes on their respective spell listings (arcane, divine).

+

Installation

@@ -87,16 +84,16 @@

Installation

Special Note for Siege of Dragonspear from Steam/GOG
-
Good Old Games (GOG) and Steam both package the additional content for Siege of Dragonspear in a method that WeiDU, the tool used to install this mod, cannot access. You must run a program called Modmerge on your SoD installation before you can install this or any other WeiDU-based mod.

+ Good Old Games (GOG) and Steam both package the additional content for Siege of Dragonspear in a method that WeiDU, the tool used to install this mod, cannot access. You must run a program called DLC Merger on your SoD installation before you can install this or any other WeiDU-based mod.

Enhanced Editions Note
The Enhanced Editions are actively supported games. Please note that every patch update will wipe your current mod setup! If in the middle of a modded game you might want to delay the patch update (if possible) as even after reinstalling the mods, you might not be able to continue with your old savegames. Alternatively, copy the whole game's folder into a new one that can be modded and will stay untouched by game patches. It is important that you install the mod to the language version you are playing the game in. Otherwise, the dialogues of the mod will not show but give error messages.

Windows
IWDification for Windows is distributed as a self-extracting archive and includes a WeiDU installer. To install, simply double-click the archive and follow the instructions on screen.

-

Alternatively, the files can be extracted into your game directory using 7zip or WinRAR. When properly extracted, your game directory will contain setup-iwdification.exe and the folderiwdification. To install, double-click setup-iwdification.exe and follow the instructions on screen.

+

Alternatively, the files can be extracted into your game directory using 7zip or WinRAR. When properly extracted, your game directory will contain setup-iwdification.exe and the folder iwdification. To install, double-click setup-iwdification.exe and follow the instructions on screen.

You can run setup-iwdification.exe in your game folder to reinstall, uninstall or otherwise change components.

Mac OS X
IWDification for Mac OS X is distributed as a compressed tarball and includes a WeiDU installer.

-

First, extract the files from the tarball into your game directory. When properly extracted, your game directory will contain setup-iwdification, setup-iwdification.command, and the folderiwdification. To install, double-click setup-iwdification.command and follow the instructions on screen.

+

First, extract the files from the tarball into your game directory. When properly extracted, your game directory will contain setup-iwdification, setup-iwdification.command, and the folder iwdification. To install, double-click setup-iwdification.command and follow the instructions on screen.

You can run setup-iwdification.command in your game folder to reinstall, uninstall or otherwise change components.

Linux
IWDification for Linux is distributed as a compressed tarball and does not include a WeiDU installer.

@@ -112,56 +109,90 @@

Contents

-

IWDification has several components, which can be installed completely independently of one another.

+

IWDification has several components, which can be installed completely independently of one another. The components are broken into three broad categories.

+
+
+

Miscellaneous Changes

+
+
+
+

Icewind Dale Casting Graphics (Andyr)
Also available in the Tweaks Anthology mod

-

When your character casts a spell, you get a pretty sequence of colors swirling around their hand depending on the school the spell cast came from. A necromantic spell, for example, looks quite different from creating an illusion. The Baldur's Gate and Icewind Dale games use different sets of animations for the schools. This component changes the spellcasting animations to those of Icewind Dale. Note that this is purely a cosmetic change--the spells themselves function exactly as before. Screenshots for comparison are available in the Tweaks gallery.

+

When your character casts a spell, you get a pretty sequence of colors swirling around their hand depending on the school the spell cast came from. A necromantic spell, for example, looks quite different from creating an illusion. The Baldur's Gate and Icewind Dale games use different sets of animations for the schools. This component changes the spellcasting animations to those of Icewind Dale. Note that this is purely a cosmetic change--the spells themselves function exactly as before. Screenshots for comparison are available in the Tweaks gallery.

Commoners Use Drab Colors
Also available in the Tweaks Anthology mod

Unlike Icewind Dale, commoners in BG2 wear brightly colored clothes. This tweak changes the random selections of colors for commoners to a drab palette. The dress of noblemen and noblewomen are not affected.

-

Arcane Spell Pack

-

This component adds more than 30 arcane spells from Icewind Dale. This component does not alter existing BG2 spells to match their IWD counterparts, except as noted below. Complete descriptions are available on the project pages.

+

Two Handed Axes

+

Icewind Dale also featured two-handed axes, as opposed to the strictly one-handed variety found in the Baldur's Gate series. This component scatters normal and magical two-handed axes throughout the game to make them available for players. Two-handed axes use the axe proficiency and have base stats of 9 speed and 1d10 damage. Spoilers about their precise locations are available on the forums.

+

Expanded Polymorph Self Options

+

This component adds three new forms to the arcane Polymorph Self spell: winter wolf, polar bear, and boring beetle (the boring beetle requires Infinity Animations on original BG2).

+
+
+

Spell Packs

+
+
+
+
+

Arcane Spell Pack

+

This component adds more than 30 arcane spells from Icewind Dale. This component does not alter existing BG2 spells to match their IWD counterparts, except as noted below. Complete descriptions are available on the project pages as well as in-depth technical information.

    -
  • Updated: Emotion, Hopelessness is updated to its IWD counterpart to match the other three new spells in the Emotion series. Polymorph Self gains two new forms, Polar Bear and Winter Wolf, and possibly a third, Boring Beetle, depending on your game. The fifth level elemental conjuring series is updated to its IWD counterpart to facilitate the addition of the water elemental spell.
  • -
  • Level 1: Expeditious Retreat
  • -
  • Level 2: Cat's Grace2, Decastave, Snilloc's Snowball Swarm
  • -
  • Level 3: Icelance, Lance of Disruption
  • -
  • Level 4: Beltyn's Burning Blood; Emotion, Courage; Emotion, Fear; Emotion, Hope; Mordenkainen's Force Missiles1; Shadow Monsters; Shout1; Vitriolic Sphere
  • -
  • Level 5: Conjure Water Elemental, Demi-Shadow Monsters, Shroud of Flame, Summon Shadow
  • -
  • Level 6: Antimagic Shell, Darts of Bone, Lich Touch, Monster Summoning IV, Otiluke's Freezing Sphere, Shades, Soul Eater1, Trollish Fortitude
  • -
  • Level 7: Acid Storm, Malavon's Rage, Monster Summoning V, Seven Eyes1, Suffocate
  • -
  • Level 8: Great Shout, Iron Body1, Mind Blank, Monster Summoning VI
  • -
  • Level 9: Monter Summoning VII
  • +
  • Updated: Emotion, Hopelessness is updated to its IWD counterpart to match the other three new spells in the Emotion series. The fifth level elemental conjuring series is updated to its IWD counterpart to facilitate the addition of the water elemental spell. IWD has its own version of Mordenkainen's Sword which is brought into the game as Mordenkainen's Force Blade.
  • +
  • Level 1: Expeditious Retreat
  • +
  • Level 2: Cat's Grace2, Decastave, Snilloc's Snowball Swarm
  • +
  • Level 3: Icelance, Lance of Disruption
  • +
  • Level 4: Beltyn's Burning Blood; Emotion, Courage; Emotion, Fear; Emotion, Hope; Mordenkainen's Force Missiles; Shadow Monsters; Shout; Vitriolic Sphere
  • +
  • Level 5: Conjure Lesser Water Elemental, Demi-Shadow Monsters, Shroud of Flame, Summon Shadow
  • +
  • Level 6: Antimagic Shell, Conjure Water Elemental, Darts of Bone, Lich Touch, Monster Summoning IV, Otiluke's Freezing Sphere, Shades, Soul Eater1, Trollish Fortitude
  • +
  • Level 7: Acid Storm, Malavon's Rage, Monster Summoning V, Mordenkainen's Force Blade, Seven Eyes1, Suffocate
  • +
  • Level 8: Great Shout, Iron Body, Mind Blank, Monster Summoning VI
  • +
  • Level 9: Monster Summoning VII

1 Only available for EE games
2 Only available for EE games OR vanilla games with TobEx installed

Divine Spell Pack

-

This component adds more than 40 divine spells from Icewind Dale and does not alter existing BG2 spells to match their IWD counterparts. Divine spellcasters will receive these spells, as appropriate, in their spellbooks as they level up. Joinable NPCs also receive updates to their spellbooks to account for the new spells. Complete descriptions are available on the project pages.

+

This component adds more than 40 divine spells from Icewind Dale and does not alter existing BG2 spells to match their IWD counterparts. Divine spellcasters will receive these spells, as appropriate, in their spellbooks as they level up. Joinable NPCs also receive updates to their spellbooks to account for the new spells. Complete descriptions are available on the project pages as well as in-depth technical information.

  • Level 1: Cause Light Wounds, Curse, Sunscorch
  • -
  • Level 2: Alicorn Lance, Beast Claw, Cause Moderate Wounds, Cure Moderate Wounds
  • -
  • Level 3: Cause Disease, Cause Medium Wounds, Circle of Bones, Cloudburst, Exaltation, Favor of Ilmater1, Mold Touch1, Moonblade, Prayer, Spike Growth
  • -
  • Level 4: Blood Rage, Cloud of Pestilence, Giant Insect2, Produce Fire, Recitation, Smashing Wave1, Star Metal Cudgel, Static Charge, Thorn Spray, Unfailing Endurance, Wall of Moonlight1
  • -
  • Level 5: Animal Rage, Mass Cause Light Wounds, Righteous Wrath of the Faithful, Shield of Lathander, Spike Stones, Undead Ward
  • -
  • Level 6: Entropy Shield, Spiritual Wrath1, Whirlwind
  • -
  • Level 7: Destruction; Energy Drain; Greater Shield of Lathander; Impervious Sanctity of Mind; Mist of Eldath; Stalker; Symbol, Hopelessness; Symbol, Pain
  • +
  • Level 2: Alicorn Lance, Beast Claw, Cause Moderate Wounds, Cure Moderate Wounds
  • +
  • Level 3: Cause Disease, Cause Medium Wounds, Circle of Bones, Cloudburst, Exaltation, Favor of Ilmater1, Mold Touch, Moonblade, Prayer, Spike Growth, Storm Shell
  • +
  • Level 4: Blood Rage, Cloud of Pestilence, Giant Insect2, Produce Fire, Recitation, Smashing Wave1, Star Metal Cudgel, Static Charge, Thorn Spray, Unfailing Endurance, Wall of Moonlight1
  • +
  • Level 5: Animal Rage, Mass Cause Light Wounds, Righteous Wrath of the Faithful, Shield of Lathander, Spike Stones, Undead Ward
  • +
  • Level 6: Entropy Shield, Spiritual Wrath1, Whirlwind
  • +
  • Level 7: Destruction; Energy Drain; Greater Shield of Lathander; Impervious Sanctity of Mind; Mist of Eldath; Stalker; Symbol, Hopelessness; Symbol, Pain; Wither

1 Only available for EE games
- 2 Only available for EE games OR vanilla games with Infinity Animations installed

-

Bard Song

+ 2 Only available for vanilla games with Infinity Animations installed

+

Expanded Portrait Icons
+ Non-EE Games Only

+

On the Enhanced Editions, all of the Icewind Dale portrait icons for the spells in the Arcane and Divine Spell Packs and the songs from IWD Class Updates: Bard are added. Unlike the Enhanced Editions, portrait icons in the original BG2 are limited to a fixed number of slots and, as such, many of the imported spells and bard songs do not get their unique portrait icons. These are made available as a separate component because there's no easy way to patch these into the game and this component will destructively overwrite changes made by other mods to expand the portrait icon system.

+
+
+

IWD Class Updates

+
+
+
+
+

IWD Class Updates: Bard (formerly known as Bard Song)

Bards in Icewind Dale gained different bard songs as they leveled:

    -
  • The Ballad of Three Heroes - Available at level one, this provides all allies with +1 to hit, +1 damage, and +1 to saving throws.
  • -
  • The Tale of Curran Strongheart - Available at level three, this song protects the party from fear and removes any current fear effects.
  • -
  • Tymora's Melody - Available at level five, the party gains +1 luck, +3 to all saves, and +10 to lore and thieving skills.
  • -
  • The Song of Kaudies - Available at level seven, this provides a 50% resistance to sound-based attacks and spells such as power words, sirine charm, silence, and others.
  • -
  • The Siren's Yearning - Available at level nine, this song enthralls your foes, preventing action for five rounds on a failed save vs. spell.
  • -
  • War Chant of the Sith - Available at level 11, this provides +2 AC, regeneration of two HP/round, and 10% resistance to all crushing, missile, piercing, and slashing damage.
  • +
  • The Ballad of Three Heroes — Available at level one, this provides all allies with +1 to hit, +1 damage, and +1 to saving throws.
  • +
  • The Tale of Curran Strongheart — Available at level three, this song protects the party from fear and removes any current fear effects.
  • +
  • Tymora's Melody — Available at level five, the party gains +1 luck, +3 to all saves, and +10 to lore and thieving skills.
  • +
  • The Song of Kaudies — Available at level seven, this provides a 50% resistance to sound-based attacks and spells such as power words, sirine charm, silence, and others.
  • +
  • The Siren's Yearning — Available at level nine, this song enthralls your foes, preventing action for five rounds on a failed save vs. spell.
  • +
  • War Chant of the Sith — Available at level 11, this provides +2 AC, regeneration of two HP/round, and 10% resistance to all crushing, missile, piercing, and slashing damage.

As the songs become available to the bard, the ability to freely switch between them is available. This component only affects trueclass bards, as the available kits use variants of BG2 bard song for kit advantages and/or disadvantages. Bards with these new songs will not be able to pick Enhanced Bard Song as a high-level ability.

-

Two Handed Axes

-

Icewind Dale also featured two-handed axes, as opposed to the strictly one-handed variety found in the Baldur's Gate series. This component scatters normal and magical two-handed axes throughout the game to make them available for players. Two-handed axes use the axe proficiency and have base stats of 9 speed and 1d10 damage. Spoilers about their precise locations are available on the forums.

-
+

IWD Class Updates: Druid

+

There are two options which can be installed separately or together. The first, Allow Elves to be Druids, does exactly that: it opens the druid class and fighter-druid multi-class to elves, but is only available on EE games..

+

The second, Use IWD Shapeshifting and Ability Progression, makes several changes to the druid class. Trueclass druids swap their BG2 shapeshifting (wolf, black bear, brown bear) for the IWD progression: winter wolf (level 5), boring beetle (level 7, but kept as black bear for vanilla games without Infinity Animations), polar bear (level 9), fire elemental (level 11), earth elemental (level 13), and water elemental (level 15). Immunity from poison is moved from level 15 to level 9, and instead of the BG2 elemental resists at levels 18/21/24, the druid becomes immune to fatigue at level 15.

+

IWD Class Updates: Paladin

+

The paladin's Detect Evil ability becomes an at-will ability, and Protection From Evil only protects the paladin but lasts 24 hours. Paladins can cast Cure Disease (per the cleric spell) once per day and Smite Evil once per day (does 1d6 plus 1d6 per thee levels of magic damage to an evil opponent). Paladins are now immune to disease and become immune to fear at level three. They also receive an expanded spellcasting table, being able to start casting spells at level 6 instead of 9.

+

IWD Class Updates: Thief
+ Enhanced Edition Only

+

At level seven, thieves earn the Evasion perk. When a thief is hit by a spell that can be evaded (Fireball, Lightning Bolt, etc.), the thief is allowed a Save vs. Breath to completely avoid the effects. If the Saving Throw is failed, the spell works normally, including a save for half damage if the spell allows for it. A helpless thief (e.g. held, stunned, or asleep) cannot use Evasion.

+

Contact Information

@@ -169,29 +200,34 @@

Contact Information

IWDification is the hard work of CamDawg and DavidW. For issues, suggestions and - general feedback, the IWDification - forums are the best resource. Visit the Gibberlings + general feedback, the IWDification + forums are the best resource. Visit the Gibberlings Three Forums for information on this and any other Gibberlings Three mods on which we may be working.

-

Thanks and Acknowledgements

+

Thanks and Acknowledgments

-

CamDawg created this mod, based primarily on the hard work of DavidW on IWD-in-BG2, and furthered by the Beamdog team for IWDEE. You can find out more about IWDification by visiting the mod forum or the project page.

-

Since this mod, and in particular the spell packs, draw heavily upon the work in IWD-in-BG2, the same thanks and acknowledgements apply. In particular thanks to Nythrun, who helped immensely with the conversion of the spells. Thanks to Andyr for the development of the IWD casting graphics, lifted entirely from the Tweaks Anthology.

+

CamDawg created this mod, based primarily on the hard work of DavidW on IWD-in-BG2, and furthered by the Beamdog team for IWDEE. You can find out more about IWDification by visiting the mod forum or the project page.

+

Since this mod, and in particular the spell packs, draw heavily upon the work in IWD-in-BG2, the same thanks and acknowledgments apply. In particular thanks to Nythrun, who helped immensely with the conversion of the spells. Thanks to Andyr for the development of the IWD casting graphics, lifted entirely from the Tweaks Anthology.

+

I'd also like to thank TotoR, who identified several issues and provided working versions of Shout, Great Shout, and Mordenkainen's Force Missiles. Thanks to Luke who identified several issues with the IWDEE 2.6 spells, and thanks to Galactygon for same as well as advice on getting the new IWD spells to blend in more with their BG2 counterparts. Thanks to subtledoctor for providing the code for getting the spells to work with SR's spell deflection.

Tools Used in Creation

  • WeiDU by Wes Weimer, the bigg, and Wisp
  • Near Infinity by Jon Olav Hauglid, FredSRichardson, and argent77
  • +
  • Notepad++, by the Notepad++ team
  • +
  • WeiDU Notepad++ + Highlighters by cmorgan, updated by argent77
  • ConTEXT Text Editor by Eden Kirin
  • DLTCEP by Avenger
  • IESDP maintained - by igi
  • + by igi and lynx +
  • Bammer by Scott Brooks
  • BAM Workshop by Glenn Flansburg
  • WeiDU ConTEXT @@ -220,6 +256,41 @@

    Version History

    +

    Version Release Candidate 1 - July 25, 2021

    +

    Version Beta 6 - May 22, 2020

    • Corrected a logic error which allocated the wrong animations, and prevented Giant Insect from installing, if you installed the Arcane and Divine spellpacks without quitting the installer between them
    • diff --git a/iwdification/resource/dw#msogr.baf b/iwdification/resource/dw#msogr.baf new file mode 100644 index 0000000..253cddd --- /dev/null +++ b/iwdification/resource/dw#msogr.baf @@ -0,0 +1,10 @@ +IF + !GlobalTimerNotExpired("castspell","LOCALS") + See(NearestEnemyOf(Myself)) + !CheckSpellState(Myself,STATE_ENRAGED) + HaveSpell(BERSERKER_RAGE) +THEN + RESPONSE #100 + SetGlobalTimer("castspell","LOCALS",6) + Spell(Myself,BERSERKER_RAGE) +END diff --git a/iwdification/resource/dw#umber.baf b/iwdification/resource/dw#umber.baf new file mode 100644 index 0000000..39ff901 --- /dev/null +++ b/iwdification/resource/dw#umber.baf @@ -0,0 +1,36 @@ +IF + !GlobalTimerNotExpired("gaze","LOCALS") + !GlobalTimerNotExpired("castspell","LOCALS") + See(NearestEnemyOf(Myself)) +THEN + RESPONSE #100 + SetGlobalTimer("gaze","LOCALS",12) + SetGlobalTimer("castspell","LOCALS",6) + ForceSpell(LastSeenBy(Myself),HULK_CONFUSION) + RESPONSE #100 + Continue() +END + +IF + !GlobalTimerNotExpired("gaze","LOCALS") + !GlobalTimerNotExpired("castspell","LOCALS") + See(SecondNearestEnemyOf(Myself)) +THEN + RESPONSE #200 + SetGlobalTimer("gaze","LOCALS",12) + SetGlobalTimer("castspell","LOCALS",6) + ForceSpell(LastSeenBy(Myself),HULK_CONFUSION) + RESPONSE #100 + Continue() +END + +IF + !GlobalTimerNotExpired("gaze","LOCALS") + !GlobalTimerNotExpired("castspell","LOCALS") + See(ThirdNearestEnemyOf(Myself)) +THEN + RESPONSE #100 + SetGlobalTimer("gaze","LOCALS",12) + SetGlobalTimer("castspell","LOCALS",6) + ForceSpell(LastSeenBy(Myself),HULK_CONFUSION) +END \ No newline at end of file diff --git a/iwdification/resource/hobarc01.cre b/iwdification/resource/hobarc01.cre new file mode 100644 index 0000000..810a0b7 Binary files /dev/null and b/iwdification/resource/hobarc01.cre differ diff --git a/iwdification/resource/hobwar01.cre b/iwdification/resource/hobwar01.cre new file mode 100644 index 0000000..9dfb644 Binary files /dev/null and b/iwdification/resource/hobwar01.cre differ diff --git a/iwdification/resource/icyuan01.cre b/iwdification/resource/icyuan01.cre new file mode 100644 index 0000000..c4ea3bf Binary files /dev/null and b/iwdification/resource/icyuan01.cre differ diff --git a/iwdification/resource/ogremasu.baf b/iwdification/resource/ogremasu.baf new file mode 100644 index 0000000..eb35590 --- /dev/null +++ b/iwdification/resource/ogremasu.baf @@ -0,0 +1,422 @@ +IF +!GlobalTimerNotExpired("castspell","LOCALS") +HaveSpell(WIZARD_GHOST_ARMOR) +CheckStatLT(Myself,60,SPELLFAILUREMAGE) +OR(2) +ActionListEmpty() +!Allegiance(Myself,ENEMY) +THEN +RESPONSE #100 +SetGlobalTimer("castspell","LOCALS",6) +Spell(Myself,WIZARD_GHOST_ARMOR) +END + +IF +!GlobalTimerNotExpired("castspell","LOCALS") +HaveSpell(WIZARD_MIRROR_IMAGE) +CheckStatLT(Myself,60,SPELLFAILUREMAGE) +OR(2) +ActionListEmpty() +!Allegiance(Myself,ENEMY) +OR(2) +Range(NearestEnemyOf(Myself),15) +HPPercentLT(Myself,80) +THEN +RESPONSE #100 +SetGlobalTimer("castspell","LOCALS",6) +Spell(Myself,WIZARD_MIRROR_IMAGE) +END + +IF +!GlobalTimerNotExpired("castspell","LOCALS") +HaveSpell(WIZARD_LIGHTNING_BOLT) +!StateCheck(NearestEnemyOf(Myself),STATE_NOT_TARGETABLE) +!CheckStatGT(NearestEnemyOf(Myself),0,SANCTUARY) +CheckStatLT(Myself,60,SPELLFAILUREMAGE) +!CheckSpellState(NearestEnemyOf(Myself),DO_NOT_TARGET_SPELLS) +See(NearestEnemyOf(Myself)) +OR(2) +ActionListEmpty() +!Allegiance(Myself,ENEMY) +!CheckStatGT(NearestEnemyOf(Myself),0,MINORGLOBE) +!StateCheck(NearestEnemyOf(Myself),STATE_IMMOBILE) +!StateCheck(NearestEnemyOf(Myself),STATE_FEEBLEMINDED) +!CheckStatGT(NearestEnemyOf(Myself),0,HELD) +THEN +RESPONSE #100 +SetGlobalTimer("castspell","LOCALS",6) +Spell(NearestEnemyOf(Myself),WIZARD_LIGHTNING_BOLT) +RESPONSE #100 +Continue() +END + +IF +!GlobalTimerNotExpired("castspell","LOCALS") +HaveSpell(WIZARD_LIGHTNING_BOLT) +!StateCheck(SecondNearestEnemyOf(Myself),STATE_NOT_TARGETABLE) +!CheckStatGT(SecondNearestEnemyOf(Myself),0,SANCTUARY) +CheckStatLT(Myself,60,SPELLFAILUREMAGE) +!CheckSpellState(SecondNearestEnemyOf(Myself),DO_NOT_TARGET_SPELLS) +See(SecondNearestEnemyOf(Myself)) +OR(2) +ActionListEmpty() +!Allegiance(Myself,ENEMY) +!CheckStatGT(SecondNearestEnemyOf(Myself),0,MINORGLOBE) +!StateCheck(SecondNearestEnemyOf(Myself),STATE_IMMOBILE) +!StateCheck(SecondNearestEnemyOf(Myself),STATE_FEEBLEMINDED) +!CheckStatGT(SecondNearestEnemyOf(Myself),0,HELD) +THEN +RESPONSE #100 +SetGlobalTimer("castspell","LOCALS",6) +Spell(SecondNearestEnemyOf(Myself),WIZARD_LIGHTNING_BOLT) +RESPONSE #100 +Continue() +END + +IF +!GlobalTimerNotExpired("castspell","LOCALS") +HaveSpell(WIZARD_LIGHTNING_BOLT) +!StateCheck(ThirdNearestEnemyOf(Myself),STATE_NOT_TARGETABLE) +!CheckStatGT(ThirdNearestEnemyOf(Myself),0,SANCTUARY) +CheckStatLT(Myself,60,SPELLFAILUREMAGE) +!CheckSpellState(ThirdNearestEnemyOf(Myself),DO_NOT_TARGET_SPELLS) +See(ThirdNearestEnemyOf(Myself)) +OR(2) +ActionListEmpty() +!Allegiance(Myself,ENEMY) +!CheckStatGT(ThirdNearestEnemyOf(Myself),0,MINORGLOBE) +!StateCheck(ThirdNearestEnemyOf(Myself),STATE_IMMOBILE) +!StateCheck(ThirdNearestEnemyOf(Myself),STATE_FEEBLEMINDED) +!CheckStatGT(ThirdNearestEnemyOf(Myself),0,HELD) +THEN +RESPONSE #100 +SetGlobalTimer("castspell","LOCALS",6) +Spell(ThirdNearestEnemyOf(Myself),WIZARD_LIGHTNING_BOLT) +RESPONSE #100 +Continue() +END + +IF +!GlobalTimerNotExpired("castspell","LOCALS") +HaveSpell(WIZARD_BURNING_HANDS) +!StateCheck(NearestEnemyOf(Myself),STATE_NOT_TARGETABLE) +!CheckStatGT(NearestEnemyOf(Myself),0,SANCTUARY) +CheckStatLT(Myself,60,SPELLFAILUREMAGE) +!CheckSpellState(NearestEnemyOf(Myself),DO_NOT_TARGET_SPELLS) +See(NearestEnemyOf(Myself)) +OR(2) +ActionListEmpty() +!Allegiance(Myself,ENEMY) +Range(NearestEnemyOf(Myself),5) +THEN +RESPONSE #100 +SetGlobalTimer("castspell","LOCALS",6) +Spell(NearestEnemyOf(Myself),WIZARD_BURNING_HANDS) +RESPONSE #100 +Continue() +END + +IF +!GlobalTimerNotExpired("castspell","LOCALS") +HaveSpell(WIZARD_BURNING_HANDS) +!StateCheck(SecondNearestEnemyOf(Myself),STATE_NOT_TARGETABLE) +!CheckStatGT(SecondNearestEnemyOf(Myself),0,SANCTUARY) +CheckStatLT(Myself,60,SPELLFAILUREMAGE) +!CheckSpellState(SecondNearestEnemyOf(Myself),DO_NOT_TARGET_SPELLS) +See(SecondNearestEnemyOf(Myself)) +OR(2) +ActionListEmpty() +!Allegiance(Myself,ENEMY) +Range(SecondNearestEnemyOf(Myself),5) +THEN +RESPONSE #100 +SetGlobalTimer("castspell","LOCALS",6) +Spell(SecondNearestEnemyOf(Myself),WIZARD_BURNING_HANDS) +RESPONSE #100 +Continue() +END + +IF +!GlobalTimerNotExpired("castspell","LOCALS") +HaveSpell(WIZARD_BURNING_HANDS) +!StateCheck(ThirdNearestEnemyOf(Myself),STATE_NOT_TARGETABLE) +!CheckStatGT(ThirdNearestEnemyOf(Myself),0,SANCTUARY) +CheckStatLT(Myself,60,SPELLFAILUREMAGE) +!CheckSpellState(ThirdNearestEnemyOf(Myself),DO_NOT_TARGET_SPELLS) +See(ThirdNearestEnemyOf(Myself)) +OR(2) +ActionListEmpty() +!Allegiance(Myself,ENEMY) +Range(ThirdNearestEnemyOf(Myself),5) +THEN +RESPONSE #100 +SetGlobalTimer("castspell","LOCALS",6) +Spell(ThirdNearestEnemyOf(Myself),WIZARD_BURNING_HANDS) +RESPONSE #100 +Continue() +END + +IF +!GlobalTimerNotExpired("castspell","LOCALS") +HaveSpell(WIZARD_MELF_ACID_ARROW) +!StateCheck([PC.0.0.MAGE_ALL],STATE_NOT_TARGETABLE) +!CheckStatGT([PC.0.0.MAGE_ALL],0,SANCTUARY) +CheckStatLT(Myself,60,SPELLFAILUREMAGE) +!CheckSpellState([PC.0.0.MAGE_ALL],DO_NOT_TARGET_SPELLS) +See([PC.0.0.MAGE_ALL]) +Allegiance(Myself,ENEMY) +!CheckStatGT([PC.0.0.MAGE_ALL],0,MINORGLOBE) +!StateCheck([PC.0.0.MAGE_ALL],STATE_IMMOBILE) +!StateCheck([PC.0.0.MAGE_ALL],STATE_FEEBLEMINDED) +!CheckStatGT([PC.0.0.MAGE_ALL],0,HELD) +!CheckStatGT([PC.0.0.MAGE_ALL],0,WIZARD_SPELL_TURNING) +!CheckStatGT([PC.0.0.MAGE_ALL],0,WIZARD_SPELL_TRAP) + +THEN +RESPONSE #100 +SetGlobalTimer("castspell","LOCALS",6) +Spell([PC.0.0.MAGE_ALL],WIZARD_MELF_ACID_ARROW) +RESPONSE #50 +Continue() +END + +IF +!GlobalTimerNotExpired("castspell","LOCALS") +HaveSpell(WIZARD_MELF_ACID_ARROW) +!StateCheck([PC.0.0.CLERIC_ALL],STATE_NOT_TARGETABLE) +!CheckStatGT([PC.0.0.CLERIC_ALL],0,SANCTUARY) +CheckStatLT(Myself,60,SPELLFAILUREMAGE) +!CheckSpellState([PC.0.0.CLERIC_ALL],DO_NOT_TARGET_SPELLS) +See([PC.0.0.CLERIC_ALL]) +Allegiance(Myself,ENEMY) +!CheckStatGT([PC.0.0.CLERIC_ALL],0,MINORGLOBE) +!StateCheck([PC.0.0.CLERIC_ALL],STATE_IMMOBILE) +!StateCheck([PC.0.0.CLERIC_ALL],STATE_FEEBLEMINDED) +!CheckStatGT([PC.0.0.CLERIC_ALL],0,HELD) +!CheckStatGT([PC.0.0.CLERIC_ALL],0,WIZARD_SPELL_TURNING) +!CheckStatGT([PC.0.0.CLERIC_ALL],0,WIZARD_SPELL_TRAP) + +THEN +RESPONSE #100 +SetGlobalTimer("castspell","LOCALS",6) +Spell([PC.0.0.CLERIC_ALL],WIZARD_MELF_ACID_ARROW) +RESPONSE #50 +Continue() +END + +IF +!GlobalTimerNotExpired("castspell","LOCALS") +HaveSpell(WIZARD_MELF_ACID_ARROW) +!StateCheck([PC.0.0.DRUID_ALL],STATE_NOT_TARGETABLE) +!CheckStatGT([PC.0.0.DRUID_ALL],0,SANCTUARY) +CheckStatLT(Myself,60,SPELLFAILUREMAGE) +!CheckSpellState([PC.0.0.DRUID_ALL],DO_NOT_TARGET_SPELLS) +See([PC.0.0.DRUID_ALL]) +Allegiance(Myself,ENEMY) +!CheckStatGT([PC.0.0.DRUID_ALL],0,MINORGLOBE) +!StateCheck([PC.0.0.DRUID_ALL],STATE_IMMOBILE) +!StateCheck([PC.0.0.DRUID_ALL],STATE_FEEBLEMINDED) +!CheckStatGT([PC.0.0.DRUID_ALL],0,HELD) +!CheckStatGT([PC.0.0.DRUID_ALL],0,WIZARD_SPELL_TURNING) +!CheckStatGT([PC.0.0.DRUID_ALL],0,WIZARD_SPELL_TRAP) + +THEN +RESPONSE #100 +SetGlobalTimer("castspell","LOCALS",6) +Spell([PC.0.0.DRUID_ALL],WIZARD_MELF_ACID_ARROW) +RESPONSE #50 +Continue() +END + +IF +!GlobalTimerNotExpired("castspell","LOCALS") +HaveSpell(WIZARD_MELF_ACID_ARROW) +!StateCheck([PC.0.0.BARD],STATE_NOT_TARGETABLE) +!CheckStatGT([PC.0.0.BARD],0,SANCTUARY) +CheckStatLT(Myself,60,SPELLFAILUREMAGE) +!CheckSpellState([PC.0.0.BARD],DO_NOT_TARGET_SPELLS) +See([PC.0.0.BARD]) +Allegiance(Myself,ENEMY) +!CheckStatGT([PC.0.0.BARD],0,MINORGLOBE) +!StateCheck([PC.0.0.BARD],STATE_IMMOBILE) +!StateCheck([PC.0.0.BARD],STATE_FEEBLEMINDED) +!CheckStatGT([PC.0.0.BARD],0,HELD) +!CheckStatGT([PC.0.0.BARD],0,WIZARD_SPELL_TURNING) +!CheckStatGT([PC.0.0.BARD],0,WIZARD_SPELL_TRAP) + +THEN +RESPONSE #100 +SetGlobalTimer("castspell","LOCALS",6) +Spell([PC.0.0.BARD],WIZARD_MELF_ACID_ARROW) +RESPONSE #50 +Continue() +END + +IF +!GlobalTimerNotExpired("castspell","LOCALS") +HaveSpell(WIZARD_MELF_ACID_ARROW) +!StateCheck(NearestEnemyOf(Myself),STATE_NOT_TARGETABLE) +!CheckStatGT(NearestEnemyOf(Myself),0,SANCTUARY) +CheckStatLT(Myself,60,SPELLFAILUREMAGE) +!CheckSpellState(NearestEnemyOf(Myself),DO_NOT_TARGET_SPELLS) +See(NearestEnemyOf(Myself)) +ActionListEmpty() +!Allegiance(Myself,ENEMY) +!CheckStatGT(NearestEnemyOf(Myself),0,MINORGLOBE) +!StateCheck(NearestEnemyOf(Myself),STATE_IMMOBILE) +!StateCheck(NearestEnemyOf(Myself),STATE_FEEBLEMINDED) +!CheckStatGT(NearestEnemyOf(Myself),0,HELD) +!CheckStatGT(NearestEnemyOf(Myself),0,WIZARD_SPELL_TURNING) +!CheckStatGT(NearestEnemyOf(Myself),0,WIZARD_SPELL_TRAP) + +THEN +RESPONSE #100 +SetGlobalTimer("castspell","LOCALS",6) +Spell(NearestEnemyOf(Myself),WIZARD_MELF_ACID_ARROW) +RESPONSE #50 +Continue() +END + +IF +!GlobalTimerNotExpired("castspell","LOCALS") +HaveSpell(WIZARD_MELF_ACID_ARROW) +!StateCheck(SecondNearestEnemyOf(Myself),STATE_NOT_TARGETABLE) +!CheckStatGT(SecondNearestEnemyOf(Myself),0,SANCTUARY) +CheckStatLT(Myself,60,SPELLFAILUREMAGE) +!CheckSpellState(SecondNearestEnemyOf(Myself),DO_NOT_TARGET_SPELLS) +See(SecondNearestEnemyOf(Myself)) +ActionListEmpty() +!Allegiance(Myself,ENEMY) +!CheckStatGT(SecondNearestEnemyOf(Myself),0,MINORGLOBE) +!StateCheck(SecondNearestEnemyOf(Myself),STATE_IMMOBILE) +!StateCheck(SecondNearestEnemyOf(Myself),STATE_FEEBLEMINDED) +!CheckStatGT(SecondNearestEnemyOf(Myself),0,HELD) +!CheckStatGT(SecondNearestEnemyOf(Myself),0,WIZARD_SPELL_TURNING) +!CheckStatGT(SecondNearestEnemyOf(Myself),0,WIZARD_SPELL_TRAP) + +THEN +RESPONSE #100 +SetGlobalTimer("castspell","LOCALS",6) +Spell(SecondNearestEnemyOf(Myself),WIZARD_MELF_ACID_ARROW) +RESPONSE #50 +Continue() +END + +IF +!GlobalTimerNotExpired("castspell","LOCALS") +HaveSpell(WIZARD_MELF_ACID_ARROW) +!StateCheck(ThirdNearestEnemyOf(Myself),STATE_NOT_TARGETABLE) +!CheckStatGT(ThirdNearestEnemyOf(Myself),0,SANCTUARY) +CheckStatLT(Myself,60,SPELLFAILUREMAGE) +!CheckSpellState(ThirdNearestEnemyOf(Myself),DO_NOT_TARGET_SPELLS) +See(ThirdNearestEnemyOf(Myself)) +ActionListEmpty() +!Allegiance(Myself,ENEMY) +!CheckStatGT(ThirdNearestEnemyOf(Myself),0,MINORGLOBE) +!StateCheck(ThirdNearestEnemyOf(Myself),STATE_IMMOBILE) +!StateCheck(ThirdNearestEnemyOf(Myself),STATE_FEEBLEMINDED) +!CheckStatGT(ThirdNearestEnemyOf(Myself),0,HELD) +!CheckStatGT(ThirdNearestEnemyOf(Myself),0,WIZARD_SPELL_TURNING) +!CheckStatGT(ThirdNearestEnemyOf(Myself),0,WIZARD_SPELL_TRAP) + +THEN +RESPONSE #100 +SetGlobalTimer("castspell","LOCALS",6) +Spell(ThirdNearestEnemyOf(Myself),WIZARD_MELF_ACID_ARROW) +RESPONSE #50 +Continue() +END + +IF +!GlobalTimerNotExpired("castspell","LOCALS") +HaveSpell(WIZARD_MAGIC_MISSILE) +!StateCheck(NearestEnemyOf(Myself),STATE_NOT_TARGETABLE) +!CheckStatGT(NearestEnemyOf(Myself),0,SANCTUARY) +CheckStatLT(Myself,60,SPELLFAILUREMAGE) +!CheckSpellState(NearestEnemyOf(Myself),DO_NOT_TARGET_SPELLS) +See(NearestEnemyOf(Myself)) +OR(2) +ActionListEmpty() +!Allegiance(Myself,ENEMY) +!CheckStatGT(NearestEnemyOf(Myself),0,MINORGLOBE) +!StateCheck(NearestEnemyOf(Myself),STATE_IMMOBILE) +!StateCheck(NearestEnemyOf(Myself),STATE_FEEBLEMINDED) +!CheckStatGT(NearestEnemyOf(Myself),0,HELD) +!CheckSpellState(NearestEnemyOf(Myself),WIZARD_SHIELD) +!CheckStatGT(NearestEnemyOf(Myself),0,WIZARD_SPELL_TURNING) +!CheckStatGT(NearestEnemyOf(Myself),0,WIZARD_SPELL_TRAP) + +OR(2) +!CheckSpellState(NearestEnemyOf(Myself),ITEM_MM) +!CheckSpellState(NearestEnemyOf(Myself),ITEM_MM_SEEN) +THEN +RESPONSE #100 +SetGlobalTimer("castspell","LOCALS",6) +ApplySpellRES("dw#mmsee",NearestEnemyOf(Myself)) +Spell(NearestEnemyOf(Myself),WIZARD_MAGIC_MISSILE) +RESPONSE #50 +Continue() +END + +IF +!GlobalTimerNotExpired("castspell","LOCALS") +HaveSpell(WIZARD_MAGIC_MISSILE) +!StateCheck(SecondNearestEnemyOf(Myself),STATE_NOT_TARGETABLE) +!CheckStatGT(SecondNearestEnemyOf(Myself),0,SANCTUARY) +CheckStatLT(Myself,60,SPELLFAILUREMAGE) +!CheckSpellState(SecondNearestEnemyOf(Myself),DO_NOT_TARGET_SPELLS) +See(SecondNearestEnemyOf(Myself)) +OR(2) +ActionListEmpty() +!Allegiance(Myself,ENEMY) +!CheckStatGT(SecondNearestEnemyOf(Myself),0,MINORGLOBE) +!StateCheck(SecondNearestEnemyOf(Myself),STATE_IMMOBILE) +!StateCheck(SecondNearestEnemyOf(Myself),STATE_FEEBLEMINDED) +!CheckStatGT(SecondNearestEnemyOf(Myself),0,HELD) +!CheckSpellState(SecondNearestEnemyOf(Myself),WIZARD_SHIELD) +!CheckStatGT(SecondNearestEnemyOf(Myself),0,WIZARD_SPELL_TURNING) +!CheckStatGT(SecondNearestEnemyOf(Myself),0,WIZARD_SPELL_TRAP) + +OR(2) +!CheckSpellState(SecondNearestEnemyOf(Myself),ITEM_MM) +!CheckSpellState(SecondNearestEnemyOf(Myself),ITEM_MM_SEEN) +THEN +RESPONSE #100 +SetGlobalTimer("castspell","LOCALS",6) +ApplySpellRES("dw#mmsee",SecondNearestEnemyOf(Myself)) +Spell(SecondNearestEnemyOf(Myself),WIZARD_MAGIC_MISSILE) +RESPONSE #50 +Continue() +END + +IF +!GlobalTimerNotExpired("castspell","LOCALS") +HaveSpell(WIZARD_MAGIC_MISSILE) +!StateCheck(ThirdNearestEnemyOf(Myself),STATE_NOT_TARGETABLE) +!CheckStatGT(ThirdNearestEnemyOf(Myself),0,SANCTUARY) +CheckStatLT(Myself,60,SPELLFAILUREMAGE) +!CheckSpellState(ThirdNearestEnemyOf(Myself),DO_NOT_TARGET_SPELLS) +See(ThirdNearestEnemyOf(Myself)) +OR(2) +ActionListEmpty() +!Allegiance(Myself,ENEMY) +!CheckStatGT(ThirdNearestEnemyOf(Myself),0,MINORGLOBE) +!StateCheck(ThirdNearestEnemyOf(Myself),STATE_IMMOBILE) +!StateCheck(ThirdNearestEnemyOf(Myself),STATE_FEEBLEMINDED) +!CheckStatGT(ThirdNearestEnemyOf(Myself),0,HELD) +!CheckSpellState(ThirdNearestEnemyOf(Myself),WIZARD_SHIELD) +!CheckStatGT(ThirdNearestEnemyOf(Myself),0,WIZARD_SPELL_TURNING) +!CheckStatGT(ThirdNearestEnemyOf(Myself),0,WIZARD_SPELL_TRAP) + +OR(2) +!CheckSpellState(ThirdNearestEnemyOf(Myself),ITEM_MM) +!CheckSpellState(ThirdNearestEnemyOf(Myself),ITEM_MM_SEEN) +THEN +RESPONSE #100 +SetGlobalTimer("castspell","LOCALS",6) +ApplySpellRES("dw#mmsee",ThirdNearestEnemyOf(Myself)) +Spell(ThirdNearestEnemyOf(Myself),WIZARD_MAGIC_MISSILE) +RESPONSE #50 +Continue() +END + diff --git a/iwdification/resource/ogremasu.cre b/iwdification/resource/ogremasu.cre new file mode 100644 index 0000000..1ffe08c Binary files /dev/null and b/iwdification/resource/ogremasu.cre differ diff --git a/iwdification/resource/ogremasu.ssl b/iwdification/resource/ogremasu.ssl new file mode 100644 index 0000000..84b7a51 --- /dev/null +++ b/iwdification/resource/ogremasu.ssl @@ -0,0 +1,128 @@ +// not used in live code, but the ssl base for ogremasu.baf + +BEGIN_ACTION_DEFINITION + Name(AttackIfEmpty) + TRIGGER + !StateCheck(scstarget,STATE_INVISIBLE) + ActionListEmpty() + ACTION + RESPONSE #scsprob1 + EquipMostDamagingMelee() + SetGlobal("melee","LOCALS",1) + AttackOneRound(scstarget) +END + +BEGIN_ACTION_DEFINITION + Name(Spell) + TRIGGER + !GlobalTimerNotExpired("castspell","LOCALS") + HaveSpell(scsargument1) + !StateCheck(scstarget,STATE_NOT_TARGETABLE) + !CheckStatGT(scstarget,0,SANCTUARY) + CheckStatLT(Myself,60,SPELLFAILUREMAGE) + !CheckSpellState(scstarget,DO_NOT_TARGET_SPELLS) + ACTION + RESPONSE #scsprob1 + SetGlobalTimer("castspell","LOCALS",6) + Spell(scstarget,scsargument1) +END + +BEGIN_ACTION_DEFINITION + Name(SpellMyself) + TRIGGER + !GlobalTimerNotExpired("castspell","LOCALS") + HaveSpell(scsargument1) + CheckStatLT(Myself,60,SPELLFAILUREMAGE) + ACTION + RESPONSE #scsprob1 + SetGlobalTimer("castspell","LOCALS",6) + Spell(Myself,scsargument1) +END + +BEGIN_ACTION_DEFINITION + Name(SpellMarker) + TRIGGER + !GlobalTimerNotExpired("castspell","LOCALS") + HaveSpell(scsargument1) + !StateCheck(scstarget,STATE_NOT_TARGETABLE) + !CheckStatGT(scstarget,0,SANCTUARY) + CheckStatLT(Myself,60,SPELLFAILUREMAGE) + !CheckSpellState(scstarget,DO_NOT_TARGET_SPELLS) + ACTION + RESPONSE #scsprob1 + SetGlobalTimer("castspell","LOCALS",6) + ApplySpellRES("%scsargument2%",scstarget) + Spell(scstarget,scsargument1) +END + +IF TRIGGER + OR(2) + ActionListEmpty() + !Allegiance(Myself,ENEMY) +THEN DO + Action(SpellMyself,WIZARD_GHOST_ARMOR) +END + +IF TRIGGER + OR(2) + ActionListEmpty() + !Allegiance(Myself,ENEMY) + OR(2) + Range(NearestEnemyOf(Myself),15) + HPPercentLT(Myself,80) +THEN DO + Action(SpellMyself,WIZARD_MIRROR_IMAGE) +END + +IF TRIGGER + OR(2) + ActionListEmpty() + !Allegiance(Myself,ENEMY) + TargetBlock(EnemiesInOrderShort) + TriggerBlock(MinorGlobe|Helpless) +THEN DO + Action(Spell,WIZARD_LIGHTNING_BOLT|100|100) +END + +IF TRIGGER + OR(2) + ActionListEmpty() + !Allegiance(Myself,ENEMY) + TargetBlock(EnemiesInOrderShort) + Range(scstarget,5) +THEN DO + Action(Spell,WIZARD_BURNING_HANDS|100|100) +END + +IF TRIGGER + Allegiance(Myself,ENEMY) + TargetBlock(PCSpellcasters) + TriggerBlock(MinorGlobe|Helpless|SpellTurn) +THEN DO + Action(Spell,WIZARD_MELF_ACID_ARROW|100|50) +END + +IF TRIGGER + ActionListEmpty() + !Allegiance(Myself,ENEMY) + TargetBlock(EnemiesInOrderShort) + TriggerBlock(MinorGlobe|Helpless|SpellTurn) +THEN DO + Action(Spell,WIZARD_MELF_ACID_ARROW|100|50) +END + +IF TRIGGER + OR(2) + ActionListEmpty() + !Allegiance(Myself,ENEMY) + TargetBlock(EnemiesInOrderShort) + TriggerBlock(MinorGlobe|Helpless|MagicMissile|SpellTurn) + OR(2) + !CheckSpellState(scstarget,ITEM_MM) + !CheckSpellState(scstarget,ITEM_MM_SEEN) +THEN DO + Action(SpellMarker,WIZARD_MAGIC_MISSILE,ITEM_MM_SEEN|100|50) +END + + + diff --git a/iwdification/resource/orc01.cre b/iwdification/resource/orc01.cre new file mode 100644 index 0000000..842b2a0 Binary files /dev/null and b/iwdification/resource/orc01.cre differ diff --git a/iwdification/resource/orc02.cre b/iwdification/resource/orc02.cre new file mode 100644 index 0000000..b7b5012 Binary files /dev/null and b/iwdification/resource/orc02.cre differ diff --git a/iwdification/resource/pettin.cre b/iwdification/resource/pettin.cre new file mode 100644 index 0000000..bc43125 Binary files /dev/null and b/iwdification/resource/pettin.cre differ diff --git a/iwdification/resource/trolgi01.cre b/iwdification/resource/trolgi01.cre new file mode 100644 index 0000000..691527f Binary files /dev/null and b/iwdification/resource/trolgi01.cre differ diff --git a/iwdification/resource/troll01.cre b/iwdification/resource/troll01.cre new file mode 100644 index 0000000..7e88805 Binary files /dev/null and b/iwdification/resource/troll01.cre differ diff --git a/iwdification/resource/trollimm.itm b/iwdification/resource/trollimm.itm new file mode 100644 index 0000000..a092b9f Binary files /dev/null and b/iwdification/resource/trollimm.itm differ diff --git a/iwdification/resource/trollreg.itm b/iwdification/resource/trollreg.itm new file mode 100644 index 0000000..3cffde1 Binary files /dev/null and b/iwdification/resource/trollreg.itm differ diff --git a/iwdification/setup-iwdification.tp2 b/iwdification/setup-iwdification.tp2 index c91b82f..916c04a 100644 --- a/iwdification/setup-iwdification.tp2 +++ b/iwdification/setup-iwdification.tp2 @@ -1,32 +1,35 @@ BACKUP ~iwdification/backup~ // location to store files for uninstall purposes SUPPORT ~http://gibberlings3.net/forums/index.php?showforum=185~ -VERSION ~Beta 6~ +VERSION ~v1~ + +AUTO_EVAL_STRINGS README ~iwdification/readme-iwdification-%LANGUAGE%.html~ ~iwdification/readme-iwdification.html~ ALWAYS - ACTION_IF ((FILE_EXISTS ~dlc/sod-dlc.zip~) OR (FILE_EXISTS ~sod-dlc.zip~)) THEN BEGIN FAIL @1 END // Modmerge check + ACTION_IF ((FILE_EXISTS ~dlc/sod-dlc.zip~) OR (FILE_EXISTS ~sod-dlc.zip~)) THEN BEGIN FAIL @999 END // DLC Merger check - ACTION_IF !VARIABLE_IS_SET ee_game THEN BEGIN + ACTION_IF !VARIABLE_IS_SET enhanced_edition THEN BEGIN - INCLUDE ~iwdification/lib/functions.tpa~ - - OUTER_SET tobex_game = 0 - OUTER_SET ee_game = 0 - OUTER_SET override_arcane = 1 - OUTER_SET override_divine = 1 + OUTER_SPRINT scsroot ~iwdification~ + OUTER_SPRINT resource_loc ~iwdification/dw_iwdspells_resource~ + OUTER_SPRINT iwdspells_data ~data~ + OUTER_SPRINT iwdspells_lib ~lib~ + OUTER_SPRINT iwdspells_resource ~resource~ + OUTER_SPRINT sfo_loc ~sfo~ + OUTER_SPRINT ssl_loc ~ssl~ + OUTER_SPRINT iwdspells_trabase ~dw_iwdspells_resource/tra~ + OUTER_SPRINT inifile ~dw_iwdspells.ini~ + OUTER_SPRINT obg2_res_path ~iwdification/obg2_res~ + OUTER_SET do_not_biff = 1 - ACTION_IF GAME_IS ~soa tob bgt ca tutu tutu_totsc iwd_in_bg2~ THEN BEGIN + OUTER_SET enhanced_edition = 0 - ACTION_IF FILE_EXISTS ~tobex_ini/tobexcore.ini~ THEN BEGIN - OUTER_SET tobex_game = 1 - END - - END ELSE BEGIN + ACTION_IF !GAME_IS ~soa tob bgt ca tutu tutu_totsc iwd_in_bg2~ THEN BEGIN - OUTER_SET ee_game = 1 + OUTER_SET enhanced_edition = 1 // convert strings to UTF-8 for BGEE/BG2EE ACTION_DEFINE_ARRAY cdreload BEGIN game_strings END @@ -42,13 +45,14 @@ END ASK_EVERY_COMPONENT -LANGUAGE ~English~ ~english~ ~iwdification/languages/english/setup.tra~ // installer strings - ~iwdification/languages/english/game_strings.tra~ // strings for the tlk +LANGUAGE ~English~ ~en_us~ ~iwdification/languages/en_us/setup.tra~ // installer strings + ~iwdification/languages/en_us/game_strings.tra~ // strings for the tlk + -LANGUAGE ~French~ ~french~ ~iwdification/languages/english/setup.tra~ // installer strings - ~iwdification/languages/french/setup.tra~ // installer strings - ~iwdification/languages/english/game_strings.tra~ // strings for the tlk - ~iwdification/languages/french/game_strings.tra~ // strings for the tlk +LANGUAGE ~French~ ~fr_fr~ ~iwdification/languages/en_us/setup.tra~ // installer strings + ~iwdification/languages/fr_fr/setup.tra~ // installer strings + ~iwdification/languages/en_us/game_strings.tra~ // strings for the tlk + ~iwdification/languages/fr_fr/game_strings.tra~ // strings for the tlk /////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ /////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ @@ -59,7 +63,8 @@ LANGUAGE ~French~ ~french~ ~iwdification/languages/english/setup.tra~ // /////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ BEGIN @1000 DESIGNATED 10 -REQUIRE_PREDICATE NOT MOD_IS_INSTALLED ~cdtweaks/setup-cdtweaks.tp2~ ~70~ @0 +GROUP @994 +REQUIRE_PREDICATE NOT MOD_IS_INSTALLED ~cdtweaks/setup-cdtweaks.tp2~ ~70~ @998 ACTION_FOR_EACH file IN cgabjura cgaltera cgconjur cgdivina cgenchan cgillusi cginvoca cgnecrom BEGIN @@ -76,7 +81,8 @@ END /////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ BEGIN @2000 DESIGNATED 20 -REQUIRE_PREDICATE NOT MOD_IS_INSTALLED ~cdtweaks/setup-cdtweaks.tp2~ ~100~ @0 +GROUP @994 +REQUIRE_PREDICATE NOT MOD_IS_INSTALLED ~cdtweaks/setup-cdtweaks.tp2~ ~100~ @998 COPY_EXISTING ~randcolr.2da~ ~override~ REPLACE_TEXTUALLY ~HairSet1~ ~CD_DELETE_ME HairSet1~ @@ -127,70 +133,287 @@ COPY_EXISTING ~randcolr.2da~ ~override~ /////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ /////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ ///// \\\\\ -///// IWD arcane spell pack \\\\\ +///// add two-handed axes \\\\\ ///// \\\\\ /////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ /////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ -BEGIN @3000 DESIGNATED 30 +BEGIN @6000 DESIGNATED 60 +GROUP @994 + +COPY ~iwdification/bam/cdax2h1i.bam~ ~override~ + ~iwdification/bam/cdax2h2i.bam~ ~override~ + ~iwdification/bam/cdax2h3i.bam~ ~override~ + ~iwdification/bam/cdax2h4i.bam~ ~override~ + ~iwdification/bam/cdax2h5i.bam~ ~override~ + ~iwdification/bam/cdax2h5s.bam~ ~override~ + ~iwdification/bam/cdax2h6i.bam~ ~override~ + ~iwdification/spl/cdax2h5b.spl~ ~override~ + +COPY ~iwdification/itm/cdax2h1.itm~ ~override~ // generic 2h axe + SAY 0x08 @6001 + SAY 0x0c @6001 + SAY 0x50 @6002 + SAY 0x54 @6002 + +COPY ~iwdification/itm/cdax2h2.itm~ ~override~ // +1 axe + SAY 0x08 @6001 + SAY 0x0c @6003 + SAY 0x50 @6002 + SAY 0x54 @6004 + +COPY ~iwdification/itm/cdax2h3.itm~ ~override~ // +2 axe + SAY 0x08 @6001 + SAY 0x0c @6005 + SAY 0x50 @6002 + SAY 0x54 @6006 + +COPY ~iwdification/itm/cdax2h4.itm~ ~override~ // +3 axe + SAY 0x08 @6001 + SAY 0x0c @6007 + SAY 0x50 @6002 + SAY 0x54 @6008 + +COPY ~iwdification/itm/cdax2h5.itm~ ~override~ // +4 axe + SAY 0x08 @6001 + SAY 0x0c @6009 + SAY 0x50 @6002 + SAY 0x54 @6010 + +COPY ~iwdification/itm/cdax2h6.itm~ ~override~ // +5 axe + SAY 0x08 @6001 + SAY 0x0c @6011 + SAY 0x50 @6002 + SAY 0x54 @6012 + +COPY ~iwdification/spl/cdax2h5g.spl~ ~override~ + SAY 0x08 @6013 + SAY 0x0c @6013 + SAY 0x50 @6013 + SAY 0x54 @6013 + READ_LONG 0x08 string1 + +COPY ~iwdification/spl/cdax2h6g.spl~ ~override~ + SAY 0x08 @6014 + SAY 0x0c @6014 + SAY 0x50 @6014 + SAY 0x54 @6014 + READ_LONG 0x08 string2 + +APPEND ~tooltip.2da~ ~cdax2h5 15529 %string1% -1 +cdax2h6 15529 %string2% -1~ + +COPY_EXISTING ~tooltip.2da~ ~override~ + PRETTY_PRINT_2DA + +ACTION_IF enhanced_edition BEGIN + + // make 2h axes available to shamans + COPY_EXISTING ~cdax2h1.itm~ ~override~ + ~cdax2h2.itm~ ~override~ + ~cdax2h3.itm~ ~override~ + ~cdax2h4.itm~ ~override~ + ~cdax2h5.itm~ ~override~ + ~cdax2h6.itm~ ~override~ + WRITE_BYTE 0x21 (THIS BAND `BIT6) // removes druid restriction, add back as 319 below + LPF ADD_ITEM_EQEFFECT INT_VAR opcode = 319 target = 1 parameter1 = 11 parameter2 = 5 timing = 2 special = 1080 END + BUT_ONLY -INCLUDE ~iwdification/lib/spell_prep.tpa~ +END ///// \\\\\ -///// WIZARD_EMOTION_HOPELESSNESS \\\\\ +///// places axes in game \\\\\ ///// \\\\\ -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_EMOTION_COURAGE~) OR override_arcane) BEGIN // checking courage to see if emotion series is already present, since hopelessness is a vanilla bg2 spell +// add generic 2h axes to any store that sells generic 1h axes; same with +1 models +COPY_EXISTING_REGEXP GLOB ~^.+\.sto$~ ~override~ + READ_LONG 0x34 sale_off ELSE 0 + READ_LONG 0x38 sale_num ELSE 0 + SET ax_idx = 0 + SET ax1_idx = 0 + SET delta = 0 + FOR (index = 0 ; index < sale_num ; ++index) BEGIN + READ_ASCII (sale_off + (index * 0x1c)) item + PATCH_IF (("%item%" STRING_COMPARE_CASE "ax1h01" = 0) OR ("%item%" STRING_COMPARE_CASE "_ax1h01" = 0)) BEGIN // 1h axe + READ_ASCII (sale_off + (index * 0x1c)) clone (28) // read entry + SET ax_idx = (index + 1) // sets right after as insert point + END ELSE + PATCH_IF (("%item%" STRING_COMPARE_CASE "ax1h02" = 0) OR ("%item%" STRING_COMPARE_CASE "_ax1h02" = 0)) BEGIN // 1h axe +1 + READ_ASCII (sale_off + (index * 0x1c)) clone1 (28) // read entry + SET ax1_idx = (index + 1) // sets right after as insert point + END + END + PATCH_IF (ax1_idx > 0) BEGIN // if 1h axes present, add in 2h axes + INSERT_BYTES (sale_off + (ax1_idx * 0x1c)) 28 + WRITE_ASCIIE (sale_off + (ax1_idx * 0x1c)) ~%clone1%~ // clones 1h axe +1 entry + WRITE_ASCII (sale_off + (ax1_idx * 0x1c)) ~cdax2h2~ #8 // change to 2h axe +1 + SET delta += 1 + END + PATCH_IF (ax_idx > 0) BEGIN // if 1h axes present, add in 2h axes + INSERT_BYTES (sale_off + (ax_idx * 0x1c)) 28 + WRITE_ASCIIE (sale_off + (ax_idx * 0x1c)) ~%clone%~ // clones 1h axe entry + WRITE_ASCII (sale_off + (ax_idx * 0x1c)) ~cdax2h1~ #8 // change to 2h axe + SET delta += 1 + END + PATCH_IF (delta > 0) BEGIN + WRITE_LONG 0x38 (sale_num + delta) + PATCH_FOR_EACH offset IN 0x2c 0x4c 0x70 BEGIN + READ_LONG offset off + PATCH_IF (off > sale_off) BEGIN + WRITE_LONG offset (THIS + (delta * 0x1c)) + END + END + END + BUT_ONLY + +ACTION_IF ((FILE_EXISTS_IN_GAME ~garkla.cre~) OR (FILE_EXISTS_IN_GAME ~_garkla.cre~)) THEN BEGIN // bgt/bgee/tutu + + COPY_EXISTING_REGEXP GLOB ~_?garkla.cre~ ~override~ // garclax at the bandit camp + REPLACE_CRE_ITEM ~cdax2h3~ #0 #0 #0 ~NONE~ ~WEAPON1~ EQUIP TWOHANDED // add +2 axe to garclax in bandit camp - ADD_PROJECTILE ~iwdification/pro/cdi255.pro~ +END - COPY ~iwdification/spl/cdia411.spl~ ~override/spwi411.spl~ // hopelessness - SAY 0x08 @3001 - SAY 0x50 @3002 - SAY 0x18e @3003 - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi255 END - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 1280 parameter1 = string_stunned END - PATCH_IF !ee_game BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 321 END - END +ACTION_IF ((FILE_EXISTS_IN_GAME ~ar0602.bcs~) AND (FILE_EXISTS_IN_GAME ~hlolaf.cre~)) THEN BEGIN // soa + + EXTEND_BOTTOM ~ar0602.bcs~ ~iwdification/baf/ar0602.baf~ // add generic 2H axe to CI + + COPY_EXISTING ~hlolaf.cre~ ~override~ + REPLACE_CRE_ITEM ~cdax2h3~ #0 #0 #0 ~NONE~ ~WEAPON1~ EQUIP TWOHANDED // add +2 axe to olaf at guarded compound + IF_EXISTS + +END + +ACTION_IF FILE_EXISTS_IN_GAME ~botsmith.bcs~ THEN BEGIN // tob + + EXTEND_BOTTOM ~ar3017.bcs~ ~iwdification/baf/ar3017.baf~ // add generic 2H axe to wk (pile of normal weapons for magic golems) + + EXTEND_BOTTOM ~botsmith.bcs~ ~iwdification/baf/botsmith.baf~ // cespy's upgrade of the +4 axe to +5 + COMPILE ~iwdification/dlg/botsmith.d~ + + // add +3 2h axes to any store that sells generic +3 1h axes (opening stores in ToB) + COPY_EXISTING ~amsmug01.sto~ ~override~ + ~amsmug02.sto~ ~override~ + ADD_STORE_ITEM ~cdax2h4~ AFTER ~ax1h17~ #0 #0 #0 ~IDENTIFIED~ #1 // +3 2h axe - COPY_EXISTING ~scrl5h.itm~ ~override~ - SAY 0x0c @3001 - SAY 0x54 @3002 - WRITE_BYTE 0x2d BIT3 // invoker flag - LPF ALTER_ITEM_HEADER INT_VAR range = 50 target = 4 END + // add +3 2h axes to any store that sells generic +3 1h axes (opening stores in ToB) + COPY_EXISTING ~sarbar01.sto~ ~override~ + ADD_STORE_ITEM ~cdax2h4~ AFTER ~ax1h17~ #0 #0 #0 ~IDENTIFIED~ #3 // +3 2h axe - COPY ~iwdification/bam/cdia411a.bam~ ~override~ - ~iwdification/bam/cdia411b.bam~ ~override~ - ~iwdification/bam/cdia411c.bam~ ~override~ - ~iwdification/bam/cdienchx.bam~ ~override~ - ~iwdification/bam/cdiparal.bam~ ~override~ - ~iwdification/vvc/cdigench.vvc~ ~override~ - ~iwdification/vvc/cdiparal.vvc~ ~override~ - ~iwdification/wav/cdiarm21.wav~ ~override~ - ~iwdification/wav/cdiee05.wav~ ~override~ - ~iwdification/wav/cdiem05.wav~ ~override~ + COPY_EXISTING ~gromg04.cre~ ~override~ + REPLACE_CRE_ITEM ~cdax2h5~ #2 #2 #2 ~NONE~ ~WEAPON1~ EQUIP TWOHANDED // add +4 axe to one of gromnir's bodyguards END +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ ///// \\\\\ -///// WIZARD_POLYMORPH_SELF \\\\\ +///// expanded polymorph self \\\\\ ///// \\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ + +BEGIN @9000 DESIGNATED 90 +GROUP @994 + +// first, some general cleanup and fixes to the spells +COPY_EXISTING ~spwi498.spl~ ~override~ // Black Bear + LPF ALTER_EFFECT INT_VAR match_opcode = 111 STR_VAR resource = PLYBEAR2 END + +// create different weapons for black/brown bears +COPY_EXISTING ~plybear1.itm~ ~override/plybear2.itm~ // Black Bear + +ACTION_CLEAR_ARRAY cd_poly_self +ACTION_DEFINE_ASSOCIATIVE_ARRAY cd_poly_self BEGIN + + // item, creature => spell + plyflind, plyflind => spwi493 // flind + plymstar, plyogre => spwi494 // ogre + plyspid, plyspid => spwi495 // spider + plyjelly, jellmu => spwi496 // mustard jelly + plybear1, bearbr => spwi497 // brown bear + plybear2, bearbl => spwi498 // black bear + plywolf1, plywolf => spwi499 // wolf + +END + +ACTION_PHP_EACH cd_poly_self AS params => spell BEGIN + + // first, some general cleanup and fixes to the spells + COPY_EXISTING ~%spell%.spl~ ~override~ + LPF DELETE_EFFECT INT_VAR match_opcode = 112 END // remove 'remove item' calls + LPF DELETE_EFFECT INT_VAR match_opcode = 135 END // move polymorph to claws + LPF DELETE_EFFECT INT_VAR match_opcode = 144 END // move disable button to claws, too + LPF DELETE_EFFECT INT_VAR match_opcode = 172 END // get a clean start for the spell removals + LPF ADD_SPELL_EFFECT INT_VAR insert_point = 0 opcode = 172 target = 1 timing = 1 STR_VAR resource = spin974 END // remove spell + PATCH_FOR_EACH res IN spin122 spin123 spin124 spin150 spin151 spin160 spin160 spin160 spin529 spin667 spin718 spinhum spmdslay spwi489 spwi490 spwi491 BEGIN + LPF CLONE_EFFECT INT_VAR match_opcode = 172 STR_VAR match_resource = spin974 resource = EVAL ~%res%~ END + END + LPF CLONE_EFFECT INT_VAR match_opcode = 171 STR_VAR match_resource = EVAL ~%spell%~ resource = spwi490 END + BUT_ONLY + + COPY_EXISTING ~%params_0%.itm~ ~override~ + LPF ADD_ITEM_EQEFFECT INT_VAR opcode = 144 target = 1 parameter2 = 7 timing = 2 END + LPF ADD_ITEM_EQEFFECT INT_VAR opcode = 135 target = 1 timing = 2 STR_VAR resource = EVAL ~%params_1%~ END + BUT_ONLY + +END + +OUTER_SET anim_beetle = 0 // 30720 gibb for testing +ACTION_IF enhanced_edition BEGIN + + OUTER_SET anim_beetle = 57888 + COPY ~iwdification/data/anim/e220.ini~ ~override~ + ~iwdification/dw_iwdspells_resource/anim/bam~ ~override~ + ~iwdification/dw_iwdspells_resource/anim/wav~ ~override~ + +END ELSE BEGIN + + ACTION_IF MOD_IS_INSTALLED ~INFINITYANIMATIONS/SETUP-INFINITYANIMATIONS.TP2~ ~500~ BEGIN // 'more base animations' + + ACTION_IF IDS_OF_SYMBOL (~animate~ ~BEETLE_BLACK~) > 0 THEN BEGIN + OUTER_SET anim_beetle = IDS_OF_SYMBOL (~animate~ ~BEETLE_BLACK~) + END + + END + +END + +COPY ~iwdification/bam/cdia480.bam~ ~override~ // bb weapon icon + ~iwdification/bam/cdia480b.bam~ ~override~ // bb spell icon + ~iwdification/bam/cdia481.bam~ ~override~ // pb weapon icon + ~iwdification/bam/cdia481b.bam~ ~override~ // pb spell icon + ~iwdification/bam/cdia482.bam~ ~override~ // ww weapon icon + ~iwdification/bam/cdia482b.bam~ ~override~ // ww spell icon + ~iwdification/cre/cdia481.cre~ ~override~ // polar bear creature doesn't need strings + ~iwdification/cre/cdia482.cre~ ~override~ // winter wolf creature doesn't need strings + +COPY ~iwdification/cre/cdia480.cre~ ~override~ // boring beetle creature does need string, animation + SAY 0x08 @9001 + SAY 0x0c @9001 + WRITE_LONG 0x28 anim_beetle + +COPY ~iwdification/itm/cdia480.itm~ ~override~ // bb weapon + ~iwdification/itm/cdia481.itm~ ~override~ // pb weapon + ~iwdification/itm/cdia482.itm~ ~override~ // ww weapon + LPF ADD_ITEM_EQEFFECT INT_VAR opcode = 144 target = 1 parameter2 = 7 timing = 2 END + LPF ADD_ITEM_EQEFFECT INT_VAR opcode = 135 target = 1 timing = 2 STR_VAR resource = EVAL ~%SOURCE_RES%~ END // these generally 'clean out' the poly self subspells COPY_EXISTING ~#rdremov.spl~ ~override~ // resurrection subspell (2.6) ~bhaal4a.spl~ ~override~ // resurrection ~ohbraise.spl~ ~override~ // nsi - ~slayerw3.itm~ ~override~ // slater weapon + ~slayerw3.itm~ ~override~ // slayer weapon + ~slayerw2.spl~ ~override~ // slayer transformation (Ascension) + ~slayerw3.spl~ ~override~ // slayer transformation (Ascension) + ~slayerw4.spl~ ~override~ // slayer transformation (Ascension) + ~spin823.spl~ ~override~ // slayer change ~spja01.spl~ ~override~ // harper's call ~sppr504.spl~ ~override~ // raise dead ~sppr550.spl~ ~override~ // recall spirit ~sppr712.spl~ ~override~ // resurrection ~sppr729.spl~ ~override~ // mass raise dead ~spwish10.spl~ ~override~ // mass raise dead - PATCH_IF anim_beetle BEGIN - LPF CLONE_EFFECT INT_VAR silent = 1 STR_VAR match_resource = spwi499 resource = cdia480 END // boring beetle - END + LPF CLONE_EFFECT INT_VAR silent = 1 STR_VAR match_resource = spwi499 resource = cdia480 END // boring beetle LPF CLONE_EFFECT INT_VAR silent = 1 STR_VAR match_resource = spwi499 resource = cdia481 END // polar bear LPF CLONE_EFFECT INT_VAR silent = 1 STR_VAR match_resource = spwi499 resource = cdia482 END // winter wolf BUT_ONLY IF_EXISTS @@ -199,5052 +422,920 @@ COPY_EXISTING ~#rdremov.spl~ ~override~ // resurrection subspell (2.6) COPY_EXISTING ~spwi416.spl~ ~override~ // poly self PATCH_IF anim_beetle BEGIN LPF CLONE_EFFECT STR_VAR match_resource = spwi499 resource = cdia480 END // boring beetle - SAY 0x50 @3004 + SAY 0x50 @9004 END ELSE BEGIN - SAY 0x50 @3014 + SAY 0x50 @9002 END LPF CLONE_EFFECT STR_VAR match_resource = spwi499 resource = cdia481 END // polar bear LPF CLONE_EFFECT STR_VAR match_resource = spwi499 resource = cdia482 END // winter wolf -COPY ~iwdification/spl/cdia481.spl~ ~override~ // polar bear - SAY 0x08 @3007 - SAY 0x50 @3008 - -COPY ~iwdification/spl/cdia482.spl~ ~override~ // winter wolf - SAY 0x08 @3009 - SAY 0x50 @3012 +COPY_EXISTING ~spwi499.spl~ ~override/cdia480.spl~ // shapeshift: boring beetle + ~spwi499.spl~ ~override/cdia481.spl~ // shapeshift: polar bear + ~spwi499.spl~ ~override/cdia482.spl~ // shapeshift: winter wolf + SAY 0x08 @9005 + SAY 0x50 @9006 + WRITE_ASCIIE 0x3a ~%DEST_RES%b~ #8 + LPF ALTER_SPELL_HEADER STR_VAR icon = EVAL ~%DEST_RES%b~ END + LPF ALTER_EFFECT INT_VAR match_opcode = 111 STR_VAR resource = EVAL ~%DEST_RES%~ END // give weapon + LPF ALTER_EFFECT INT_VAR match_opcode = 171 STR_VAR match_resource = spwi499 resource = EVAL ~%DEST_RES%~ END // give innate -COPY_EXISTING ~cdia481.spl~ ~override~ - ~cdia482.spl~ ~override~ - PATCH_FOR_EACH res IN spin122 spin123 spin124 spin150 spin151 spin160 spin160 spin160 spin529 spin667 spin718 spinhum spmdslay spwi489 spwi490 spwi491 BEGIN - LPF CLONE_EFFECT INT_VAR match_opcode = 172 STR_VAR match_resource = spin974 resource = EVAL ~%res%~ END - END - LPF ALTER_EFFECT INT_VAR match_opcode = 135 opcode = 171 timing = 1 STR_VAR resource = spwi490 END // move polymorph ops to the claws - LPF DELETE_EFFECT INT_VAR match_opcode = 144 END // move delete button to claws, too +COPY_EXISTING ~cdia481.spl~ ~override~ // shapeshift: polar bear + SAY 0x08 @9007 + SAY 0x50 @9008 -//LAF cd_animation STR_VAR code = 7203 END // 29187 MBER_PO bear_polar -COPY ~iwdification/cre/cdidrupb.cre~ ~override~ - SAY 0x08 @3015 - SAY 0x0c @3015 +COPY_EXISTING ~cdia482.spl~ ~override~ // shapeshift: winter wolf + SAY 0x08 @9009 + SAY 0x50 @9010 -//LAF cd_animation STR_VAR code = 7b03 END // 31491 MWLF_WI wolf_winter -COPY ~iwdification/cre/cdidruww.cre~ ~override~ - WRITE_LONG 0x08 string_wwolf - WRITE_LONG 0x0c string_wwolf +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +///// \\\\\ +///// Use IWD Damage Animations \\\\\ +///// \\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ -COPY ~iwdification/itm/cdiplypb.itm~ ~override~ - ~iwdification/itm/cdiplyww.itm~ ~override~ - WRITE_LONG 0x08 string_attack - WRITE_LONG 0x0c string_attack +BEGIN @13000 DESIGNATED 130 +GROUP @994 +REQUIRE_PREDICATE !GAME_IS ~soa tob bgt ca tutu tutu_totsc iwd_in_bg2~ @997 -COPY_EXISTING ~cdiplypb.itm~ ~override~ - LPF ADD_ITEM_EQEFFECT INT_VAR opcode = 144 target = 1 parameter2 = 7 timing = 2 END - LPF ADD_ITEM_EQEFFECT INT_VAR opcode = 135 target = 1 timing = 2 STR_VAR resource = cdidrupb END +COPY_EXISTING ~dmgtypes.2da~ ~override~ + REPLACE_TEXTUALLY ~^\(MAGICFIRE\|FIRE\)[ %TAB%]+[^ %TAB%]+[ %TAB%]+[^ %TAB%]+[ %TAB%]+[^ %TAB%]+~ ~\1 MISC_01C FIREH FIREL~ + REPLACE_TEXTUALLY ~^\(MAGICCOLD\|COLD\)[ %TAB%]+[^ %TAB%]+[ %TAB%]+[^ %TAB%]+[ %TAB%]+[^ %TAB%]+~ ~\1 EFF_M46 COLDH COLDL~ + REPLACE_TEXTUALLY ~^ELECTRICITY[ %TAB%]+[^ %TAB%]+[ %TAB%]+[^ %TAB%]+[ %TAB%]+[^ %TAB%]+~ ~ELECTRICITY MISC_02C ELECTRH ELECTRL~ + REPLACE_TEXTUALLY ~^ACID[ %TAB%]+[^ %TAB%]+[ %TAB%]+[^ %TAB%]+[ %TAB%]+[^ %TAB%]+~ ~ACID EFF_M47 ACIDH *~ + PRETTY_PRINT_2DA + +COPY ~iwdification/bam/blank.bam~ ~override/shacid.bam~ + ~iwdification/bam/coldh.bam~ ~override~ + ~iwdification/bam/coldl.bam~ ~override~ + ~iwdification/bam/electrh.bam~ ~override~ + ~iwdification/bam/electrl.bam~ ~override~ + ~iwdification/bam/fireh.bam~ ~override~ + ~iwdification/bam/firel.bam~ ~override~ + ~iwdification/obg2_res/acidh.vvc~ ~override~ + ~iwdification/obg2_res/acidh_ee.bam~ ~override/acidh.bam~ + ~iwdification/vvc/coldh.vvc~ ~override~ + ~iwdification/vvc/electrh.vvc~ ~override~ + ~iwdification/vvc/fireh.vvc~ ~override~ + ~iwdification/wav/eff_m46.wav~ ~override~ + ~iwdification/wav/eff_m47.wav~ ~override~ + ~iwdification/wav/misc_01c.wav~ ~override~ + ~iwdification/wav/misc_02c.wav~ ~override~ + + -COPY_EXISTING ~cdiplyww.itm~ ~override~ - LPF ADD_ITEM_EQEFFECT INT_VAR opcode = 144 target = 1 parameter2 = 7 timing = 2 END - LPF ADD_ITEM_EQEFFECT INT_VAR opcode = 135 target = 1 timing = 2 STR_VAR resource = cdidruww END +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +///// \\\\\ +///// IWD arcane spell pack \\\\\ +///// \\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ -COPY ~iwdification/bam/cdia481b.bam~ ~override~ - ~iwdification/bam/cdia482b.bam~ ~override~ - ~iwdification/bam/cdiplypb.bam~ ~override~ - ~iwdification/bam/cdiplyww.bam~ ~override~ +BEGIN @3000 DESIGNATED 30 +GROUP @993 -ACTION_IF anim_beetle BEGIN +OUTER_SPRINT obg2 "" - COPY ~iwdification/spl/cdia480.spl~ ~override~ // boring beetle - SAY 0x08 @3005 - SAY 0x50 @3006 - PATCH_FOR_EACH res IN spin122 spin123 spin124 spin150 spin151 spin160 spin160 spin160 spin529 spin667 spin718 spinhum spmdslay spwi489 spwi490 spwi491 BEGIN - LPF CLONE_EFFECT INT_VAR match_opcode = 172 STR_VAR match_resource = spin974 resource = EVAL ~%res%~ END - END - LPF ALTER_EFFECT INT_VAR match_opcode = 135 opcode = 171 timing = 1 STR_VAR resource = spwi490 END // move polymorph ops to the claws - LPF DELETE_EFFECT INT_VAR match_opcode = 144 END // move delete button to claws, too - - LAF cd_animation STR_VAR code = e220 END // 57888 MBBM beetle_black - COPY ~iwdification/cre/cdidrubb.cre~ ~override~ - SAY 0x08 @3013 - SAY 0x0c @3013 - WRITE_LONG 0x28 anim_beetle - - COPY ~iwdification/itm/cdiplybb.itm~ ~override~ - ~iwdification/itm/cdis5-20.itm~ ~override~ - WRITE_LONG 0x08 string_attack - WRITE_LONG 0x0c string_attack - - COPY_EXISTING ~cdiplybb.itm~ ~override~ - LPF ADD_ITEM_EQEFFECT INT_VAR opcode = 144 target = 1 parameter2 = 7 timing = 2 END - LPF ADD_ITEM_EQEFFECT INT_VAR opcode = 135 target = 1 timing = 2 STR_VAR resource = cdidrubb END - - COPY ~iwdification/bam/cdia480b.bam~ ~override~ - ~iwdification/bam/cdiplybb.bam~ ~override~ +ACTION_IF !enhanced_edition BEGIN // don't bother importing spells that won't work for non-ee games -END + OUTER_SPRINT obg2 "_obg2" + // some of the scripting brought over uses EE-specific commands, so + COPY ~%scsroot%/%iwdspells_resource%/dw#msogr.baf~ ~%scsroot%/%iwdspells_resource%/dw#msogr.baf~ + REPLACE_TEXTUALLY ~!CheckSpellState(Myself,STATE_ENRAGED)~ ~StateCheck(Myself,STATE_BERSERK)~ + + // imported ogremasu has all sorts of CheckSpellState stuff, so ignore it + COPY_EXISTING ~ogremasu.bcs~ ~%scsroot%/%iwdspells_resource%/ogremasu.baf~ + DECOMPILE_BCS_TO_BAF + + APPEND ~class.ids~ ~219 ELEMENTAL_WATER~ + COPY ~%resource_loc%/arcane_resrefs.txt~ ~%resource_loc%/arcane_resrefs_obg2.txt~ + PATCH_IF !enhanced_edition BEGIN + PATCH_IF !FILE_EXISTS ~tobex_ini/tobexcore.ini~ BEGIN // cat's grace will work on non-ee, but only with tobex + REPLACE_TEXTUALLY ~^WIZARD_CATS_GRACE[ %TAB%]+SP\(WI\|PR\|CL\|IN\)[0-9]+[ %TAB%%LNL%%MNL%%WNL%]+~ ~~ + END + PATCH_FOR_EACH cdspell IN + WIZARD_SOUL_EATER WIZARD_SEVEN_EYES SEVEN_EYES_MIND SEVEN_EYES_MAGE SEVEN_EYES_SWORD // soul eater & seven eyes + SEVEN_EYES_VENOM SEVEN_EYES_FORTITUDE SEVEN_EYES_SPIRIT SEVEN_EYES_STONE + BEGIN // ee spels that won't work even with tobex + REPLACE_TEXTUALLY ~^%cdspell%[ %TAB%]+SP\(WI\|PR\|CL\|IN\)[0-9]+[ %TAB%%LNL%%MNL%%WNL%]+~ ~~ + END + END + +END + ///// \\\\\ -///// WIZARD_EXPEDITIOUS_RETREAT \\\\\ +///// begin generated from iwdspells \\\\\ ///// \\\\\ -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_EXPEDITIOUS_RETREAT~) OR override_arcane) BEGIN - - ADD_SPELL ~iwdification/spl/cdia126.spl~ 2 1 WIZARD_EXPEDITIOUS_RETREAT - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3010 // name - SAY 0x50 @3011 // descript - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 37787 parameter1 = string_slowed END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 37638 parameter1 = string_slow END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 36035 parameter1 = string_hasted END - PATCH_IF !ee_game BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 321 END - END +INCLUDE ~%scsroot%/%iwdspells_lib%/always.tph~ + +LAF make_label STR_VAR label=dw#iwd_arcane END - COPY ~iwdification/itm/blank.itm~ ~override/cdia126.itm~ - SAY 0x0c @3010 - SAY 0x54 @3011 - LPF cd_scroll INT_VAR unusable2 = BIT6 target_hdr = 5 range = 1 price = 100 STR_VAR spell = EVAL ~%current_spell_res%~ END +LAF include STR_VAR file=lib_spell_style.tph location="%iwdspells_lib%" END +LAF include STR_VAR file=install_iwd_spell_resources.tpa location="%iwdspells_lib%" END - COPY ~iwdification/bam/cdia126a.bam~ ~override~ - ~iwdification/bam/cdia126b.bam~ ~override~ - ~iwdification/bam/cdia126c.bam~ ~override~ +LAF install_iwd_spell_resources + INT_VAR + truncate_at_level=20 + iwdification_extra=1 + STR_VAR + scroll_shadow_list=iwd_arcane.2da + spell_list=EVAL ~arcane_resrefs%obg2%.txt~ + lookup=iwd_strref.txt + smtables_list=arcane_smtable.txt + scroll_price_list=scroll_prices_arcane.txt + proj_list=arcane_proj.txt + tra=iwdspells.tra + biff="dw#iwdm" + afterwards="arcane_spells_postproduction" + afterwards_tra="dw_iwdspells_arcane.tra" + bam_copy="bam_copy_arcane.2da" + green_bams="green_spells_arcane.2da" + style_old="%iwdspells_data%/spell_styles_iwd.2da" + style_new="%iwdspells_data%/spell_styles_bg.2da" +END +ACTION_IF MOD_IS_INSTALLED "spell_rev/setup-spell_rev.tp2" 55 BEGIN + LAF run STR_VAR file=sr_nwn_spelldeflection location="%iwdspells_lib%" version=sr_nwn_arcane END END +ACTION_IF enhanced_edition BEGIN // subroutine for adding spells to hotkey list in bgee.lua + LAF run STR_VAR file=rebuild_spell_hotkeys location="%iwdspells_lib%" END +END + ///// \\\\\ -///// WIZARD_SNILLOCS_SNOWBALL_SWARM \\\\\ +///// some basic spell usage in generic AI \\\\\ ///// \\\\\ -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_SNILLOCS_SNOWBALL_SWARM~) OR override_arcane) BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdi217.pro~ - - ADD_SPELL ~iwdification/spl/cdia204.spl~ 2 2 WIZARD_SNILLOCS_SNOWBALL_SWARM - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3020 // name - SAY 0x50 @3021 // descript - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi217 END - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT STR_VAR match_resource = cdia204 resource = EVAL ~%DEST_RES%~ END - END ELSE BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 318 END - LPF DELETE_EFFECT INT_VAR match_opcode = 12 multi_match = 1 END // delete one of these - LPF CD_SPLIT_SAVE_DAMAGE END - END +ACTION_DEFINE_ASSOCIATIVE_ARRAY cd_mage_subs BEGIN - COPY ~iwdification/itm/blank.itm~ ~override/cdia204.itm~ - SAY 0x0c @3020 - SAY 0x54 @3021 - LPF cd_scroll INT_VAR unusable1 = BIT1 target_hdr = 4 range = 40 opcode = 148 target_eff = 1 price = 900 STR_VAR spell = EVAL ~%current_spell_res%~ END - - COPY ~iwdification/bam/cdia204a.bam~ ~override~ - ~iwdification/bam/cdia204b.bam~ ~override~ - ~iwdification/bam/cdia204c.bam~ ~override~ - ~iwdification/vvc/cdissswa.vvc~ ~override~ // pro resources - ~iwdification/bam/cdiswarr.bam~ ~override~ - ~iwdification/bam/cdiswart.bam~ ~override~ - ~iwdification/bam/cdissswx.bam~ ~override~ - ~iwdification/wav/cdirngm2.wav~ ~override~ - ~iwdification/wav/cditra18.wav~ ~override~ - - ACTION_IF !ee_game BEGIN - - COPY_EXISTING ~cdi217.pro~ ~override~ - WRITE_BYTE 0x217 14 + WIZARD_EMOTION_FEAR => WIZARD_CONFUSION // found in MAGE8B.BCS + WIZARD_CONJURE_LESSER_WATER_ELEMENTAL => WIZARD_CONJURE_LESSER_EARTH_ELEMENTAL // found in MAGE10B.BCS + WIZARD_BELTYNS_BURNING_BLOOD => WIZARD_CONTAGION // found in MAGE14D.BCS + WIZARD_LANCE_OF_DISRUPTION => WIZARD_FLAME_ARROW // found in MAGE11.BCS + WIZARD_SHADES => WIZARD_INVISIBLE_STALKER // found in MAGE14C.BCS + WIZARD_ICELANCE => WIZARD_LIGHTNING_BOLT // found in MAGE8D.BCS + WIZARD_SHADOW_MONSTERS => WIZARD_SPIDER_SPAWN // found in MAGE10B.BCS + WIZARD_SNILLOCS_SNOWBALL_SWARM => WIZARD_STINKING_CLOUD // found in MAGE10A.BCS - END - END +COPY_EXISTING_REGEXP GLOB ~^_?mage[0-9]+[A-Z]*\.bcs$~ ~override~ + DECOMPILE_AND_PATCH BEGIN + PATCH_PHP_EACH cd_mage_subs AS new => old BEGIN + REPLACE_TEXTUALLY ~RESPONSE[ %TAB%]#\([0-9]+\)[ %TAB%%LNL%%MNL%%WNL%]+Spell(\([^,]+\),%old%)[ %TAB%%LNL%%MNL%%WNL%]+END~ + ~RESPONSE #\1 RemoveSpell(%old%) SpellNoDec(\2,%new%) RESPONSE #\1 Spell(\2,%old%) END~ + END + END + BUT_ONLY + +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ ///// \\\\\ -///// WIZARD_DECASTAVE \\\\\ +///// IWD divine spell pack \\\\\ ///// \\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_DECASTAVE~) OR override_arcane) BEGIN - - ADD_SPELL ~iwdification/spl/cdia216.spl~ 2 2 WIZARD_DECASTAVE - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3030 // name - SAY 0x50 @3031 // descript +BEGIN @4000 DESIGNATED 40 +GROUP @993 - COPY ~iwdification/itm/blank.itm~ ~override/cdia216.itm~ - SAY 0x0c @3030 - SAY 0x54 @3031 - LPF cd_scroll INT_VAR unusable1 = BIT1 target_hdr = 5 range = 1 target_eff = 1 price = 300 STR_VAR spell = EVAL ~%current_spell_res%~ END +OUTER_SPRINT obg2 "" - COPY ~iwdification/itm/cdideca.itm~ ~override~ - SAY 0x08 @3030 - SAY 0x0c @3030 - PATCH_IF !ee_game BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 12 opcode = 146 parameter2 = 1 special = 0 dicenumber = 0 dicesize = 0 STR_VAR resource = cdideca END - END +ACTION_IF !enhanced_edition BEGIN // don't bother importing spells that won't work for non-ee games - COPY ~iwdification/bam/cdia216a.bam~ ~override~ - ~iwdification/bam/cdia216b.bam~ ~override~ - ~iwdification/bam/cdia216c.bam~ ~override~ - ~iwdification/bam/cdideca.bam~ ~override~ - ~iwdification/bam/cdiinvoc.bam~ ~override~ - ~iwdification/vvc/cdiinvoc.vvc~ ~override~ - ~iwdification/wav/cdiee02.wav~ ~override~ - ~iwdification/wav/cdiem06.wav~ ~override~ + OUTER_SPRINT obg2 "_obg2" + OUTER_SET anim_beetle = 0 + ACTION_IF MOD_IS_INSTALLED ~INFINITYANIMATIONS/SETUP-INFINITYANIMATIONS.TP2~ ~500~ BEGIN // 'more base animations' - ACTION_IF !ee_game BEGIN + ACTION_IF IDS_OF_SYMBOL (~animate~ ~BEETLE_BLACK~) > 0 THEN BEGIN + OUTER_SET anim_beetle = IDS_OF_SYMBOL (~animate~ ~BEETLE_BLACK~) + END - COPY ~iwdification/spl/cdideca.spl~ ~override~ - END -END + COPY ~%resource_loc%/divine_resrefs.txt~ ~%resource_loc%/divine_resrefs_obg2.txt~ + PATCH_IF !enhanced_edition BEGIN + PATCH_FOR_EACH cdspell IN + /*CLERIC_MOLD_TOUCH*/ CLERIC_FAVOR_OF_ILMATER CLERIC_SMASHING_WAVE CLERIC_WALL_OF_MOONLIGHT CLERIC_SPIRITUAL_WRATH + BEGIN // ee spels that won't work even with tobex + REPLACE_TEXTUALLY ~^%cdspell%[ %TAB%]+SP\(WI\|PR\|CL\|IN\)[0-9]+[ %TAB%%LNL%%MNL%%WNL%]+~ ~~ + END + PATCH_IF !anim_beetle BEGIN // exclude giant insect without beetle animations + REPLACE_TEXTUALLY ~^INNATE_BOMBARDIER_BEETLE_CLOUD[ %TAB%]+SP\(WI\|PR\|CL\|IN\)[0-9]+[ %TAB%%LNL%%MNL%%WNL%]+~ ~~ + REPLACE_TEXTUALLY ~^CLERIC_GIANT_INSECT[ %TAB%]+SP\(WI\|PR\|CL\|IN\)[0-9]+[ %TAB%%LNL%%MNL%%WNL%]+~ ~~ + END + END + +END ///// \\\\\ -///// WIZARD_CATS_GRACE \\\\\ -///// \\\\\ - -ACTION_IF ((ee_game OR tobex_game) AND (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_CATS_GRACE~) OR override_arcane)) BEGIN - - LAF cd_new_portrait_icon INT_VAR string = RESOLVE_STR_REF(@3040) STR_VAR bam_file = cdia225d RET icon END - - ADD_SPELL ~iwdification/spl/cdia225.spl~ 2 2 WIZARD_CATS_GRACE - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3040 // name - SAY 0x50 @3041 // descript - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 14024 parameter1 = string_dexmod END - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT STR_VAR match_resource = cdia225 resource = EVAL ~%DEST_RES%~ END - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 185 parameter2 = icon END - END ELSE BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 321 END - LPF DELETE_EFFECT INT_VAR match_opcode = 328 END - LPF CLONE_EFFECT INT_VAR match_opcode = 15 opcode = 206 parameter1 = 0 parameter2 = 0 STR_VAR insert = last resource = EVAL ~%DEST_RES%~ END - END +///// begin generated from iwdspells \\\\\ +///// \\\\\ - COPY ~iwdification/itm/blank.itm~ ~override/cdia225.itm~ - SAY 0x0c @3040 - SAY 0x54 @3041 - LPF cd_scroll INT_VAR unusable2 = BIT6 range = 1 STR_VAR price = 200 spell = EVAL ~%current_spell_res%~ END +INCLUDE ~%scsroot%/%iwdspells_lib%/always.tph~ - ACTION_IF ee_game BEGIN - APPEND ~splstate.ids~ ~45 CATS_GRACE~ UNLESS ~^45[ %TAB%]+CATS_GRACE[ %TAB%%LNL%%MNL%%WNL%]+~ - END +LAF make_label STR_VAR label=dw#iwd_divine END +LAF include STR_VAR file=lib_spell_style.tph location="%iwdspells_lib%" END +LAF include STR_VAR file=install_iwd_spell_resources.tpa location="%iwdspells_lib%" END +LAF install_iwd_spell_resources + INT_VAR + truncate_at_level=20 + STR_VAR + spell_list=EVAL ~divine_resrefs%obg2%.txt~ + lookup=iwd_strref.txt + proj_list=divine_proj.txt + smtables_list=divine_smtable.txt + scroll_price_list=scroll_prices_divine.txt + tra=iwdspells.tra + biff="dw#iwdp" + afterwards="divine_spells_postproduction" + afterwards_tra="dw_iwdspells_divine.tra" + bam_copy="bam_copy_divine.2da" + green_bams="" + style_old="%iwdspells_data%/spell_styles_iwd.2da" + style_new="%iwdspells_data%/spell_styles_bg.2da" +END - COPY ~iwdification/bam/cdia225a.bam~ ~override~ - ~iwdification/bam/cdia225b.bam~ ~override~ - ~iwdification/bam/cdia225c.bam~ ~override~ - ~iwdification/bam/cdia225d.bam~ ~override~ - ~iwdification/wav/cdiem08.wav~ ~override~ +ACTION_IF MOD_IS_INSTALLED "spell_rev/setup-spell_rev.tp2" 55 BEGIN + LAF run STR_VAR file=sr_nwn_spelldeflection location="%iwdspells_lib%" version=sr_nwn_divine END +END +ACTION_IF enhanced_edition BEGIN // subroutine for adding spells to hotkey list in bgee.lua + LAF run STR_VAR file=rebuild_spell_hotkeys location="%iwdspells_lib%" END END ///// \\\\\ -///// WIZARD_ICELANCE \\\\\ +///// some basic spell usage in generic AI \\\\\ ///// \\\\\ -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_ICELANCE~) OR override_arcane) BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdi251.pro~ +// first, let's fix a thing +COPY_EXISTING ~pries14a.bcs~ ~override~ + DECOMPILE_AND_PATCH BEGIN + REPLACE_TEXTUALLY ~\(IF[ %TAB%%LNL%%MNL%%WNL%]+See(NearestEnemyOf(Myself))[ %TAB%%LNL%%MNL%%WNL%]+HaveSpell(CLERIC_CONFUSION)[ %TAB%%LNL%%MNL%%WNL%]+THEN[ %TAB%%LNL%%MNL%%WNL%]+RESPONSE #100[ %TAB%%LNL%%MNL%%WNL%]+\)\(END\)~ + ~\1 Spell(NearestEnemyOf(Myself),CLERIC_CONFUSION) \2~ + END + BUT_ONLY IF_EXISTS - ADD_SPELL ~iwdification/spl/cdia327.spl~ 2 3 WIZARD_ICELANCE - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3050 // name - SAY 0x50 @3051 // descript - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 35568 parameter1 = string_stunned END - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi251 END +ACTION_DEFINE_ASSOCIATIVE_ARRAY cd_cleric_subs BEGIN - COPY ~iwdification/itm/blank.itm~ ~override/cdia327.itm~ - SAY 0x0c @3050 - SAY 0x54 @3051 - LPF cd_scroll INT_VAR unusable1 = BIT1 range = 100 price = 900 STR_VAR spell = EVAL ~%current_spell_res%~ END + CLERIC_SYMBOL_HOPELESSNESS => CLERIC_CONFUSION // found in PRIES18A.BCS + CLERIC_SYMBOL_PAIN => CLERIC_CONFUSION // found in PRIES18A.BCS + +END - COPY ~iwdification/bam/cdia327a.bam~ ~override~ - ~iwdification/bam/cdia327b.bam~ ~override~ - ~iwdification/bam/cdia327c.bam~ ~override~ - ~iwdification/bam/cdiiceln.bam~ ~override~ - ~iwdification/wav/cditra19.wav~ ~override~ +ACTION_DEFINE_ASSOCIATIVE_ARRAY cd_druid_subs BEGIN + CLERIC_STALKER => CLERIC_CONJURE_EARTH_ELEMENTAL // found in DRUID14G.BCS + CLERIC_BEAST_CLAW => CLERIC_FLAME_BLADE // found in DRUID10A.BCS + CLERIC_MIST_OF_ELDATH => CLERIC_REGENERATE // found in DRUID14G.BCS + END -///// \\\\\ -///// WIZARD_LANCE_OF_DISRUPTION \\\\\ -///// \\\\\ +ACTION_IF !enhanced_edition BEGIN -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_LANCE_OF_DISRUPTION~) OR override_arcane) BEGIN - - ACTION_IF ee_game BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdi313.pro~ + ACTION_DEFINE_ASSOCIATIVE_ARRAY cd_druid_subs BEGIN CLERIC_STATIC_CHARGE => CLERIC_POISON END // found in DRUID10B.BCS, static charge isn't self-cast in oBG2 - END ELSE BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdi313a.pro~ - - END - - ADD_SPELL ~iwdification/spl/cdia328.spl~ 2 3 WIZARD_LANCE_OF_DISRUPTION - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3060 // name - SAY 0x50 @3061 // descript - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT STR_VAR match_resource = cdia328 resource = EVAL ~%DEST_RES%~ END - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi313 END - END ELSE BEGIN - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi313a END - LPF ALTER_EFFECT INT_VAR match_opcode = 318 opcode = 206 target = 1 parameter2 = 0 STR_VAR match_resource = cdia328 resource = EVAL ~%DEST_RES%~ END - LPF CD_SPLIT_SAVE_DAMAGE END - END - - COPY ~iwdification/itm/blank.itm~ ~override/cdia328.itm~ - SAY 0x0c @3060 - SAY 0x54 @3061 - LPF cd_scroll INT_VAR unusable1 = BIT1 target_hdr = 4 range = 100 opcode = 148 target_eff = 1 price = 600 STR_VAR spell = EVAL ~%current_spell_res%~ END - - COPY ~iwdification/bam/cdia328a.bam~ ~override~ - ~iwdification/bam/cdia328b.bam~ ~override~ - ~iwdification/bam/cdia328c.bam~ ~override~ - ~iwdification/bam/cdiinvoc.bam~ ~override~ - ~iwdification/bam/cdilodis.bam~ ~override~ - ~iwdification/vvc/cdiinvoc.vvc~ ~override~ - ~iwdification/wav/cdiem06.wav~ ~override~ - ~iwdification/wav/cditra59.wav~ ~override~ - END -///// \\\\\ -///// WIZARD_BELTYNS_BURNING_BLOOD \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_BELTYNS_BURNING_BLOOD~) OR override_arcane) BEGIN - - LAF cd_new_portrait_icon INT_VAR string = RESOLVE_STR_REF(@3070) STR_VAR bam_file = cdia422d RET icon END - - ADD_SPELL ~iwdification/spl/cdia422.spl~ 2 4 WIZARD_BELTYNS_BURNING_BLOOD - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3070 // name - SAY 0x50 @3071 // descript - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT STR_VAR match_resource = cdia422 resource = EVAL ~%DEST_RES%~ END - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 66 parameter2 = icon END - END ELSE BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 66 END - LPF DELETE_EFFECT INT_VAR match_opcode = 321 END - LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 9 opcode = 177 parameter1 = 145 parameter2 = 4 STR_VAR resource = cdixa422 END // race = elemental - LPF CLONE_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 144 parameter2 = 4 STR_VAR resource = cdixa422 END // race = golem - LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 4 parameter2 = 3 STR_VAR resource = cdixa422 END // general = undead - LPF CD_CONVERT_333 END +COPY_EXISTING_REGEXP GLOB ~^_?druid[0-9]+[A-Z]*\.bcs$~ ~override~ + DECOMPILE_AND_PATCH BEGIN + PATCH_PHP_EACH cd_druid_subs AS new => old BEGIN + REPLACE_TEXTUALLY ~RESPONSE[ %TAB%]#\([0-9]+\)[ %TAB%%LNL%%MNL%%WNL%]+Spell(\([^,]+\),%old%)[ %TAB%%LNL%%MNL%%WNL%]+END~ + ~RESPONSE #\1 RemoveSpell(%old%) SpellNoDec(\2,%new%) RESPONSE #\1 Spell(\2,%old%) END~ END - - COPY ~iwdification/itm/blank.itm~ ~override/cdia422.itm~ - SAY 0x0c @3070 - SAY 0x54 @3071 - LPF cd_scroll INT_VAR unusable1 = BIT2 range = 200 price = 400 STR_VAR spell = EVAL ~%current_spell_res%~ END - - COPY ~iwdification/spl/cdia422a.spl~ ~override~ - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 37605 parameter1 = string_berserk END - - COPY ~iwdification/bam/cdia422a.bam~ ~override~ - ~iwdification/bam/cdia422b.bam~ ~override~ - ~iwdification/bam/cdia422c.bam~ ~override~ - ~iwdification/bam/cdia422d.bam~ ~override~ - ~iwdification/bam/cdinecro.bam~ ~override~ - ~iwdification/vvc/cdinecro.vvc~ ~override~ - ~iwdification/wav/cdiem07.wav~ ~override~ - - ACTION_IF !ee_game BEGIN - - COPY ~iwdification/eff/immunity.eff~ ~override/cdixa422.eff~ - WRITE_ASCIIE 0x30 ~%current_spell_res%~ #8 - END + BUT_ONLY -END - -///// \\\\\ -///// WIZARD_SHADOW_MONSTERS \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_SHADOW_MONSTERS~) OR override_arcane) BEGIN - - LAF cd_new_summon_table STR_VAR descript = "SHADOW_MONSTERS" 2da_file = cdismons RET table END - - ADD_SPELL ~iwdification/spl/cdia426.spl~ 2 4 WIZARD_SHADOW_MONSTERS - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3080 // name - SAY 0x50 @3081 // descript - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 331 parameter2 = table END - END ELSE BEGIN - READ_SHORT 0x68 abil_num - LPF ALTER_EFFECT INT_VAR header = 0 match_opcode = 331 opcode = 127 parameter1 = 1 parameter2 = 0 dicesize = 0 dicenumber = 0 STR_VAR resource = cdismons END - FOR (index = 1 ; index < abil_num ; ++index) BEGIN - LPF ALTER_EFFECT INT_VAR header = index match_opcode = 331 opcode = 127 parameter1 = (index + 7) parameter2 = 0 dicesize = 0 dicenumber = 0 STR_VAR resource = cdismons END - END - LPF CLONE_EFFECT INT_VAR match_opcode = 127 opcode = 215 parameter2 = 2 STR_VAR resource = cdimsm1h END - END - - COPY ~iwdification/itm/blank.itm~ ~override/cdia426.itm~ - SAY 0x0c @3080 - SAY 0x54 @3081 - LPF cd_scroll INT_VAR unusable1 = BIT4 target_hdr = 4 range = 20 opcode = 148 target_eff = 1 price = 1200 STR_VAR spell = EVAL ~%current_spell_res%~ END - - LAF cd_animation STR_VAR code = e400 END // 58368 MGO1 goblin_axe - COPY ~iwdification/cre/cdis1gb1.cre~ ~override~ - ~iwdification/cre/cdis1gb2.cre~ ~override~ - ~iwdification/cre/cdis1gb3.cre~ ~override~ - WRITE_LONG 0x08 string_goblin - WRITE_LONG 0x0c string_goblin - - LAF cd_animation STR_VAR code = e510 END // 58640 MLI2 lizard_man - COPY ~iwdification/cre/cdis1lz3.cre~ ~override~ - ~iwdification/cre/cdis1lz4.cre~ ~override~ - SAY 0x08 @3082 - SAY 0x0c @3082 - WRITE_LONG 0x28 anim_lizman - - LAF cd_animation STR_VAR code = e0b0 END // 57520 MTRO troll_blue - MTRO doubles with bg2 troll - COPY ~iwdification/cre/cdis1tr6.cre~ ~override~ - ~iwdification/cre/cdis1tr7.cre~ ~override~ - ~iwdification/cre/cdis1tr8.cre~ ~override~ - WRITE_LONG 0x08 string_troll - WRITE_LONG 0x0c string_troll - WRITE_LONG 0x28 anim_btroll - - COPY ~iwdification/itm/cdim1d7s.itm~ ~override~ - WRITE_LONG 0x08 string_attack - WRITE_LONG 0x0c string_attack - - COPY ~iwdification/2da/cdismons.2da~ ~override~ - PATCH_IF !ee_game BEGIN// delete 2nd & 3rd columns for vanilla summon tables - REPLACE_TEXTUALLY ~[ %TAB%]+HitAnimation[ %TAB%]+AreaHitAnimation~ ~~ - REPLACE_TEXTUALLY ~[ %TAB%]+cdimsm1h[ %TAB%]+.+$~ ~~ +COPY_EXISTING_REGEXP GLOB ~^_?priest?[0-9]+[A-Za-z]*\.bcs$~ ~override~ + DECOMPILE_AND_PATCH BEGIN + PATCH_PHP_EACH cd_cleric_subs AS new => old BEGIN + REPLACE_TEXTUALLY ~RESPONSE[ %TAB%]#\([0-9]+\)[ %TAB%%LNL%%MNL%%WNL%]+Spell(\([^,]+\),%old%)[ %TAB%%LNL%%MNL%%WNL%]+END~ + ~RESPONSE #\1 RemoveSpell(%old%) SpellNoDec(\2,%new%) RESPONSE #\1 Spell(\2,%old%) END~ END - - COPY ~iwdification/bam/cdia426a.bam~ ~override~ - ~iwdification/bam/cdia426b.bam~ ~override~ - ~iwdification/bam/cdia426c.bam~ ~override~ - ~iwdification/bam/cdimsm1h.bam~ ~override~ - ~iwdification/bam/cdimsm1x.bam~ ~override~ - ~iwdification/itm/cdisumrn.itm~ ~override~ - ~iwdification/itm/cditrn20.itm~ ~override~ - ~iwdification/vvc/cdimsm1h.vvc~ ~override~ - ~iwdification/vvc/cdimsm1x.vvc~ ~override~ - -END - + END + BUT_ONLY + +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ ///// \\\\\ -///// WIZARD_EMOTION_COURAGE \\\\\ +///// obg2 portrait icons \\\\\ ///// \\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_EMOTION_COURAGE~) OR override_arcane) BEGIN +BEGIN @8000 DESIGNATED 80 +GROUP @993 +REQUIRE_PREDICATE GAME_IS ~soa tob bgt ca tutu tutu_totsc iwd_in_bg2~ @996 + +COPY ~iwdification/icons/states.bam~ ~override/states.bam~ + ~iwdification/icons/states.bam~ ~override/states2.bam~ + + +WITH_TRA ~iwdification/dw_iwdspells_resource/tra/%LANGUAGE%/iwdspells.tra~ BEGIN + + COPY ~iwdification/icons/statdesc.2da~ ~override~ + REPLACE ~iron_body~ @350 + REPLACE ~mind_blank~ @344 + REPLACE ~cats_grace~ @357 + REPLACE ~emotion_hope~ @358 + REPLACE ~emotion_courage~ @359 + REPLACE ~shroud_of_flame~ @46 + REPLACE ~beltyn~ @25 + REPLACE ~antimagic_shell~ @161 + REPLACE ~pain~ @347 + REPLACE ~isom~ @348 + REPLACE ~exaltation~ @352 + REPLACE ~static_charge~ @242 + REPLACE ~entropy_shield~ @278 + REPLACE ~shield_lathander~ @270 + REPLACE ~blood_rage~ @354 + REPLACE ~animal_rage~ @351 + REPLACE ~recitation~ @353 + REPLACE ~prayer~ @355 + REPLACE ~rwotf~ @356 + REPLACE ~bard_heroes~ @323 + REPLACE ~bard_curran~ @326 + REPLACE ~bard_tymora~ @329 + REPLACE ~bard_kaudies~ @332 + REPLACE ~bard_siren~ @335 + REPLACE ~bard_sith~ @339 + PRETTY_PRINT_2DA + +END + +COPY ~iwdification/icons/icons.2da~ ~iwdification/icons/icons.2da~ + COUNT_2DA_ROWS 7 rows + FOR (row = 1 ; row < rows ; ++row) BEGIN + READ_2DA_ENTRY row 0 7 icon_text + READ_2DA_ENTRY row 1 7 icon_tra + READ_2DA_ENTRY row 2 7 icon + READ_2DA_ENTRY row 3 7 existing + READ_2DA_ENTRY row 4 7 clone + READ_2DA_ENTRY row 5 7 resource + READ_2DA_ENTRY row 6 7 ids_ref + INNER_ACTION BEGIN + + // identify and patch IDS references... + ACTION_IF !IS_AN_INT ~%ids_ref%~ BEGIN + OUTER_SET num = IDS_OF_SYMBOL (~spell~ ~%ids_ref%~) + ACTION_IF num > 3999 BEGIN OUTER_SET num -= 4000 OUTER_SPRINT prefix spcl END + ACTION_IF num > 2999 BEGIN OUTER_SET num -= 3000 OUTER_SPRINT prefix spin END + ACTION_IF num > 1999 BEGIN OUTER_SET num -= 2000 OUTER_SPRINT prefix spwi END + ACTION_IF num > 999 BEGIN OUTER_SET num -= 1000 OUTER_SPRINT prefix sppr END + + COPY_EXISTING ~%prefix%%num%.spl~ ~override~ + ~%prefix%%num%a.spl~ ~override~ + ~%prefix%%num%b.spl~ ~override~ + ~%prefix%%num%c.spl~ ~override~ + PATCH_IF existing BEGIN + LPF ALTER_EFFECT INT_VAR silent = 1 match_opcode = 142 match_parameter2 = existing parameter2 = icon END + END ELSE BEGIN + LPF CLONE_EFFECT INT_VAR silent = 1 multi_match = 1 match_opcode = clone opcode = 142 parameter1 = 0 parameter2 = icon END + END + BUT_ONLY IF_EXISTS + + END ELSE BEGIN // or just patch a resource directly + + COPY_EXISTING ~%resource%~ ~override~ + PATCH_IF existing BEGIN + LPF ALTER_EFFECT INT_VAR silent = 1 match_opcode = 142 match_parameter2 = existing parameter2 = icon END + END ELSE BEGIN + LPF CLONE_EFFECT INT_VAR silent = 1 multi_match = 1 match_opcode = clone opcode = 142 parameter1 = 0 parameter2 = icon END + END + BUT_ONLY IF_EXISTS + + END + + END // end inner_action + END // end for loop + BUT_ONLY - LAF cd_new_portrait_icon INT_VAR string = RESOLVE_STR_REF(@3092) STR_VAR bam_file = cdia427d RET icon END +// shroud of flame has no easy op to clone, so deal with it manually +OUTER_SET num = (IDS_OF_SYMBOL (~spell~ ~WIZARD_SHROUD_OF_FLAME~) - 2000) +ACTION_IF num > 0 BEGIN + + COPY_EXISTING ~spwi%num%.spl~ ~override~ + ~spwi%num%c.spl~ ~override~ + LPF ADD_SPELL_EFFECT INT_VAR opcode = 142 target = 2 power = 5 parameter2 = 169 duration = 6 savingthrow = BIT0 END - ADD_PROJECTILE ~iwdification/pro/cdi407.pro~ +END - ADD_SPELL ~iwdification/spl/cdia427.spl~ 2 4 WIZARD_EMOTION_COURAGE - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3090 // name - SAY 0x50 @3091 // descript - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi407 END - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT STR_VAR match_resource = cdia427 resource = EVAL ~%DEST_RES%~ END - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 187 parameter2 = icon END - END ELSE BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 321 END - LPF DELETE_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 187 END - LPF CLONE_EFFECT INT_VAR match_opcode = 54 opcode = 206 parameter1 = 0 parameter2 = 0 STR_VAR insert = last resource = EVAL ~%DEST_RES%~ END - END +// static charge has no easy op to clone, so deal with it manually +OUTER_SET num = (IDS_OF_SYMBOL (~spell~ ~CLERIC_STATIC_CHARGE~) - 1000) +ACTION_IF num > 0 BEGIN + + COPY_EXISTING ~sppr%num%.spl~ ~override~ + ~sppr%num%b.spl~ ~override~ + LPF ADD_SPELL_EFFECT INT_VAR opcode = 142 target = 2 power = 4 parameter2 = 175 duration = 60 END - COPY ~iwdification/itm/blank.itm~ ~override/cdia427.itm~ - SAY 0x0c @3090 - SAY 0x54 @3091 - LPF cd_scroll INT_VAR unusable1 = BIT3 target_hdr = 4 range = 50 opcode = 148 target_eff = 1 price = 400 STR_VAR spell = EVAL ~%current_spell_res%~ END +END - COPY ~iwdification/bam/cdia427a.bam~ ~override~ - ~iwdification/bam/cdia427b.bam~ ~override~ - ~iwdification/bam/cdia427c.bam~ ~override~ - ~iwdification/bam/cdia427d.bam~ ~override~ - ~iwdification/bam/cdiencha.bam~ ~override~ - ~iwdification/vvc/cdiencha.vvc~ ~override~ - ~iwdification/wav/cdiee03.wav~ ~override~ - ~iwdification/wav/cdiem05.wav~ ~override~ +// greater shield should re-use shield of lathander icon +OUTER_SET num = (IDS_OF_SYMBOL (~spell~ ~CLERIC_GREATER_SHIELD_OF_LATHANDER~) - 1000) +ACTION_IF num > 0 BEGIN + + COPY_EXISTING ~sppr%num%.spl~ ~override~ + LPF CLONE_EFFECT INT_VAR match_opcode = 101 opcode = 142 parameter1 = 0 parameter2 = 177 END END - + +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ ///// \\\\\ -///// WIZARD_EMOTION_FEAR \\\\\ +///// IWD Class Updates: Bard \\\\\ ///// \\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_EMOTION_FEAR~) OR override_arcane) BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdi255.pro~ - - ADD_SPELL ~iwdification/spl/cdia428.spl~ 2 4 WIZARD_EMOTION_FEAR - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3100 // name - SAY 0x50 @3101 // descript - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi255 END - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 35484 parameter1 = string_panic END - PATCH_IF !ee_game BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 321 END - END - - COPY ~iwdification/itm/blank.itm~ ~override/cdia428.itm~ - SAY 0x0c @3100 - SAY 0x54 @3101 - LPF cd_scroll INT_VAR unusable1 = BIT3 target_hdr = 4 range = 50 opcode = 148 target_eff = 1 price = 400 STR_VAR spell = EVAL ~%current_spell_res%~ END - - COPY ~iwdification/bam/cdia428a.bam~ ~override~ - ~iwdification/bam/cdia428b.bam~ ~override~ - ~iwdification/bam/cdia428c.bam~ ~override~ - ~iwdification/bam/cdiencha.bam~ ~override~ - ~iwdification/bam/cdienchx.bam~ ~override~ - ~iwdification/vvc/cdiencha.vvc~ ~override~ - ~iwdification/vvc/cdigench.vvc~ ~override~ - ~iwdification/wav/cdiarm21.wav~ ~override~ - ~iwdification/wav/cdiee05.wav~ ~override~ - ~iwdification/wav/cdiem05.wav~ ~override~ - +BEGIN @5000 DESIGNATED 50 // aka add new bard songs +GROUP @995 + +///// \\\\\ +///// begin generated from iwdspells \\\\\ +///// \\\\\ + +INCLUDE ~%scsroot%/%iwdspells_lib%/always.tph~ + +LAF make_label STR_VAR label=dw#iwd_bardic END +LAF include STR_VAR file=lib_spell_style.tph location="%iwdspells_lib%" END +LAF include STR_VAR file=install_iwd_spell_resources.tpa location="%iwdspells_lib%" END +LAF install_iwd_spell_resources + INT_VAR + truncate_at_level=20 + STR_VAR + spell_list=bardic_resrefs.txt + lookup=iwd_strref.txt + proj_list=bardic_proj.txt + smtables_list=bardic_smtable.txt + scroll_price_list=scroll_prices_arcane.txt + tra=iwdspells.tra + biff="dw#iwdb" + afterwards="bardsong_postproduction" + afterwards_tra="dw_iwdspells_bard.tra" + bam_copy="bam_copy_arcane.2da" + green_bams="" + style_old="%iwdspells_data%/spell_styles_iwd.2da" + style_new="%iwdspells_data%/spell_styles_bg.2da" END - + +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ ///// \\\\\ -///// WIZARD_EMOTION_HOPE \\\\\ +///// IWD Class Updates: Druid \\\\\ ///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_EMOTION_HOPE~) OR override_arcane) BEGIN - - LAF cd_new_portrait_icon INT_VAR string = RESOLVE_STR_REF(@3112) STR_VAR bam_file = cdia429d RET icon END - - ADD_PROJECTILE ~iwdification/pro/cdi407.pro~ - - ADD_SPELL ~iwdification/spl/cdia429.spl~ 2 4 WIZARD_EMOTION_HOPE - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3110 // name - SAY 0x50 @3111 // descript - LPF DELETE_EFFECT INT_VAR match_opcode = 321 STR_VAR match_resource = spin115 END - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi407 END - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 186 parameter2 = icon END - LPF ALTER_EFFECT STR_VAR match_resource = cdia429 resource = EVAL ~%DEST_RES%~ END - END ELSE BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 186 parameter2 = 22 END - LPF DELETE_EFFECT INT_VAR match_opcode = 321 END - LPF CLONE_EFFECT INT_VAR match_opcode = 54 opcode = 206 parameter1 = 0 parameter2 = 0 STR_VAR insert = last resource = EVAL ~%DEST_RES%~ END - END - - COPY ~iwdification/itm/blank.itm~ ~override/cdia429.itm~ - SAY 0x0c @3110 - SAY 0x54 @3111 - LPF cd_scroll INT_VAR unusable1 = BIT3 target_hdr = 4 range = 50 opcode = 148 target_eff = 1 price = 600 STR_VAR spell = EVAL ~%current_spell_res%~ END - - COPY ~iwdification/bam/cdia429a.bam~ ~override~ - ~iwdification/bam/cdia429b.bam~ ~override~ - ~iwdification/bam/cdia429c.bam~ ~override~ - ~iwdification/bam/cdia429d.bam~ ~override~ - ~iwdification/bam/cdiencha.bam~ ~override~ - ~iwdification/vvc/cdiencha.vvc~ ~override~ - ~iwdification/wav/cdiee03.wav~ ~override~ - ~iwdification/wav/cdiem05.wav~ ~override~ - -END +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ ///// \\\\\ -///// WIZARD_MORDENKAINENS_FORCE_MISSILES \\\\\ +///// druid shapeshifting & abilities \\\\\ ///// \\\\\ -ACTION_IF (ee_game AND (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_MORDENKAINENS_FORCE_MISSILES~) OR override_arcane)) BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdimfm.pro~ - ADD_PROJECTILE ~iwdification/pro/cdimfm2.pro~ - - // ADD_PROJECTILE won't add multiple versions of the same projectile, but it's needed for MFM's special projectile chain - do it manually - OUTER_FOR (index = (cdimfm2 + 1) ; index < (cdimfm2 + 10) ; ++index) BEGIN - - APPEND ~projectl.ids~ ~%index% cdimfm2~ - - END - - ADD_SPELL ~iwdification/spl/cdia430.spl~ 2 4 WIZARD_MORDENKAINENS_FORCE_MISSILES - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3120 // name - SAY 0x50 @3121 // descript - LPF ALTER_SPELL_HEADER INT_VAR header = 1 projectile = (cdimfm + 0) END - LPF ALTER_SPELL_HEADER INT_VAR header = 2 projectile = (cdimfm + 0) END - LPF ALTER_SPELL_HEADER INT_VAR header = 3 projectile = (cdimfm + 0) END - LPF ALTER_SPELL_HEADER INT_VAR header = 4 projectile = (cdimfm + 1) END - LPF ALTER_SPELL_HEADER INT_VAR header = 5 projectile = (cdimfm + 1) END - LPF ALTER_SPELL_HEADER INT_VAR header = 6 projectile = (cdimfm + 1) END - LPF ALTER_SPELL_HEADER INT_VAR header = 7 projectile = (cdimfm + 2) END - LPF ALTER_SPELL_HEADER INT_VAR header = 8 projectile = (cdimfm + 2) END - LPF ALTER_SPELL_HEADER INT_VAR header = 9 projectile = (cdimfm + 2) END - LPF ALTER_SPELL_HEADER INT_VAR header = 10 projectile = (cdimfm + 3) END - LPF ALTER_SPELL_HEADER INT_VAR header = 11 projectile = (cdimfm + 3) END - LPF ALTER_SPELL_HEADER INT_VAR header = 12 projectile = (cdimfm + 3) END - LPF ALTER_SPELL_HEADER INT_VAR header = 13 projectile = (cdimfm + 4) END - LPF ALTER_SPELL_HEADER INT_VAR header = 14 projectile = (cdimfm + 4) END - - COPY ~iwdification/itm/blank.itm~ ~override/cdia430.itm~ - SAY 0x0c @3120 - SAY 0x54 @3121 - LPF cd_scroll INT_VAR unusable1 = BIT1 range = 100 price = 400 STR_VAR spell = EVAL ~%current_spell_res%~ END - - COPY ~iwdification/bam/cdia430a.bam~ ~override~ - ~iwdification/bam/cdia430b.bam~ ~override~ - ~iwdification/bam/cdia430c.bam~ ~override~ - ~iwdification/bam/cdimfmsx.bam~ ~override~ - ~iwdification/bam/cdimfmt.bam~ ~override~ - ~iwdification/spl/cdia430b.spl~ ~override~ - ~iwdification/vvc/cdimfmsx.vvc~ ~override~ - ~iwdification/wav/cdiarm02.wav~ ~override~ - ~iwdification/wav/cdiem103.wav~ ~override~ - ~iwdification/wav/cditra55.wav~ ~override~ +BEGIN @7001 DESIGNATED 70 // Use IWD Shapeshifting and Ability Progression +SUBCOMPONENT @7000 // IWD Class Updates: Druid +GROUP @995 -END +INCLUDE ~iwdification/tpa/druid_poly.tpa~ ///// \\\\\ -///// WIZARD_SHOUT \\\\\ +///// Elven Druids \\\\\ ///// \\\\\ -ACTION_IF (ee_game AND (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_SHOUT~) OR override_arcane)) BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdi315.pro~ +BEGIN @7100 DESIGNATED 71 +SUBCOMPONENT @7000 // IWD Class Updates: Druid +REQUIRE_PREDICATE FILE_EXISTS_IN_GAME ~clsrcreq.2da~ @997 +GROUP @995 - ADD_SPELL ~iwdification/spl/cdia431.spl~ 2 4 WIZARD_SHOUT - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3130 // name - SAY 0x50 @3131 // descript - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi315 END - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 14073 parameter1 = string_deafness END - - COPY ~iwdification/itm/blank.itm~ ~override/cdia431.itm~ - SAY 0x0c @3130 - SAY 0x54 @3131 - LPF cd_scroll INT_VAR unusable1 = BIT1 target_hdr = 4 range = 22 opcode = 148 target_eff = 1 price = 1200 STR_VAR spell = EVAL ~%current_spell_res%~ END - - COPY ~iwdification/bam/cdia431a.bam~ ~override~ - ~iwdification/bam/cdia431b.bam~ ~override~ - ~iwdification/bam/cdia431c.bam~ ~override~ - ~iwdification/bam/cdishout.bam~ ~override~ - ~iwdification/wav/cdiem100.wav~ ~override~ - ~iwdification/wav/cditra08.wav~ ~override~ - -END +INCLUDE ~iwdification/tpa/druid_elf.tpa~ ///// \\\\\ -///// WIZARD_VITRIOLIC_SPHERE \\\\\ +///// do both \\\\\ ///// \\\\\ -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_VITRIOLIC_SPHERE~) OR override_arcane) BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdi316.pro~ - - ADD_SPELL ~iwdification/spl/cdia432.spl~ 2 4 WIZARD_VITRIOLIC_SPHERE - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3140 // name - SAY 0x50 @3141 // descript - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi316 END - - COPY ~iwdification/itm/blank.itm~ ~override/cdia432.itm~ - SAY 0x0c @3140 - SAY 0x54 @3141 - LPF cd_scroll INT_VAR unusable1 = (BIT0 + BIT3) range = 100 price = 1600 STR_VAR spell = EVAL ~%current_spell_res%~ END - - COPY ~iwdification/bam/cdia432a.bam~ ~override~ - ~iwdification/bam/cdia432b.bam~ ~override~ - ~iwdification/bam/cdia432c.bam~ ~override~ - ~iwdification/bam/cdiacid.bam~ ~override~ - ~iwdification/bam/cdivitst.bam~ ~override~ - ~iwdification/bam/cdivitsx.bam~ ~override~ - ~iwdification/spl/cdia432y.spl~ ~override~ - ~iwdification/spl/cdia432z.spl~ ~override~ - ~iwdification/vvc/cdiacid.vvc~ ~override~ - ~iwdification/vvc/cdivitsx.vvc~ ~override~ - ~iwdification/wav/cdiem34.wav~ ~override~ - ~iwdification/wav/cdiem47.wav~ ~override~ - ~iwdification/wav/cditra60.wav~ ~override~ - -END +BEGIN @7200 DESIGNATED 72 +SUBCOMPONENT @7000 // IWD Class Updates: Druid +REQUIRE_PREDICATE FILE_EXISTS_IN_GAME ~clsrcreq.2da~ @997 +GROUP @995 +INCLUDE ~iwdification/tpa/druid_elf.tpa~ +INCLUDE ~iwdification/tpa/druid_poly.tpa~ + +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ ///// \\\\\ -///// WIZARD_SHROUD_OF_FLAME \\\\\ +///// IWD Class Updates: Paladin \\\\\ ///// \\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_SHROUD_OF_FLAME~) OR override_arcane) BEGIN - - LAF cd_new_portrait_icon INT_VAR string = RESOLVE_STR_REF(@3150) STR_VAR bam_file = cdia524d RET icon END +BEGIN @10000 DESIGNATED 100 +GROUP @995 - ACTION_IF ee_game BEGIN +// change paladin detect evil to at-will +COPY_EXISTING ~spcl212.spl~ ~override~ + LPF ADD_SPELL_EFFECT INT_VAR opcode = 171 target = 1 timing = 1 STR_VAR resource = spcl212 END + LPF CLONE_EFFECT INT_VAR match_opcode = 171 opcode = 172 END - ADD_PROJECTILE ~iwdification/pro/cdishrod.pro~ +// change paladin protection from evil to caster only, 24-hr duration +COPY_EXISTING ~spcl213.spl~ ~override~ + LPF ALTER_EFFECT INT_VAR match_target = 2 target = 1 END + LPF ALTER_EFFECT INT_VAR match_duration = 60 duration = 7200 END + LPF ALTER_SPELL_HEADER INT_VAR target = 5 END // caster - END ELSE BEGIN +COPY ~iwdification/2da/mxsplpal.2da~ ~override~ // paladin spell table + ~iwdification/bam/cdiplseb.bam~ ~override~ // smite evil icon + ~iwdification/bam/cdiplsec.bam~ ~override~ // smite evil icon + ~iwdification/spl/cdiplid.spl~ ~override~ // disease immunity + +COPY ~iwdification/spl/cdiplif.spl~ ~override~ // fear immunity + SAY 0x30e @10009 + +COPY ~iwdification/spl/cdiplse.spl~ ~override~ // smite evil + SAY 0x08 @10001 + SAY 0x50 @10002 + WRITE_ASCII 0x3a cdiplsec + LPF ALTER_SPELL_HEADER STR_VAR icon = cdiplseb END // location: ability + +COPY_EXISTING ~sppr317.spl~ ~override/cdiplcd.spl~ + WRITE_SHORT 0x1c 4 // innate + WRITE_LONG 0x34 1 // level + LPF ALTER_SPELL_HEADER INT_VAR location = 4 END // location: ability - OUTER_SET cdishrod = 216 +ACTION_IF !enhanced_edition BEGIN + + COPY_EXISTING ~cdiplif.spl~ ~override~ // fear immunity + LPF DELETE_EFFECT INT_VAR match_opcode = 321 END + COPY_EXISTING ~cdiplse.spl~ ~override~ // smite evil + LPF DELETE_EFFECT INT_VAR match_opcode = 324 END + FOR (index = 0 ; index < 7 ; ++index) BEGIN + LPF ALTER_EFFECT INT_VAR header = index match_opcode = 12 opcode = 177 parameter1 = 3 parameter2 = 8 STR_VAR resource = EVAL ~cdiplse%index%~ END + END + + OUTER_FOR (index = 0 ; index < 7 ; ++index) BEGIN + COPY ~iwdification/eff/cdiplse0.eff~ ~override/cdiplse%index%.eff~ + WRITE_LONG 0x38 (index + 1) // number of dice + END - ADD_SPELL ~iwdification/spl/cdia524.spl~ 2 5 WIZARD_SHROUD_OF_FLAME - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3150 // name - SAY 0x50 @3151 // descript - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT STR_VAR match_resource = cdia524 resource = EVAL ~%DEST_RES%~ END - LPF ALTER_EFFECT INT_VAR match_opcode = 333 STR_VAR resource = cdia524b END - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 94 parameter2 = icon END - END ELSE BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 94 END - LPF DELETE_EFFECT INT_VAR match_opcode = 321 END - LPF DELETE_EFFECT INT_VAR match_opcode = 328 END - LPF CD_CONVERT_333 STR_VAR 333spell = cdia524b END - END - - COPY ~iwdification/itm/blank.itm~ ~override/cdia524.itm~ - SAY 0x0c @3150 - SAY 0x54 @3151 - LPF cd_scroll INT_VAR unusable1 = BIT1 range = 100 price = 1500 STR_VAR spell = EVAL ~%current_spell_res%~ END - - COPY ~iwdification/spl/cdia524b.spl~ ~override~ - SAY 0x08 @3150 // name - SAY 0x50 @3151 // descript - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdishrod END - PATCH_IF !ee_game BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 328 END - LPF CD_CONVERT_9_255 END - END - - COPY ~iwdification/bam/cdia524a.bam~ ~override~ - ~iwdification/bam/cdia524b.bam~ ~override~ - ~iwdification/bam/cdia524c.bam~ ~override~ - ~iwdification/bam/cdia524d.bam~ ~override~ - ~iwdification/bam/cdisofl.bam~ ~override~ - ~iwdification/vvc/cdisofl.vvc~ ~override~ - -END - -///// \\\\\ -///// WIZARD_DEMI_SHADOW_MONSTERS \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_DEMI_SHADOW_MONSTERS~) OR override_arcane) BEGIN - - LAF cd_new_summon_table STR_VAR descript = "DEMI_SHADOW_MONSTERS" 2da_file = cdidsmon RET table END - - ADD_SPELL ~iwdification/spl/cdia525.spl~ 2 5 WIZARD_DEMI_SHADOW_MONSTERS - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3160 // name - SAY 0x50 @3161 // descript - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 331 parameter2 = table END - END ELSE BEGIN - READ_SHORT 0x68 abil_num - LPF ALTER_EFFECT INT_VAR header = 0 match_opcode = 331 opcode = 127 parameter1 = 1 parameter2 = 0 dicesize = 0 dicenumber = 0 STR_VAR resource = cdidsmon END - FOR (index = 1 ; index < abil_num ; ++index) BEGIN - LPF ALTER_EFFECT INT_VAR header = index match_opcode = 331 opcode = 127 parameter1 = (index + 9) parameter2 = 0 dicesize = 0 dicenumber = 0 STR_VAR resource = cdidsmon END - END - LPF CLONE_EFFECT INT_VAR match_opcode = 127 opcode = 215 parameter2 = 2 STR_VAR resource = cdimsm1h END - END - - COPY ~iwdification/itm/blank.itm~ ~override/cdia525.itm~ - SAY 0x0c @3160 - SAY 0x54 @3161 - LPF cd_scroll INT_VAR unusable1 = BIT4 target_hdr = 4 range = 20 opcode = 148 target_eff = 1 price = 1500 STR_VAR spell = EVAL ~%current_spell_res%~ END - - LAF cd_animation STR_VAR code = e420 END // 58400 MGO3 goblin_elite_axe - COPY ~iwdification/cre/cdis2gb1.cre~ ~override~ - ~iwdification/cre/cdis2gb2.cre~ ~override~ - ~iwdification/cre/cdis2gb3.cre~ ~override~ - SAY 0x08 @3162 - SAY 0x0c @3162 - - LAF cd_animation STR_VAR code = e500 END // 58624 MLIZ lizard_man_elite - COPY ~iwdification/cre/cdis2lz5.cre~ ~override~ - ~iwdification/cre/cdis2lz6.cre~ ~override~ - ~iwdification/cre/cdis2lz7.cre~ ~override~ - SAY 0x08 @3163 - SAY 0x0c @3163 - - COPY ~iwdification/bam/cdia525a.bam~ ~override~ - ~iwdification/bam/cdia525b.bam~ ~override~ - ~iwdification/bam/cdia525c.bam~ ~override~ - ~iwdification/bam/cdimsm1h.bam~ ~override~ - ~iwdification/bam/cdimsm1x.bam~ ~override~ - ~iwdification/itm/cdisumrn.itm~ ~override~ - ~iwdification/itm/cditrn40.itm~ ~override~ - ~iwdification/vvc/cdimsm1h.vvc~ ~override~ - ~iwdification/vvc/cdimsm1x.vvc~ ~override~ - - COPY ~iwdification/2da/cdidsmon.2da~ ~override~ - PATCH_IF !ee_game BEGIN// delete 2nd & 3rd columns for vanilla summon tables - REPLACE_TEXTUALLY ~[ %TAB%]+HitAnimation[ %TAB%]+AreaHitAnimation~ ~~ - REPLACE_TEXTUALLY ~[ %TAB%]+cdimsm1h[ %TAB%]+.+$~ ~~ - END - -END - -///// \\\\\ -///// WIZARD_SUMMON_SHADOW \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_SUMMON_SHADOW~) OR override_arcane) BEGIN - - LAF cd_new_summon_table STR_VAR descript = "SUMMON_SHADOW" 2da_file = cdishadw RET table END - - ADD_SPELL ~iwdification/spl/cdia526.spl~ 2 5 WIZARD_SUMMON_SHADOW - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3170 // name - SAY 0x50 @3171 // descript - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 331 parameter2 = table END - END ELSE BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 331 opcode = 127 parameter1 = 12 parameter2 = 0 dicesize = 0 dicenumber = 0 STR_VAR resource = cdishadw END // shadows are level 4, so p1=12 should mean 3 shadows - END - - COPY ~iwdification/itm/blank.itm~ ~override/cdia526.itm~ - SAY 0x0c @3170 - SAY 0x54 @3171 - LPF cd_scroll INT_VAR target_hdr = 4 range = 20 opcode = 148 target_eff = 1 price = 1500 STR_VAR spell = EVAL ~%current_spell_res%~ END - - LAF cd_animation STR_VAR code = ea20 END // 59936 MSH2 shadow_large - COPY ~iwdification/cre/cdisshad.cre~ ~override~ - WRITE_LONG 0x08 string_shadow - WRITE_LONG 0x0c string_shadow - WRITE_LONG 0x28 anim_shadow_lg - - COPY ~iwdification/itm/cdishdw1.itm~ ~override~ - WRITE_LONG 0x08 string_attack - WRITE_LONG 0x0c string_attack - - COPY ~iwdification/spl/cdishdw1.spl~ ~override~ - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 35593 parameter1 = string_diseased END - - COPY ~iwdification/bam/cdia526a.bam~ ~override~ - ~iwdification/bam/cdia526b.bam~ ~override~ - ~iwdification/bam/cdia526c.bam~ ~override~ - ~iwdification/bam/cdimsm1h.bam~ ~override~ - ~iwdification/bam/cdimsm1x.bam~ ~override~ - ~iwdification/bam/cdinecro.bam~ ~override~ - ~iwdification/itm/cditrn60.itm~ ~override~ - ~iwdification/vvc/cdimsm1h.vvc~ ~override~ - ~iwdification/vvc/cdimsm1x.vvc~ ~override~ - ~iwdification/vvc/cdinecro.vvc~ ~override~ - - COPY ~iwdification/2da/cdishadw.2da~ ~override~ - PATCH_IF !ee_game BEGIN// delete 2nd & 3rd columns for vanilla summon tables - REPLACE_TEXTUALLY ~[ %TAB%]+HitAnimation[ %TAB%]+AreaHitAnimation~ ~~ - REPLACE_TEXTUALLY ~[ %TAB%]+cdimsm1h[ %TAB%]+.+$~ ~~ - END - END -///// \\\\\ -///// WIZARD_CONTACT_OTHER_PLANE \\\\\ -///// \\\\\ - -/* awaiting dialogue for cdia528.d -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_CONTACT_OTHER_PLANE~) OR override_arcane) BEGIN - - ADD_SPELL ~iwdification/spl/cdia528.spl~ 2 5 WIZARD_CONTACT_OTHER_PLANE - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3180 // name - SAY 0x50 @3181 // descript - - COPY ~iwdification/itm/blank.itm~ ~override/cdia528.itm~ - SAY 0x0c @3180 - SAY 0x54 @3181 - LPF cd_scroll INT_VAR unusable2 = BIT7 target_hdr = 5 range = 1 target_eff = 1 price = 500 STR_VAR spell = EVAL ~%current_spell_res%~ END - - LAF cd_animation STR_VAR code = e300 END // 58112 MGHO ghost - COPY ~iwdification/cre/cdia528.cre~ ~override~ - SAY 0x08 @3182 - SAY 0x0c @3182 - WRITE_LONG 0x28 anim_ghost - WRITE_ASCII 0x2cc ~cdia528~ #8 // dlg - - APPEND ~state.ids~ ~0x00000FC0 STATE_REALLY_DEAD~ UNLESS ~^0x00000FC0[ %TAB]+STATE_REALLY_DEAD[ %TAB%%LNL%%MNL%%WNL%]~ - - COMPILE ~iwdification/baf/cdia528.baf~ - ~iwdification/dlg/cdia528.d~ - - COPY ~iwdification/bam/cdia528a.bam~ ~override~ - ~iwdification/bam/cdia528b.bam~ ~override~ - ~iwdification/bam/cdia528c.bam~ ~override~ - ~iwdification/bam/cdidivin.bam~ ~override~ - ~iwdification/eff/cdia528.eff~ ~override~ - ~iwdification/vvc/cdidivin.vvc~ ~override~ - ~iwdification/wav/cdiem01.wav~ ~override~ - +OUTER_SET default_paladin = 9558 +ACTION_CLEAR_ARRAY cd_pal_clabs +ACTION_DEFINE_ASSOCIATIVE_ARRAY cd_pal_clabs BEGIN // start with base class tables + ~%default_paladin%~, clabpa01, 0 => 1 // generic paladin abilities END -*/ - -///// \\\\\ -///// WIZARD_CONJURE_FIRE_ELEMENTAL \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_CONJURE_FIRE_ELEMENTAL~) OR override_arcane) BEGIN - - APPEND ~spell.ids~ ~2516 WIZARD_CONJURE_FIRE_ELEMENTAL~ // alternate identifier - - LAF cd_new_summon_table STR_VAR descript = "FIRE_ELEMENTAL_WIZ" 2da_file = cdifelmw RET table END + +// add kit tables dynamically by reading kitlist +COPY_EXISTING ~kitlist.2da~ ~override~ + COUNT_2DA_ROWS 9 rows + FOR (index = 2 ; index < rows ; ++index) BEGIN // skip reserve row + READ_2DA_ENTRY index 8 9 class + PATCH_IF class = 6 BEGIN + READ_2DA_ENTRY index 1 9 kitid + READ_2DA_ENTRY index 4 9 desc + READ_2DA_ENTRY index 5 9 clab + DEFINE_ASSOCIATIVE_ARRAY cd_pal_clabs BEGIN "%desc%", "%clab%", "%kitid%" => 0 END + END + END + BUT_ONLY + +ACTION_PHP_EACH cd_pal_clabs AS params => update BEGIN - COPY ~iwdification/spl/cdia531.spl~ ~override/spwi516.spl~ - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3190 // name - SAY 0x50 @3191 // descript - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 331 parameter2 = table END - END ELSE BEGIN - LPF ALTER_EFFECT INT_VAR index match_opcode = 331 opcode = 127 parameter1 = 1 parameter2 = 0 dicesize = 0 dicenumber = 0 STR_VAR resource = cdifelmw END - LPF CLONE_EFFECT INT_VAR match_opcode = 127 opcode = 215 parameter2 = 2 STR_VAR resource = cdimsm1h END + ACTION_IF (RESOURCE_CONTAINS ~%params_1%.2da~ ~[ %TAB%]GA_SPCL212[ %TAB%]~) BEGIN // returns false if non-existant or doesn't contain text + + COPY_EXISTING ~kit.ids~ ~override~ + REPLACE_EVALUATE ~^\([^ %TAB%]+\)\([ %TAB%]+%params_2%[ %TAB%%LNL%%MNL%%WNL%]\)~ BEGIN + SET new_kitid = ~%MATCH1%~ + DEFINE_ASSOCIATIVE_ARRAY cd_pal_clabs BEGIN "%params_0%", "%params_1%", "%new_kitid%" => 1 END // mark as active + END ~%MATCH1%%MATCH2%~ + BUT_ONLY + + ACTION_IF (!RESOURCE_CONTAINS ~%params_1%.2da~ ~[ %TAB%]GA_cdiplse[ %TAB%]~) BEGIN // make sure we're not re-patching a file + + COPY_EXISTING ~%params_1%.2da~ ~override~ + REPLACE_TEXTUALLY ~\([ %TAB%]\)GA_SPCL212\([ %TAB%%LNL%%MNL%%WNL%]\)~ ~\1****\2~ + REPLACE_TEXTUALLY ~\([ %TAB%]\)GA_SPCL213\([ %TAB%%LNL%%MNL%%WNL%]\)~ ~\1****\2~ + + APPEND ~%params_1%.2da~ ~ABILITY AP_cdiplid **** AP_cdiplif CDREPLACE +ABILITY GA_SPCL212 **** **** CDREPLACE +ABILITY GA_SPCL213 **** **** CDREPLACE +ABILITY GA_cdiplse **** **** CDREPLACE +ABILITY GA_cdiplcd **** **** CDREPLACE~ + + COPY_EXISTING ~%params_1%.2da~ ~override~ + COUNT_2DA_COLS cols + FOR (index = 5 ; index < cols ; ++index) BEGIN + REPLACE_TEXTUALLY ~CDREPLACE~ ~**** CDREPLACE~ + END + REPLACE_TEXTUALLY ~CDREPLACE~ ~****~ + PRETTY_PRINT_2DA + BUT_ONLY + + END + + ACTION_GET_STRREF params_0 desc + OUTER_PATCH_SAVE desc "%desc%" BEGIN + SPRINT old @10003 + SPRINT new @10006 + REPLACE_TEXTUALLY ~%new%~ ~~ // purge in case the text is already there + REPLACE_TEXTUALLY ~[%LNL%%MNL%%WNL%]*\([%LNL%%MNL%%WNL%]\)\(%old%\)~ ~\1%new%\2~ // swap text + SPRINT old @10004 + SPRINT new @10007 + REPLACE_TEXTUALLY ~%new%~ ~~ // purge in case the text is already there + REPLACE_TEXTUALLY ~[%LNL%%MNL%%WNL%]*\([%LNL%%MNL%%WNL%]\)\(%old%\)~ ~\1%new%\2~ // swap text + SPRINT old @10005 + SPRINT new @10008 + REPLACE_TEXTUALLY ~%new%~ ~~ // purge in case the text is already there + REPLACE_TEXTUALLY ~[%LNL%%MNL%%WNL%]*\([%LNL%%MNL%%WNL%]\)\(%old%\)~ ~\1%new%\2~ // swap text END + STRING_SET_EVALUATE params_0 "%desc%" - COPY ~iwdification/itm/blank.itm~ ~override/scrl6x.itm~ - SAY 0x0c @3190 - SAY 0x54 @3191 - LPF cd_scroll INT_VAR unusable1 = (BIT0 + BIT3) target_hdr = 4 range = 20 opcode = 148 target_eff = 1 price = 1500 STR_VAR spell = EVAL ~%current_spell_res%~ END - - LAF cd_animation STR_VAR code = e24c END // 57932 MELF elemental_fire_iwd - COPY ~iwdification/cre/cdi8fire.cre~ ~override~ - SAY 0x08 @3192 - SAY 0x0c @3192 - WRITE_LONG 0x28 anim_felem - - COPY ~iwdification/itm/cdifel18.itm~ ~override~ - WRITE_LONG 0x08 string_attack - WRITE_LONG 0x0c string_attack - - COPY ~iwdification/bam/cdia531a.bam~ ~override~ - ~iwdification/bam/cdia531b.bam~ ~override~ - ~iwdification/bam/cdia531c.bam~ ~override~ - ~iwdification/bam/cdicfelx.bam~ ~override~ - ~iwdification/bam/cdimsm1h.bam~ ~override~ - ~iwdification/vvc/cdicfelx.vvc~ ~override~ - ~iwdification/vvc/cdimsm1h.vvc~ ~override~ - - COPY ~iwdification/2da/cdifelmw.2da~ ~override~ - PATCH_IF !ee_game BEGIN// delete 2nd & 3rd columns for vanilla summon tables - REPLACE_TEXTUALLY ~[ %TAB%]+HitAnimation[ %TAB%]+AreaHitAnimation~ ~~ - REPLACE_TEXTUALLY ~[ %TAB%]+cdimsm1h[ %TAB%]+.+$~ ~~ - END + END END - -///// \\\\\ -///// WIZARD_CONJURE_EARTH_ELEMENTAL \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_CONJURE_EARTH_ELEMENTAL~) OR override_arcane) BEGIN - - APPEND ~spell.ids~ ~2521 WIZARD_CONJURE_EARTH_ELEMENTAL~ // alternate identifier - - LAF cd_new_summon_table STR_VAR descript = "EARTH_ELEMENTAL_WIZ" 2da_file = cdieelmw RET table END - - COPY ~iwdification/spl/cdia532.spl~ ~override/spwi521.spl~ - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3200 // name - SAY 0x50 @3201 // descript - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 331 parameter2 = table END - END ELSE BEGIN - LPF ALTER_EFFECT INT_VAR index match_opcode = 331 opcode = 127 parameter1 = 1 parameter2 = 0 dicesize = 0 dicenumber = 0 STR_VAR resource = cdieelmw END - LPF CLONE_EFFECT INT_VAR match_opcode = 127 opcode = 215 parameter2 = 2 STR_VAR resource = cdimsm1h END - END - - COPY ~iwdification/itm/blank.itm~ ~override/scrl7c.itm~ - SAY 0x0c @3200 - SAY 0x54 @3201 - LPF cd_scroll INT_VAR unusable1 = (BIT0 + BIT3) target_hdr = 4 range = 20 opcode = 148 target_eff = 1 price = 1500 STR_VAR spell = EVAL ~%current_spell_res%~ END - - LAF cd_animation STR_VAR code = e24b END // 57931 MELE elemental_earth_iwd - COPY ~iwdification/cre/cdi8erth.cre~ ~override~ - SAY 0x08 @3202 - SAY 0x0c @3202 - WRITE_LONG 0x28 anim_eelem - - COPY ~iwdification/itm/cdieelem.itm~ ~override~ - WRITE_LONG 0x08 string_attack - WRITE_LONG 0x0c string_attack - - COPY ~iwdification/bam/cdia532a.bam~ ~override~ - ~iwdification/bam/cdia532b.bam~ ~override~ - ~iwdification/bam/cdia532c.bam~ ~override~ - ~iwdification/bam/cdiceelx.bam~ ~override~ - ~iwdification/bam/cdieelem.bam~ ~override~ - ~iwdification/bam/cdimsm1h.bam~ ~override~ - ~iwdification/vvc/cdiceelx.vvc~ ~override~ - ~iwdification/vvc/cdimsm1h.vvc~ ~override~ - - COPY ~iwdification/2da/cdieelmw.2da~ ~override~ - PATCH_IF !ee_game BEGIN// delete 2nd & 3rd columns for vanilla summon tables - REPLACE_TEXTUALLY ~[ %TAB%]+HitAnimation[ %TAB%]+AreaHitAnimation~ ~~ - REPLACE_TEXTUALLY ~[ %TAB%]+cdimsm1h[ %TAB%]+.+$~ ~~ + +// handing out some abilities +COPY_EXISTING_REGEXP GLOB ~^.+\.cre$~ ~override~ + SET paladin_level = 0 + READ_BYTE 0x273 class // V1.0 + PATCH_IF class = 6 BEGIN + READ_SHORT 0x246 kit + PATCH_IF (kit = 0) OR (kit = 0x4000) BEGIN // easy if unkitted + READ_BYTE 0x234 paladin_level + END ELSE BEGIN + PATCH_PHP_EACH cd_pal_clabs AS params => update BEGIN // work through paladin kits + PATCH_IF update BEGIN // only if the clab got updated + PATCH_IF (kit = params_2) BEGIN // if matched and got an updated clab + READ_BYTE 0x234 paladin_level + END + END + END END + END + PATCH_IF paladin_level BEGIN // if any paladin level + REMOVE_MEMORIZED_SPELL ~spcl212~ ~spcl213~ // remove all detect evil & protection from evil + ADD_MEMORIZED_SPELL spcl212 #0 ~innate~ (1) // replace with one casting + ADD_MEMORIZED_SPELL spcl213 #0 ~innate~ (1) // replace with one casting + ADD_KNOWN_SPELL cdiplse #0 ~innate~ + ADD_KNOWN_SPELL cdiplcd #0 ~innate~ + ADD_MEMORIZED_SPELL cdiplse #0 ~innate~ (1) // add smite evil + ADD_MEMORIZED_SPELL cdiplcd #0 ~innate~ (1) // add cure disease + LPF ADD_CRE_EFFECT INT_VAR opcode = 101 target = 1 timing = 1 parameter2 = 78 STR_VAR effsource = cdiplid END // immunity to disease + LPF ADD_CRE_EFFECT INT_VAR opcode = 267 target = 1 timing = 1 parameter1 = 54337 STR_VAR effsource = cdiplid END // string immunity: diseased + LPF ADD_CRE_EFFECT INT_VAR opcode = 267 target = 1 timing = 1 parameter1 = 39752 STR_VAR effsource = cdiplid END // string immunity: Stricken by a foul disease + PATCH_IF paladin_level > 2 BEGIN // add fear immunity, too + PATCH_IF enhanced_edition BEGIN + LPF ADD_CRE_EFFECT INT_VAR opcode = 321 target = 1 timing = 1 STR_VAR resource = spwi205 effsource = cdiplif END // remove spell + LPF ADD_CRE_EFFECT INT_VAR opcode = 321 target = 1 timing = 1 STR_VAR resource = spin105 effsource = cdiplif END // remove spell + END + LPF ADD_CRE_EFFECT INT_VAR opcode = 296 target = 1 timing = 1 parameter2 = 106 STR_VAR resource = cdhorror effsource = cdiplif END // immunity to animation + LPF ADD_CRE_EFFECT INT_VAR opcode = 267 target = 1 timing = 1 parameter1 = 14007 STR_VAR effsource = cdiplif END // string immunity: panic + LPF ADD_CRE_EFFECT INT_VAR opcode = 267 target = 1 timing = 1 parameter1 = 17427 STR_VAR effsource = cdiplif END // string immunity: panic + LPF ADD_CRE_EFFECT INT_VAR opcode = 267 target = 1 timing = 1 parameter1 = 20568 STR_VAR effsource = cdiplif END // string immunity: morale failure: panic + LPF ADD_CRE_EFFECT INT_VAR opcode = 161 target = 1 timing = 1 STR_VAR effsource = cdiplif END // remove fear + LPF ADD_CRE_EFFECT INT_VAR opcode = 23 target = 1 timing = 1 STR_VAR effsource = cdiplif END // reset morale + LPF ADD_CRE_EFFECT INT_VAR opcode = 106 target = 1 timing = 1 parameter2 = 1 STR_VAR effsource = cdiplif END // morale break set + LPF ADD_CRE_EFFECT INT_VAR opcode = 101 target = 1 timing = 1 parameter2 = 23 insert_point = 999 STR_VAR effsource = cdiplif END // immunity to reset morale + LPF ADD_CRE_EFFECT INT_VAR opcode = 101 target = 1 timing = 1 parameter2 = 106 insert_point = 999 STR_VAR effsource = cdiplif END // immunity to morale break + LPF ADD_CRE_EFFECT INT_VAR opcode = 101 target = 1 timing = 1 parameter2 = 24 insert_point = 999 STR_VAR effsource = cdiplif END // immunity to panic + END // end fear immunity + END // other paladin stuff + BUT_ONLY -END - +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ ///// \\\\\ -///// WIZARD_CONJURE_WATER_ELEMENTAL \\\\\ +///// IWD Class Updates: Ranger \\\\\ ///// \\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_CONJURE_WATER_ELEMENTAL~) OR override_arcane) BEGIN +/* have everything except expanded tracking info +BEGIN @11000 DESIGNATED 110 +GROUP @995 - LAF cd_new_summon_table STR_VAR descript = "WATER_ELEMENTAL_WIZ" 2da_file = cdiwelmw RET table END +COPY ~iwdification/2da/mxsplran.2da~ ~override~ // ranger spell table - ADD_SPELL ~iwdification/spl/cdia533.spl~ 2 5 WIZARD_CONJURE_WATER_ELEMENTAL - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3220 // name - SAY 0x50 @3221 // descript - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 331 parameter2 = table END - END ELSE BEGIN - LPF ALTER_EFFECT INT_VAR index match_opcode = 331 opcode = 127 parameter1 = 1 parameter2 = 0 dicesize = 0 dicenumber = 0 STR_VAR resource = cdiwelmw END - LPF CLONE_EFFECT INT_VAR match_opcode = 127 opcode = 215 parameter2 = 2 STR_VAR resource = cdimsm1h END - END +ACTION_IF enhanced_edition OR !GAME_IS ~soa~ BEGIN // only do tracking if tob is here - COPY ~iwdification/itm/blank.itm~ ~override/cdia533.itm~ - SAY 0x0c @3220 - SAY 0x54 @3221 - LPF cd_scroll INT_VAR unusable1 = BIT0 + BIT3 target_hdr = 4 range = 20 opcode = 148 target_eff = 1 price = 1500 STR_VAR spell = EVAL ~%current_spell_res%~ END - - LAF cd_animation STR_VAR code = e24d END // 57933 MELW elemental_water - COPY ~iwdification/cre/cdi8watr.cre~ ~override~ - SAY 0x08 @3222 - SAY 0x0c @3222 - WRITE_LONG 0x28 anim_welem - WRITE_ASCII 0x250 ~~ #8 // blank script that makes elementals ignore targets with SHLDBCH, as not relevant outside of IWD - - COPY ~iwdification/itm/cdiwelem.itm~ ~override~ - WRITE_LONG 0x08 string_attack - WRITE_LONG 0x0c string_attack - - COPY ~iwdification/bam/cdia533a.bam~ ~override~ - ~iwdification/bam/cdia533b.bam~ ~override~ - ~iwdification/bam/cdia533c.bam~ ~override~ - ~iwdification/bam/cdicwelx.bam~ ~override~ - ~iwdification/bam/cdimsm1h.bam~ ~override~ - ~iwdification/bam/cdiwelem.bam~ ~override~ - ~iwdification/itm/cditrn4.itm~ ~override~ - ~iwdification/vvc/cdicwelx.vvc~ ~override~ - ~iwdification/vvc/cdimsm1h.vvc~ ~override~ - - COPY ~iwdification/2da/cdiwelmw.2da~ ~override~ - PATCH_IF !ee_game BEGIN// delete 2nd & 3rd columns for vanilla summon tables - REPLACE_TEXTUALLY ~[ %TAB%]+HitAnimation[ %TAB%]+AreaHitAnimation~ ~~ - REPLACE_TEXTUALLY ~[ %TAB%]+cdimsm1h[ %TAB%]+.+$~ ~~ + ACTION_IF !FILE_EXISTS_IN_GAME ~spcl922.spl~ BEGIN // bgee or sod + + COPY ~iwdification/spl/cdiplse.spl~ ~override~ // tracking + SAY 0x08 @10001 + SAY 0x50 @10002 + + END + + OUTER_SET default_ranger = 9557 + ACTION_CLEAR_ARRAY cd_ranger_clabs + ACTION_DEFINE_ASSOCIATIVE_ARRAY cd_ranger_clabs BEGIN // start with base class tables + clabrn01,~%default_ranger%~ => RANGER // generic ranger + clabrn01,9580 => CLERIC_RANGER // cleric/ranger + END + + // add kit tables dynamically by reading kitlist + COPY_EXISTING ~kitlist.2da~ ~override~ + COUNT_2DA_ROWS 9 rows + FOR (index = 2 ; index < rows ; ++index) BEGIN // skip reserve row + READ_2DA_ENTRY index 8 9 class + PATCH_IF class = 12 BEGIN + READ_2DA_ENTRY index 1 9 kitname + READ_2DA_ENTRY index 4 9 desc + READ_2DA_ENTRY index 5 9 clab + DEFINE_ASSOCIATIVE_ARRAY cd_ranger_clabs BEGIN "%clab%","%desc%" => "%kitname%" END + END END + BUT_ONLY + + ACTION_PHP_EACH cd_ranger_clabs AS params => kit BEGIN + + ACTION_IF FILE_EXISTS_IN_GAME ~%params_0%.2da~ BEGIN -END - -///// \\\\\ -///// WIZARD_CONJURE_AIR_ELEMENTAL \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_CONJURE_AIR_ELEMENTAL~) OR override_arcane) BEGIN - - APPEND ~spell.ids~ ~2520 WIZARD_CONJURE_AIR_ELEMENTAL~ // alternate identifier - - LAF cd_new_summon_table STR_VAR descript = "AIR_ELEMENTAL_WIZ" 2da_file = cdiaelmw RET table END + APPEND ~%params_0%.2da~ ~ABILITYX GA_SPCL922 CDREPLACE~ UNLESS ~GA_SPCL922~ - COPY ~iwdification/spl/cdia534.spl~ ~override/spwi520.spl~ - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3210 // name - SAY 0x50 @3211 // descript - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 331 parameter2 = table END - END ELSE BEGIN - LPF ALTER_EFFECT INT_VAR index match_opcode = 331 opcode = 127 parameter1 = 1 parameter2 = 0 dicesize = 0 dicenumber = 0 STR_VAR resource = cdiaelmw END - LPF CLONE_EFFECT INT_VAR match_opcode = 127 opcode = 215 parameter2 = 2 STR_VAR resource = cdimsm1h END + COPY_EXISTING ~%params_0%.2da~ ~override~ + COUNT_2DA_COLS cols + FOR (index = 3 ; index < cols ; ++index) BEGIN + REPLACE_TEXTUALLY ~CDREPLACE~ ~**** CDREPLACE~ + END + REPLACE_TEXTUALLY ~CDREPLACE~ ~****~ + PRETTY_PRINT_2DA + BUT_ONLY + END - - COPY ~iwdification/itm/blank.itm~ ~override/scrl7b.itm~ - SAY 0x0c @3210 - SAY 0x54 @3211 - LPF cd_scroll INT_VAR unusable1 = (BIT0 + BIT3) target_hdr = 4 range = 20 opcode = 148 target_eff = 1 price = 1500 STR_VAR spell = EVAL ~%current_spell_res%~ END - -// LAF cd_animation STR_VAR code = 7320 END // 29472 MAIR elemental_air - COPY ~iwdification/cre/cdi8air.cre~ ~override~ - SAY 0x08 @3212 - SAY 0x0c @3212 - - COPY ~iwdification/itm/cdiaelem.itm~ ~override~ - WRITE_LONG 0x08 string_attack - WRITE_LONG 0x0c string_attack - - COPY ~iwdification/bam/cdia534a.bam~ ~override~ - ~iwdification/bam/cdia534b.bam~ ~override~ - ~iwdification/bam/cdia534c.bam~ ~override~ - ~iwdification/bam/cdimsm1h.bam~ ~override~ - ~iwdification/itm/cditrn4.itm~ ~override~ - ~iwdification/vvc/cdimsm1h.vvc~ ~override~ - - COPY ~iwdification/2da/cdiaelmw.2da~ ~override~ - PATCH_IF !ee_game BEGIN// delete 2nd & 3rd columns for vanilla summon tables - REPLACE_TEXTUALLY ~[ %TAB%]+HitAnimation[ %TAB%]+AreaHitAnimation~ ~~ - REPLACE_TEXTUALLY ~[ %TAB%]+cdimsm1h[ %TAB%]+.+$~ ~~ + + ACTION_GET_STRREF params_1 desc + OUTER_PATCH_SAVE desc "%desc%" BEGIN + PATCH_IF params_1 = default_ranger BEGIN + SPRINT old @11004 // main ranger descript doesn't have 'disadvantages' line + END ELSE BEGIN + SPRINT old @12003 + END + SPRINT new @11003 + REPLACE_TEXTUALLY ~%new%~ ~~ // purge in case the text is already there + REPLACE_TEXTUALLY ~[%LNL%%MNL%%WNL%]*\([%LNL%%MNL%%WNL%]\)\(%old%\)~ ~\1%new%\2~ // swap text END + STRING_SET_EVALUATE params_1 "%desc%" + + END // ACTION_PHP_EACH + + ACTION_IF FILE_EXISTS_IN_GAME ~luabbr.2da~ BEGIN // if game has HLA tables (everything but bgee/sod) + + ACTION_CLEAR_ARRAY cd_ranger_hlas + COPY_EXISTING ~luabbr.2da~ ~override~ + COUNT_2DA_ROWS 2 rows + FOR (index = 0 ; index < rows ; ++index) BEGIN // skip reserve row + READ_2DA_ENTRY index 0 2 kitcheck + PATCH_PHP_EACH cd_ranger_clabs AS params => kit BEGIN + PATCH_IF ("%kitcheck%" STRING_COMPARE_CASE "%kit%" = 0) BEGIN // match kit + READ_2DA_ENTRY index 1 2 table + DEFINE_ASSOCIATIVE_ARRAY cd_ranger_hlas BEGIN "%kit%" => "%table%" END + END + END + END + BUT_ONLY + + ACTION_PHP_EACH cd_ranger_hlas AS kit => table BEGIN + + ACTION_IF (RESOURCE_CONTAINS ~lu%table%.2da~ ~[ %TAB%]GA_SPCL922[ %TAB%]~) BEGIN // returns false if non-existant or doesn't contain text + + COPY_EXISTING ~lu%table%.2da~ ~override~ + COUNT_2DA_ROWS 10 rows + SET found = 0 + FOR (index = 0 ; index < rows ; ++index) BEGIN + PATCH_IF found BEGIN // if we're in a row after we've found tracking, re-index + READ_2DA_ENTRY index 0 10 abil_num + SET abil_num -= 1 + SET_2DA_ENTRY index 0 10 abil_num + END ELSE BEGIN + READ_2DA_ENTRY index 1 10 ability + PATCH_IF ("%ability%" STRING_COMPARE_CASE "GA_SPCL922" = 0) BEGIN // match_duration + READ_2DA_ENTRY index 0 10 found + END + END + END + PATCH_IF found BEGIN + REPLACE_TEXTUALLY ~^%found%[ %TAB%]+GA_SPCL922.+$[%MNL%%LNL%%WNL%]+~ ~~ // delete tracking line + END + BUT_ONLY + + ACTION_IF found BEGIN // add blank line at end if replacement made + + APPEND ~lu%table%.2da~ ~24 * * * * * * * * *~ + + END + + END + + END + + END + + // ok, so now we finally add tracking entries -END - +END +*/ + +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ ///// \\\\\ -///// WIZARD_ANTIMAGIC_SHELL \\\\\ +///// IWD Class Updates: Thief \\\\\ ///// \\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ +/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_ANTIMAGIC_SHELL~) OR override_arcane) BEGIN - - LAF cd_new_portrait_icon INT_VAR string = RESOLVE_STR_REF(@3230) STR_VAR bam_file = cdia610d RET icon END - - ADD_SPELL ~iwdification/spl/cdia610.spl~ 2 6 WIZARD_ANTIMAGIC_SHELL - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3230 // name - SAY 0x50 @3231 // descript - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 35499 parameter1 = string_dispel END - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 93 parameter2 = icon END - END ELSE BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 93 parameter2 = 83 END - END - - COPY ~iwdification/itm/blank.itm~ ~override/cdia610.itm~ - SAY 0x0c @3230 - SAY 0x54 @3231 - LPF cd_scroll INT_VAR unusable1 = BIT5 target_hdr = 5 range = 1 target_eff = 1 price = 600 STR_VAR spell = EVAL ~%current_spell_res%~ END - - COPY ~iwdification/bam/cdia610a.bam~ ~override~ - ~iwdification/bam/cdia610b.bam~ ~override~ - ~iwdification/bam/cdia610c.bam~ ~override~ - ~iwdification/bam/cdia610d.bam~ ~override~ - ~iwdification/bam/cdishelc.bam~ ~override~ - ~iwdification/vvc/cdiamags.vvc~ ~override~ - ~iwdification/wav/cdiafm04.wav~ ~override~ - ~iwdification/wav/cdiee01.wav~ ~override~ +BEGIN @12000 DESIGNATED 120 +REQUIRE_PREDICATE !GAME_IS ~soa tob bgt ca tutu tutu_totsc iwd_in_bg2~ @997 +GROUP @995 +OUTER_SET default_thief = 9561 +ACTION_CLEAR_ARRAY cd_thief_clabs +ACTION_DEFINE_ASSOCIATIVE_ARRAY cd_thief_clabs BEGIN // start with base class tables + ~%default_thief%~ => clabth01 // generic thief abilities END - -///// \\\\\ -///// WIZARD_LICH_TOUCH \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_LICH_TOUCH~) OR override_arcane) BEGIN - - ADD_SPELL ~iwdification/spl/cdia626.spl~ 2 6 WIZARD_LICH_TOUCH - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3240 // name - SAY 0x50 @3241 // descript - - COPY ~iwdification/itm/blank.itm~ ~override/cdia626.itm~ - SAY 0x0c @3240 - SAY 0x54 @3241 - LPF cd_scroll INT_VAR unusable1 = BIT2 target_hdr = 5 range = 1 target_eff = 1 price= 1800 STR_VAR spell = EVAL ~%current_spell_res%~ END - - COPY ~iwdification/itm/cdiltou.itm~ ~override~ - SAY 0x08 @3240 - SAY 0x0c @3240 - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 35606 parameter1 = string_held END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 35542 parameter1 = string_paralyzed END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 35484 parameter1 = string_panic END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 20568 parameter1 = string_mf_panic END - PATCH_IF !ee_game BEGIN - LPF CLONE_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 144 parameter2 = 4 STR_VAR resource = cdixa626 END // race = golem - LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 4 parameter2 = 3 STR_VAR resource = cdixa626 END // general = undead - END - - COPY ~iwdification/spl/cdia626a.spl~ ~override~ - LPF ADD_SPELL_EFFECT INT_VAR opcode = 109 target = 2 parameter2 = 0 duration = 42 savingthrow = BIT2 STR_VAR END - LPF ADD_SPELL_EFFECT INT_VAR opcode = 215 target = 2 parameter2 = 0 timing = 1 savingthrow = BIT2 STR_VAR resource = cdinecro END - LPF ADD_SPELL_EFFECT INT_VAR opcode = 174 target = 2 parameter2 = 0 timing = 1 savingthrow = BIT2 STR_VAR resource = cdiem07 END - - COPY ~iwdification/bam/cdia626a.bam~ ~override~ - ~iwdification/bam/cdia626b.bam~ ~override~ - ~iwdification/bam/cdia626c.bam~ ~override~ - ~iwdification/bam/cdiltou.bam~ ~override~ - ~iwdification/bam/cdinecro.bam~ ~override~ - ~iwdification/vvc/cdinecro.vvc~ ~override~ - ~iwdification/wav/cdiee04.wav~ ~override~ - ~iwdification/wav/cdiem07.wav~ ~override~ - - ACTION_IF !ee_game BEGIN - - COPY ~iwdification/eff/immunity.eff~ ~override/cdixa626.eff~ - WRITE_ASCII 0x30 ~cdia626a~ #8 - + +// add kit tables dynamically by reading kitlist +COPY_EXISTING ~kitlist.2da~ ~override~ + COUNT_2DA_ROWS 9 rows + FOR (index = 2 ; index < rows ; ++index) BEGIN // skip reserve row + READ_2DA_ENTRY index 8 9 class + PATCH_IF class = 4 BEGIN + READ_2DA_ENTRY index 4 9 desc + READ_2DA_ENTRY index 5 9 clab + DEFINE_ASSOCIATIVE_ARRAY cd_thief_clabs BEGIN "%desc%" => "%clab%" END + END END -END - -///// \\\\\ -///// WIZARD_MONSTER_SUMMONING_4 \\\\\ -///// \\\\\ + +ACTION_PHP_EACH cd_thief_clabs AS desc_strref => file BEGIN + + ACTION_IF FILE_EXISTS_IN_GAME ~%file%.2da~ BEGIN -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_MONSTER_SUMMONING_4~) OR override_arcane) BEGIN - - LAF cd_new_summon_table STR_VAR descript = "Monster_summoning_IV" 2da_file = cdimsum4 RET table END - - ADD_SPELL ~iwdification/spl/cdia627.spl~ 2 6 WIZARD_MONSTER_SUMMONING_4 - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3250 // name - SAY 0x50 @3251 // descript - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 331 parameter2 = table END - END ELSE BEGIN - LPF CLONE_EFFECT INT_VAR match_opcode = 331 opcode = 215 parameter2 = 2 STR_VAR resource = cdimsm1h END - LPF CLONE_EFFECT INT_VAR match_opcode = 331 opcode = 127 parameter1 = 1 parameter2 = 0 probability1 = 33 dicesize = 0 dicenumber = 0 STR_VAR resource = cdimsum4 END - LPF CLONE_EFFECT INT_VAR match_opcode = 331 opcode = 127 parameter1 = 1 parameter2 = 0 probability1 = 67 dicesize = 0 dicenumber = 0 STR_VAR resource = cdimsum4 END - LPF ALTER_EFFECT INT_VAR match_opcode = 331 opcode = 127 parameter1 = 1 parameter2 = 0 dicesize = 0 dicenumber = 0 STR_VAR resource = cdimsum4 END - END + APPEND ~%file%.2da~ ~ABILITYX **** **** **** **** **** **** AP_CDIEVADE CDREPLACE~ UNLESS ~AP_CDIEVADE~ - COPY ~iwdification/itm/blank.itm~ ~override/cdia627.itm~ - SAY 0x0c @3250 - SAY 0x54 @3251 - LPF cd_scroll INT_VAR unusable1 = (BIT0 + BIT3) target_hdr = 4 range = 20 opcode = 148 target_eff = 1 price = 1800 STR_VAR spell = EVAL ~%current_spell_res%~ END - - LAF cd_animation STR_VAR code = e320 END // 58144 MGH3 ghast_greater - COPY ~iwdification/cre/cdi4ghst.cre~ ~override~ - WRITE_LONG 0x08 string_ghast - WRITE_LONG 0x0c string_ghast - WRITE_LONG 0x28 anim_ghast - -// LAF cd_animation STR_VAR code = 9000 END // 36864 MOGR ogre - COPY ~iwdification/cre/cdi4ogre.cre~ ~override~ - WRITE_LONG 0x08 string_ogre - WRITE_LONG 0x0c string_ogre - - COPY ~iwdification/2da/cdimsum4.2da~ ~override~ - PATCH_IF !ee_game BEGIN// delete 2nd & 3rd columns for vanilla summon tables - REPLACE_TEXTUALLY ~[ %TAB%]+HitAnimation[ %TAB%]+AreaHitAnimation~ ~~ - REPLACE_TEXTUALLY ~[ %TAB%]+cdimsm1h[ %TAB%]+.+$~ ~~ - PATCH_IF !anim_yeti BEGIN - REPLACE_TEXTUALLY ~^3[ %TAB%]+cdi4yeti[ %TAB%%LNL%%MNL%%WNL%]+~ ~~ // delete yeti line from msum table + COPY_EXISTING ~%file%.2da~ ~override~ + COUNT_2DA_COLS cols + FOR (index = 9 ; index < cols ; ++index) BEGIN + REPLACE_TEXTUALLY ~CDREPLACE~ ~**** CDREPLACE~ END - END - - ACTION_IF anim_yeti BEGIN // yeti animation (e.g. ee or vanilla bg2 w/ infinity animations) - - LAF cd_animation STR_VAR code = e25d END // 57949 MYET tundra_yeti - COPY ~iwdification/cre/cdi4yeti.cre~ ~override~ - SAY 0x08 @3252 - SAY 0x0c @3252 - + REPLACE_TEXTUALLY ~CDREPLACE~ ~****~ + PRETTY_PRINT_2DA + BUT_ONLY + END - - COPY ~iwdification/bam/cdia627a.bam~ ~override~ - ~iwdification/bam/cdia627b.bam~ ~override~ - ~iwdification/bam/cdia627c.bam~ ~override~ - ~iwdification/bam/cdimsm1h.bam~ ~override~ - ~iwdification/bam/cdimsm1x.bam~ ~override~ - ~iwdification/vvc/cdimsm1h.vvc~ ~override~ - ~iwdification/vvc/cdimsm1x.vvc~ ~override~ + + ACTION_GET_STRREF desc_strref desc + OUTER_PATCH_SAVE desc "%desc%" BEGIN + PATCH_IF desc_strref = default_thief BEGIN + SPRINT old @12004 // main thief descript doesn't have 'disadvantages' line + END ELSE BEGIN + SPRINT old @12003 + END + SPRINT new @12002 + REPLACE_TEXTUALLY ~%new%~ ~~ // purge in case the text is already there + REPLACE_TEXTUALLY ~[%LNL%%MNL%%WNL%]*\([%LNL%%MNL%%WNL%]\)\(%old%\)~ ~\1%new%\2~ // swap text + END + STRING_SET_EVALUATE desc_strref "%desc%" END -///// \\\\\ -///// WIZARD_OTILUKES_FREEZING_SPHERE \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_OTILUKES_FREEZING_SPHERE~) OR override_arcane) BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdi269.pro~ - - ADD_SPELL ~iwdification/spl/cdia628.spl~ 2 6 WIZARD_OTILUKES_FREEZING_SPHERE - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3260 // name - SAY 0x50 @3261 // descript - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi269 END - - COPY ~iwdification/itm/blank.itm~ ~override/cdia628.itm~ - SAY 0x0c @3260 - SAY 0x54 @3261 - LPF cd_scroll INT_VAR range = 40 price = 1800 STR_VAR spell = EVAL ~%current_spell_res%~ END +COPY ~iwdification/spl/cdievade.spl~ ~override~ + SAY 0x9e @12001 - COPY ~iwdification/bam/cdia628a.bam~ ~override~ - ~iwdification/bam/cdia628b.bam~ ~override~ - ~iwdification/bam/cdia628c.bam~ ~override~ - ~iwdification/bam/cdiofspt.bam~ ~override~ - -END - -///// \\\\\ -///// WIZARD_SHADES \\\\\ -///// \\\\\ +INCLUDE ~iwdification/evasion/evasion.tpa~ +LAF cd_add_evasion STR_VAR 2da_file = ~iwdification/evasion/evasion.2da~ END +LAF cd_add_evasion STR_VAR 2da_file = ~iwdification/evasion/evasion_arcane.2da~ END +LAF cd_add_evasion STR_VAR 2da_file = ~iwdification/evasion/evasion_divine.2da~ END -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_SHADES~) OR override_arcane) BEGIN - - LAF cd_new_summon_table STR_VAR descript = "Shades" 2da_file = cdishade RET table END - - ADD_SPELL ~iwdification/spl/cdia629.spl~ 2 6 WIZARD_SHADES - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3270 // name - SAY 0x50 @3271 // descript - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 331 parameter2 = table END - END ELSE BEGIN - READ_SHORT 0x68 abil_num - LPF ALTER_EFFECT INT_VAR header = 0 match_opcode = 331 opcode = 127 parameter1 = 1 parameter2 = 0 dicesize = 0 dicenumber = 0 STR_VAR resource = cdishade END - FOR (index = 1 ; index < abil_num ; ++index) BEGIN - LPF ALTER_EFFECT INT_VAR header = index match_opcode = 331 opcode = 127 parameter1 = (index + 12) parameter2 = 0 dicesize = 0 dicenumber = 0 STR_VAR resource = cdishade END - END - LPF CLONE_EFFECT INT_VAR match_opcode = 127 opcode = 215 parameter2 = 2 STR_VAR resource = cdimsm1h END - END - - COPY ~iwdification/itm/blank.itm~ ~override/cdia629.itm~ - SAY 0x0c @3270 - SAY 0x54 @3271 - LPF cd_scroll INT_VAR unusable1 = BIT4 target_hdr = 4 range = 50 opcode = 148 target_eff = 1 price = 1800 STR_VAR spell = EVAL ~%current_spell_res%~ END - - ACTION_IF ee_game BEGIN // use iwdee gaze for ee games - - ADD_PROJECTILE ~iwdification/pro/cdi281.pro~ - - COMPILE ~iwdification/baf/cdiuhgaz.baf~ - - COPY ~iwdification/spl/cdiumbr1.spl~ ~override~ // gaze staging - ~iwdification/spl/cditrdie.spl~ ~override~ // ee troll death - COPY ~iwdification/spl/cdiumbr2.spl~ ~override~ // actual gaze - SAY 0xce @3273 - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi281 END - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 37604 parameter1 = string_confused END - - END ELSE BEGIN - - COPY_EXISTING ~umbhul01.bcs~ ~override/cdiuhgaz.bcs~ // use bg2 umber hulk scripting - DECOMPILE_AND_PATCH BEGIN - REPLACE_TEXTUALLY ~AreaCheck("AR1106")~ ~False()~ - END - - END - - LAF cd_animation STR_VAR code = e420 END // 58400 MGO3 goblin_elite_axe - COPY ~iwdification/cre/cdis2gb2.cre~ ~override~ - ~iwdification/cre/cdis2gb3.cre~ ~override~ - SAY 0x08 @3162 - SAY 0x0c @3162 - - LAF cd_animation STR_VAR code = e500 END // 58624 MLIZ lizard_man_elite - COPY ~iwdification/cre/cdis2lz5.cre~ ~override~ - ~iwdification/cre/cdis2lz6.cre~ ~override~ - ~iwdification/cre/cdis2lz7.cre~ ~override~ - SAY 0x08 @3163 - SAY 0x0c @3163 - - LAF cd_animation STR_VAR code = e0b0 END // 57520 MTRO troll_blue - MTRO doubles with bg2 troll - COPY ~iwdification/cre/cdis3tr7.cre~ ~override~ - ~iwdification/cre/cdis3tr8.cre~ ~override~ - WRITE_LONG 0x08 string_troll - WRITE_LONG 0x0c string_troll - WRITE_LONG 0x28 anim_btroll - WRITE_ASCII 0x258 ~~ #8 // blank old die-revive troll script - - LAF cd_animation STR_VAR code = e0d0 END // 57552 MUMB umber_hulk_elder - MUMB doubles with bg2 umber hulk - COPY ~iwdification/cre/cdis3um8.cre~ ~override~ - ~iwdification/cre/cdis3um9.cre~ ~override~ - SAY 0x08 @3272 - SAY 0x0c @3272 - WRITE_LONG 0x28 anim_uhulk - - COPY ~iwdification/itm/cdiumbhk.itm~ ~override~ - ~iwdification/itm/cdim1d7s.itm~ ~override~ - WRITE_LONG 0x08 string_attack - WRITE_LONG 0x0c string_attack - - COPY ~iwdification/itm/cdir1hp2.itm~ ~override~ - LPF DELETE_EFFECT INT_VAR match_opcode = 206 END // old iwd vorpal protections - LPF DELETE_EFFECT INT_VAR match_opcode = 267 END - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 232 STR_VAR resource = cditrdie END - END ELSE BEGIN - PATCH_FOR_EACH op IN 232 208 BEGIN // nuke everything but regen - LPF DELETE_EFFECT INT_VAR match_opcode = op END - END - END - - COPY ~iwdification/bam/cdia629a.bam~ ~override~ - ~iwdification/bam/cdia629b.bam~ ~override~ - ~iwdification/bam/cdia629c.bam~ ~override~ - ~iwdification/bam/cdimsm1h.bam~ ~override~ - ~iwdification/bam/cdimsm1x.bam~ ~override~ - ~iwdification/itm/cdisumam.itm~ ~override~ - ~iwdification/itm/cdisumrn.itm~ ~override~ - ~iwdification/itm/cditrn40.itm~ ~override~ - ~iwdification/itm/cditrn60.itm~ ~override~ - ~iwdification/vvc/cdimsm1h.vvc~ ~override~ - ~iwdification/vvc/cdimsm1x.vvc~ ~override~ - - COPY ~iwdification/2da/cdishade.2da~ ~override~ - PATCH_IF !ee_game BEGIN// delete 2nd & 3rd columns for vanilla summon tables - REPLACE_TEXTUALLY ~[ %TAB%]+HitAnimation[ %TAB%]+AreaHitAnimation~ ~~ - REPLACE_TEXTUALLY ~[ %TAB%]+cdimsm1h[ %TAB%]+.+$~ ~~ - END - -END - -///// \\\\\ -///// WIZARD_DARTS_OF_BONE \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_DARTS_OF_BONE~) OR override_arcane) BEGIN - - ADD_SPELL ~iwdification/spl/cdia630.spl~ 2 6 WIZARD_DARTS_OF_BONE - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3280 // name - SAY 0x50 @3281 // descript - - COPY ~iwdification/itm/blank.itm~ ~override/cdia630.itm~ - SAY 0x0c @3280 - SAY 0x54 @3281 - LPF cd_scroll INT_VAR unusable1 = BIT2 target_hdr = 5 range = 1 target_eff = 1 price = 600 STR_VAR spell = EVAL ~%current_spell_res%~ END - - COPY ~iwdification/itm/cdidbone.itm~ ~override~ - SAY 0x08 @3280 - SAY 0x0c @3282 - - COPY ~iwdification/bam/cdia630a.bam~ ~override~ - ~iwdification/bam/cdia630b.bam~ ~override~ - ~iwdification/bam/cdia630c.bam~ ~override~ - ~iwdification/bam/cdidbone.bam~ ~override~ - ~iwdification/vvc/cdinecro.vvc~ ~override~ - ~iwdification/bam/cdinecro.bam~ ~override~ - ~iwdification/wav/cdiem07.wav~ ~override~ - -END - -///// \\\\\ -///// WIZARD_SOUL_EATER \\\\\ -///// \\\\\ - -ACTION_IF (ee_game AND (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_SOUL_EATER~) OR override_arcane)) BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdi299.pro~ - - ADD_SPELL ~iwdification/spl/cdia631.spl~ 2 6 WIZARD_SOUL_EATER - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3290 // name - SAY 0x50 @3291 // descript - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi299 END - LPF ALTER_EFFECT STR_VAR match_resource = cdia631 resource = EVAL ~%DEST_RES%~ END - - COPY ~iwdification/itm/blank.itm~ ~override/cdia631.itm~ - SAY 0x0c @3290 - SAY 0x54 @3291 - LPF cd_scroll INT_VAR unusable1 = BIT2 target_hdr = 4 range = 100 opcode = 148 target_eff = 1 price = 1800 STR_VAR spell = EVAL ~%current_spell_res%~ END - - COMPILE ~iwdification/baf/cdi3sklm.baf~ - - LAF cd_animation STR_VAR code = 6403 END // 25603 MSKL skeleton - COPY ~iwdification/cre/cdi3sklm.cre~ ~override~ - WRITE_LONG 0x08 string_skelly - WRITE_LONG 0x0c string_skelly - WRITE_ASCII 0x248 ~cdi3sklm~ #8 - - COPY ~iwdification/bam/cdia631a.bam~ ~override~ - ~iwdification/bam/cdia631b.bam~ ~override~ - ~iwdification/bam/cdia631c.bam~ ~override~ - ~iwdification/bam/cdiseata.bam~ ~override~ - ~iwdification/bam/cdiseath.bam~ ~override~ - ~iwdification/spl/cdi3sklm.spl~ ~override~ - ~iwdification/spl/cdia631b.spl~ ~override~ - ~iwdification/vvc/cdiseata.vvc~ ~override~ - ~iwdification/vvc/cdiseath.vvc~ ~override~ - ~iwdification/wav/cdiarm18.wav~ ~override~ - ~iwdification/wav/cdiem104.wav~ ~override~ - -END - -///// \\\\\ -///// WIZARD_TROLLISH_FORTITUDE \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_TROLLISH_FORTITUDE~) OR override_arcane) BEGIN - - ADD_SPELL ~iwdification/spl/cdia632.spl~ 2 6 WIZARD_TROLLISH_FORTITUDE - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3300 // name - SAY 0x50 @3301 // descript - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT STR_VAR match_resource = cdia632 resource = EVAL ~%DEST_RES%~ END - END ELSE BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 321 END - LPF CLONE_EFFECT INT_VAR match_opcode = 142 opcode = 206 parameter1 = 0 parameter2 = 0 STR_VAR insert = last resource = EVAL ~%DEST_RES%~ END - END - - COPY ~iwdification/itm/blank.itm~ ~override/cdia632.itm~ - SAY 0x0c @3300 - SAY 0x54 @3301 - LPF cd_scroll INT_VAR unusable1 = BIT2 target_hdr = 5 range = 1 target_eff = 1 price = 600 STR_VAR spell = EVAL ~%current_spell_res%~ END - - COPY ~iwdification/bam/cdia632a.bam~ ~override~ - ~iwdification/bam/cdia632b.bam~ ~override~ - ~iwdification/bam/cdia632c.bam~ ~override~ - ~iwdification/eff/cditroll.eff~ ~override~ - -END - -///// \\\\\ -///// WIZARD_MONSTER_SUMMONING_5 \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_MONSTER_SUMMONING_5~) OR override_arcane) BEGIN - - LAF cd_new_summon_table STR_VAR descript = "Monster_summoning_V" 2da_file = cdimsum5 RET table END - - ADD_SPELL ~iwdification/spl/cdia706.spl~ 2 7 WIZARD_MONSTER_SUMMONING_5 - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3310 // name - SAY 0x50 @3311 // descript - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 331 parameter2 = table END - END ELSE BEGIN - LPF CLONE_EFFECT INT_VAR match_opcode = 331 opcode = 215 parameter2 = 2 STR_VAR resource = cdimsm1h END - LPF CLONE_EFFECT INT_VAR match_opcode = 331 opcode = 127 parameter1 = 1 parameter2 = 0 probability1 = 33 dicesize = 0 dicenumber = 0 STR_VAR resource = cdimsum5 END - LPF CLONE_EFFECT INT_VAR match_opcode = 331 opcode = 127 parameter1 = 1 parameter2 = 0 probability1 = 67 dicesize = 0 dicenumber = 0 STR_VAR resource = cdimsum5 END - LPF ALTER_EFFECT INT_VAR match_opcode = 331 opcode = 127 parameter1 = 1 parameter2 = 0 dicesize = 0 dicenumber = 0 STR_VAR resource = cdimsum5 END - END - - COPY ~iwdification/itm/blank.itm~ ~override/cdia706.itm~ - SAY 0x0c @3310 - SAY 0x54 @3311 - LPF cd_scroll INT_VAR unusable1 = (BIT0 + BIT3) target_hdr = 4 range = 20 opcode = 148 target_eff = 1 price = 2100 STR_VAR spell = EVAL ~%current_spell_res%~ END - -// LAF cd_animation STR_VAR code = 7a00 END // 31232 MSPI_GI spider_giant - COPY ~iwdification/cre/cdi5gspi.cre~ ~override~ - WRITE_LONG 0x08 string_gspider - WRITE_LONG 0x0c string_gspider - - LAF cd_animation STR_VAR code = ee00 END // 60928 MZO2 zombie_yellow - COPY ~iwdification/cre/cdi5jzom.cre~ ~override~ - SAY 0x08 @3312 - SAY 0x0c @3312 - WRITE_LONG 0x28 anim_jzombie - - LAF cd_animation STR_VAR code = e070 END // 57456 MMIN minotaur - MMIN doubles with bg2 mindflayer - COPY ~iwdification/cre/cdi5mino.cre~ ~override~ - SAY 0x08 @3313 - SAY 0x0c @3313 - - COPY ~iwdification/itm/cdis18ml.itm~ ~override~ - WRITE_LONG 0x08 string_attack - WRITE_LONG 0x0c string_attack - - COPY ~iwdification/bam/cdia706a.bam~ ~override~ - ~iwdification/bam/cdia706b.bam~ ~override~ - ~iwdification/bam/cdia706c.bam~ ~override~ - ~iwdification/bam/cdimsm1h.bam~ ~override~ - ~iwdification/bam/cdimsm1x.bam~ ~override~ - ~iwdification/vvc/cdimsm1h.vvc~ ~override~ - ~iwdification/vvc/cdimsm1x.vvc~ ~override~ - - COPY ~iwdification/2da/cdimsum5.2da~ ~override~ - PATCH_IF !ee_game BEGIN// delete 2nd & 3rd columns for vanilla summon tables - REPLACE_TEXTUALLY ~[ %TAB%]+HitAnimation[ %TAB%]+AreaHitAnimation~ ~~ - REPLACE_TEXTUALLY ~[ %TAB%]+cdimsm1h[ %TAB%]+.+$~ ~~ - END - -END - -///// \\\\\ -///// WIZARD_MALAVONS_RAGE \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_MALAVONS_RAGE~) OR override_arcane) BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdi209.pro~ - - ADD_SPELL ~iwdification/spl/cdia709.spl~ 2 7 WIZARD_MALAVONS_RAGE - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3320 // name - SAY 0x50 @3321 // descript - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi209 END - PATCH_IF !ee_game BEGIN - LPF CD_SPLIT_SAVE_DAMAGE END - END - - COPY ~iwdification/itm/blank.itm~ ~override/cdia709.itm~ - SAY 0x0c @3320 - SAY 0x54 @3321 - LPF cd_scroll INT_VAR unusable1 = BIT1 target_hdr = 5 range = 50 price = 2100 STR_VAR spell = EVAL ~%current_spell_res%~ END - - COPY ~iwdification/bam/cdia709a.bam~ ~override~ - ~iwdification/bam/cdia709b.bam~ ~override~ - ~iwdification/bam/cdia709c.bam~ ~override~ - ~iwdification/bam/cdimagrx.bam~ ~override~ - ~iwdification/bam/cdimrage.bam~ ~override~ - ~iwdification/vvc/cdimalrg.vvc~ ~override~ - ~iwdification/vvc/cdimrage.vvc~ ~override~ - -END - -///// \\\\\ -///// WIZARD_ACID_STORM \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_ACID_STORM~) OR override_arcane) BEGIN - - ACTION_IF ee_game BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdi211.pro~ - - END ELSE BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdi211a.pro~ - - END - - ADD_SPELL ~iwdification/spl/cdia724.spl~ 2 7 WIZARD_ACID_STORM - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3330 // name - SAY 0x50 @3331 // descript - PATCH_IF ee_game BEGIN - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi211 END - END ELSE BEGIN - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi211a END - LPF ALTER_EFFECT INT_VAR match_opcode = 12 match_dicesize = 4 dicesize = 2 END - LPF ALTER_EFFECT INT_VAR match_opcode = 12 match_dicesize = 6 dicesize = 3 END - LPF ALTER_EFFECT INT_VAR match_opcode = 12 match_dicesize = 8 dicesize = 4 END - LPF CLONE_EFFECT INT_VAR match_opcode = 12 savingthrow = BIT24 END - PATCH_FOR_EACH res IN 0 1 2 3 4 5 6 7 8 9 x y z BEGIN // simulating clouds in bg2 sucks - LPF ADD_SPELL_EFFECT INT_VAR opcode = 215 target = 1 parameter2 = 2 resist_dispel = 3 STR_VAR resource = EVAL ~cdia724%res%~ END - END - END - - COPY ~iwdification/itm/blank.itm~ ~override/cdia724.itm~ - SAY 0x0c @3330 - SAY 0x54 @3331 - LPF cd_scroll INT_VAR unusable1 = BIT1 target_hdr = 4 range = 40 opcode = 148 target_eff = 1 price = 2100 STR_VAR spell = EVAL ~%current_spell_res%~ END - - COPY ~iwdification/bam/cdia724a.bam~ ~override~ - ~iwdification/bam/cdia724b.bam~ ~override~ - ~iwdification/bam/cdia724c.bam~ ~override~ - ~iwdification/bam/cdiastra.bam~ ~override~ - ~iwdification/bam/cdiastrx.bam~ ~override~ - - ACTION_IF !ee_game BEGIN - - COPY ~iwdification/vvc/cdia7240.vvc~ ~override~ - ~iwdification/vvc/cdia7241.vvc~ ~override~ - ~iwdification/vvc/cdia7242.vvc~ ~override~ - ~iwdification/vvc/cdia7243.vvc~ ~override~ - ~iwdification/vvc/cdia7244.vvc~ ~override~ - ~iwdification/vvc/cdia7245.vvc~ ~override~ - ~iwdification/vvc/cdia7246.vvc~ ~override~ - ~iwdification/vvc/cdia7247.vvc~ ~override~ - ~iwdification/vvc/cdia7248.vvc~ ~override~ - ~iwdification/vvc/cdia7249.vvc~ ~override~ - ~iwdification/vvc/cdia724x.vvc~ ~override~ - ~iwdification/vvc/cdia724y.vvc~ ~override~ - ~iwdification/vvc/cdia724z.vvc~ ~override~ - - END - -END - -///// \\\\\ -///// WIZARD_SEVEN_EYES \\\\\ -///// \\\\\ - -ACTION_IF (ee_game AND (FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_SHOUT~)) AND // eye of fortitude requires shout, no vanilla - (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_SEVEN_EYES~) OR override_arcane)) BEGIN - - ADD_SPELL ~iwdification/spl/cdia725.spl~ 2 7 WIZARD_SEVEN_EYES - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3340 // name - SAY 0x50 @3341 // descript - LPF ALTER_EFFECT STR_VAR match_resource = cdia725 resource = EVAL ~%DEST_RES%~ END - - COPY ~iwdification/itm/blank.itm~ ~override/cdia725.itm~ - SAY 0x0c @3340 - SAY 0x54 @3341 - LPF cd_scroll INT_VAR unusable1 = BIT5 target_hdr = 5 range = 1 target_eff = 1 price = 700 STR_VAR spell = EVAL ~%current_spell_res%~ END - - COPY ~iwdification/spl/cdia725t.spl~ ~override~ - SAY 0x08 @3342 // name - SAY 0x50 @3343 // descript - - COPY ~iwdification/spl/cdia725u.spl~ ~override~ - SAY 0x08 @3344 // name - SAY 0x50 @3345 // descript - - COPY ~iwdification/spl/cdia725v.spl~ ~override~ - SAY 0x08 @3346 // name - SAY 0x50 @3347 // descript - - COPY ~iwdification/spl/cdia725w.spl~ ~override~ - SAY 0x08 @3348 // name - SAY 0x50 @3349 // descript - - COPY ~iwdification/spl/cdia725x.spl~ ~override~ - SAY 0x08 @3350 // name - SAY 0x50 @3351 // descript - - COPY ~iwdification/spl/cdia725y.spl~ ~override~ - SAY 0x08 @3352 // name - SAY 0x50 @3353 // descript - - COPY ~iwdification/spl/cdia725z.spl~ ~override~ - SAY 0x08 @3354 // name - SAY 0x50 @3355 // descript - - COPY ~iwdification/2da/7eyes.2da~ ~override~ - REPLACE ~21648~ @3356 - REPLACE ~21649~ @3357 - REPLACE ~21650~ @3358 - REPLACE ~21651~ @3359 - REPLACE ~21652~ @3360 - REPLACE ~21653~ @3361 - REPLACE ~21654~ @3362 - - COPY ~iwdification/bam/cdia725a.bam~ ~override~ - ~iwdification/bam/cdia725b.bam~ ~override~ - ~iwdification/bam/cdia725c.bam~ ~override~ - ~iwdification/bam/cdi7eyc1.bam~ ~override~ - ~iwdification/bam/cdi7eyc2.bam~ ~override~ - ~iwdification/bam/cdia725t.bam~ ~override~ - ~iwdification/bam/cdia725u.bam~ ~override~ - ~iwdification/bam/cdia725v.bam~ ~override~ - ~iwdification/bam/cdia725w.bam~ ~override~ - ~iwdification/bam/cdia725x.bam~ ~override~ - ~iwdification/bam/cdia725y.bam~ ~override~ - ~iwdification/bam/cdia725z.bam~ ~override~ - ~iwdification/vvc/cdi7ey.vvc~ ~override~ - ~iwdification/vvc/cdi7ey1a.vvc~ ~override~ - ~iwdification/vvc/cdi7ey1b.vvc~ ~override~ - ~iwdification/vvc/cdi7ey1c.vvc~ ~override~ - ~iwdification/vvc/cdi7ey1d.vvc~ ~override~ - ~iwdification/vvc/cdi7ey1e.vvc~ ~override~ - ~iwdification/vvc/cdi7ey1f.vvc~ ~override~ - ~iwdification/vvc/cdi7ey1g.vvc~ ~override~ - ~iwdification/vvc/cdi7ey2a.vvc~ ~override~ - ~iwdification/vvc/cdi7ey2b.vvc~ ~override~ - ~iwdification/vvc/cdi7ey2c.vvc~ ~override~ - ~iwdification/vvc/cdi7ey2d.vvc~ ~override~ - ~iwdification/vvc/cdi7ey2e.vvc~ ~override~ - ~iwdification/vvc/cdi7ey2f.vvc~ ~override~ - ~iwdification/vvc/cdi7ey2g.vvc~ ~override~ - ~iwdification/wav/cdiafm13.wav~ ~override~ - ~iwdification/wav/cdiafm15.wav~ ~override~ - ~iwdification/wav/cdiafm16.wav~ ~override~ - ~iwdification/wav/cdiafm17.wav~ ~override~ - -END - -///// \\\\\ -///// WIZARD_SUFFOCATE \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_SUFFOCATE~) OR override_arcane) BEGIN - - ACTION_IF ee_game BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdi317.pro~ - - END ELSE BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdi317a.pro~ - - END - - ADD_SPELL ~iwdification/spl/cdia726.spl~ 2 7 WIZARD_SUFFOCATE - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3370 // name - SAY 0x50 @3371 // descript - PATCH_IF ee_game BEGIN - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi317 END - LPF ALTER_EFFECT STR_VAR match_resource = cdia726 resource = EVAL ~%DEST_RES%~ END - END ELSE BEGIN - LPF DELETE_EFFECT END - LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 1 timing = 1 parameter2 = 2 STR_VAR resource = cdia726 END - LPF ALTER_SPELL_HEADER INT_VAR projectile = 1 END - END - - COPY ~iwdification/itm/blank.itm~ ~override/cdia726.itm~ - SAY 0x0c @3370 - SAY 0x54 @3371 - LPF cd_scroll INT_VAR unusable2 = BIT6 target_hdr = 4 range = 100 opcode = 148 target_eff = 1 price = 2100 STR_VAR spell = EVAL ~%current_spell_res%~ END - - - COPY ~iwdification/bam/cdia726a.bam~ ~override~ - ~iwdification/bam/cdia726b.bam~ ~override~ - ~iwdification/bam/cdia726c.bam~ ~override~ - ~iwdification/bam/cdisuffo.bam~ ~override~ - - ACTION_IF ee_game BEGIN - - APPEND ~clearair.2da~ ~Suffocate %cdi317%~ - - COPY ~iwdification/vvc/cdisuffo.vvc~ ~override~ - ~iwdification/wav/cdiafm18.wav~ ~override~ - - END ELSE BEGIN - - APPEND ~clearair.2da~ ~Suffocate %cdi317a%~ - - LAUNCH_ACTION_FUNCTION cd_create_cloud INT_VAR visloop = 5 cloud_dur = 60 zosa = 1 STR_VAR code = CDIA726 anim = cdisuffo END - - COPY ~iwdification/spl/cdia726.spl~ ~override~ - WRITE_LONG 0x08 "-1" // name - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi317a END - LPF CLONE_EFFECT INT_VAR match_opcode = 321 opcode = 206 duration = 6 STR_VAR insert = last END - LPF DELETE_EFFECT INT_VAR match_opcode = 321 END - LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 9 opcode = 177 parameter1 = 145 parameter2 = 4 STR_VAR resource = cdixa726 END // race = elemental - LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 27 opcode = 177 parameter1 = 144 parameter2 = 4 STR_VAR resource = cdixa726 END // race = golem - LPF CLONE_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 31 opcode = 177 parameter1 = 121 parameter2 = 4 STR_VAR resource = cdixa726 END // race = demonic - LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 31 opcode = 177 parameter1 = 4 parameter2 = 3 STR_VAR resource = cdixa726 END // general = undead - LPF CD_SPLIT_SAVE_DAMAGE END - - COPY ~iwdification/eff/immunity.eff~ ~override/cdixa726.eff~ - WRITE_ASCII 0x30 ~cdia726~ #8 - - END - -END - -///// \\\\\ -///// WIZARD_MONSTER_SUMMONING_6 \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_MONSTER_SUMMONING_6~) OR override_arcane) BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdisalau.pro~ - - LAF cd_new_summon_table STR_VAR descript = "Monster_summoning_VI" 2da_file = cdimsum6 RET table END - - ADD_SPELL ~iwdification/spl/cdia801.spl~ 2 8 WIZARD_MONSTER_SUMMONING_6 - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3380 // name - SAY 0x50 @3381 // descript - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 331 parameter2 = table END - END ELSE BEGIN - LPF CLONE_EFFECT INT_VAR match_opcode = 331 opcode = 215 parameter2 = 2 STR_VAR resource = cdimsm1h END - LPF CLONE_EFFECT INT_VAR match_opcode = 331 opcode = 127 parameter1 = 1 parameter2 = 0 probability1 = 33 dicesize = 0 dicenumber = 0 STR_VAR resource = cdimsum6 END - LPF CLONE_EFFECT INT_VAR match_opcode = 331 opcode = 127 parameter1 = 1 parameter2 = 0 probability1 = 67 dicesize = 0 dicenumber = 0 STR_VAR resource = cdimsum6 END - LPF ALTER_EFFECT INT_VAR match_opcode = 331 opcode = 127 parameter1 = 1 parameter2 = 0 dicesize = 0 dicenumber = 0 STR_VAR resource = cdimsum6 END - END - - COPY ~iwdification/itm/blank.itm~ ~override/cdia801.itm~ - SAY 0x0c @3380 - SAY 0x54 @3381 - LPF cd_scroll INT_VAR unusable1 = (BIT0 + BIT3) target_hdr = 4 range = 20 opcode = 148 target_eff = 1 price = 2400 STR_VAR spell = EVAL ~%current_spell_res%~ END - - COMPILE ~iwdification/baf/cdisalfi.baf~ - ~iwdification/baf/cdisalfr.baf~ - ~iwdification/baf/cdipspid.baf~ - -// LAF cd_animation STR_VAR code = a100 END // 41216 MCAR carrion_crawler - COPY ~iwdification/cre/cdi6crwl.cre~ ~override~ - WRITE_LONG 0x08 string_crawler - WRITE_LONG 0x0c string_crawler - -// LAF cd_animation STR_VAR code = 7a02 END // 31234 MSPI_PH spider_phase - COPY ~iwdification/cre/cdi6pspi.cre~ ~override~ - WRITE_LONG 0x08 string_pspider - WRITE_LONG 0x0c string_pspider - - LAF cd_animation STR_VAR code = e910 END // 59664 MSA2 salamander_frost - COPY ~iwdification/cre/cdi6salc.cre~ ~override~ - SAY 0x08 @3383 - SAY 0x0c @3383 - - LAF cd_animation STR_VAR code = e900 END // 59648 MSAL salamander_fire - COPY ~iwdification/cre/cdi6salf.cre~ ~override~ - SAY 0x08 @3382 - SAY 0x0c @3382 - - COPY ~iwdification/itm/cdisalfi.itm~ ~override~ - ~iwdification/itm/cdisalfr.itm~ ~override~ - WRITE_LONG 0x08 string_attack - WRITE_LONG 0x0c string_attack - WRITE_ASCII 0x3a ~isper01~ #8 - WRITE_ASCII 0x76 ~isper01~ #8 - LPF ADD_ITEM_EQEFFECT INT_VAR opcode = 215 target = 1 parameter2 = 1 timing = 2 duration = 0 STR_VAR resource = EVAL ~%SOURCE_RES%~ END - - COPY ~iwdification/spl/cdifire6.spl~ ~override~ - ~iwdification/spl/cdifros6.spl~ ~override~ - PATCH_IF ee_game BEGIN - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdisalau END - END ELSE BEGIN - LPF ALTER_SPELL_HEADER INT_VAR projectile = 1 END - LPF DELETE_EFFECT INT_VAR match_opcode = 318 END - END - - COPY ~iwdification/spl/cdisalfi.spl~ ~override~ - ~iwdification/spl/cdisalfr.spl~ ~override~ - PATCH_IF !ee_game BEGIN // change from EE's 232 distance check to straight once-per-round spam; needs effs copied below - LPF ALTER_EFFECT INT_VAR match_opcode = 232 opcode = 272 target = 1 parameter1 = 6 parameter2 = 3 END - END - - COPY ~iwdification/bam/cdia801a.bam~ ~override~ - ~iwdification/bam/cdia801b.bam~ ~override~ - ~iwdification/bam/cdia801c.bam~ ~override~ - ~iwdification/bam/cdidoorh.bam~ ~override~ - ~iwdification/bam/cdimsm1h.bam~ ~override~ - ~iwdification/bam/cdimsm1x.bam~ ~override~ - ~iwdification/bam/cdisalfi.bam~ ~override~ - ~iwdification/bam/cdisalfr.bam~ ~override~ - ~iwdification/spl/cdiphase.spl~ ~override~ - ~iwdification/vvc/cdidoorh.vvc~ ~override~ - ~iwdification/vvc/cdimsm1h.vvc~ ~override~ - ~iwdification/vvc/cdimsm1x.vvc~ ~override~ - ~iwdification/vvc/cdisalfi.vvc~ ~override~ - ~iwdification/vvc/cdisalfr.vvc~ ~override~ - - COPY ~iwdification/2da/cdimsum6.2da~ ~override~ - PATCH_IF !ee_game BEGIN// delete 2nd & 3rd columns for vanilla summon tables - REPLACE_TEXTUALLY ~[ %TAB%]+HitAnimation[ %TAB%]+AreaHitAnimation~ ~~ - REPLACE_TEXTUALLY ~[ %TAB%]+cdimsm1h[ %TAB%]+.+$~ ~~ - END - - ACTION_IF !ee_game BEGIN - - COPY ~iwdification/spl/cdifire6.spl~ ~override/cdifire0.spl~ - ~iwdification/spl/cdifros6.spl~ ~override/cdifros0.spl~ - WRITE_BYTE 0x7e 1 - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdisalau END - LPF DELETE_EFFECT END - LPF ADD_SPELL_EFFECT INT_VAR opcode = 146 target = 2 parameter2 = 1 timing = 1 STR_VAR resource = EVAL ~%SOURCE_RES%~ END - - COPY ~iwdification/eff/cdifire6.eff~ ~override/cdifire6.eff~ - ~iwdification/eff/cdifire6.eff~ ~override/cdifros6.eff~ - WRITE_ASCIIE 0x30 ~%DEST_RES%~ #8 - WRITE_ASCII 0x37 ~0~ #1 - - COPY_EXISTING ~cdisalfi.itm~ ~override~ - LPF ADD_ITEM_EQEFFECT INT_VAR opcode = 206 target = 1 timing = 2 STR_VAR resource = cdifire6 END - - COPY_EXISTING ~cdisalfr.itm~ ~override~ - LPF ADD_ITEM_EQEFFECT INT_VAR opcode = 206 target = 1 timing = 2 STR_VAR resource = cdifros6 END - - END - -END - -///// \\\\\ -///// WIZARD_MIND_BLANK \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_MIND_BLANK~) OR override_arcane) BEGIN - - LAF cd_new_portrait_icon INT_VAR string = RESOLVE_STR_REF(@3390) STR_VAR bam_file = cdia802d RET icon END - - ADD_SPELL ~iwdification/spl/cdia802.spl~ 2 8 WIZARD_MIND_BLANK - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3390 // name - SAY 0x50 @3391 // descript -// LPF ALTER_EFFECT STR_VAR match_resource = confush resource = cdiconfh END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 14102 parameter1 = string_held END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 17392 parameter1 = string_dcharmed END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 20568 parameter1 = string_mf_panic END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 35484 parameter1 = string_panic END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 35542 parameter1 = string_paralyzed END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 35544 parameter1 = string_dominated END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 35606 parameter1 = string_held END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 37603 parameter1 = string_rthinking END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 37604 parameter1 = string_confused END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 37605 parameter1 = string_berserk END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 37606 parameter1 = string_intoxicated END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 37801 parameter1 = string_charmed END - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 166 parameter2 = icon END - END ELSE BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 166 END - END - - COPY ~iwdification/itm/blank.itm~ ~override/cdia802.itm~ - SAY 0x0c @3390 - SAY 0x54 @3391 - LPF cd_scroll INT_VAR unusable1 = BIT5 target_hdr = 5 range = 1 target_eff = 1 price = 800 STR_VAR spell = EVAL ~%current_spell_res%~ END - - COPY ~iwdification/bam/cdia802a.bam~ ~override~ - ~iwdification/bam/cdia802b.bam~ ~override~ - ~iwdification/bam/cdia802c.bam~ ~override~ - ~iwdification/bam/cdia802d.bam~ ~override~ - ~iwdification/bam/cdiabjur.bam~ ~override~ - ~iwdification/vvc/cdiabjur.vvc~ ~override~ - ~iwdification/wav/cdiem02.wav~ ~override~ - -END - -///// \\\\\ -///// WIZARD_GREAT_SHOUT \\\\\ -///// \\\\\ - -ACTION_IF (ee_game AND (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_GREAT_SHOUT~) OR override_arcane)) BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdi319.pro~ - - ADD_SPELL ~iwdification/spl/cdia806.spl~ 2 8 WIZARD_GREAT_SHOUT - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3400 // name - SAY 0x50 @3401 // descript - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi319 END - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 37340 parameter1 = string_uncon END - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 35568 parameter1 = string_stunned END - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 14073 parameter1 = string_deafness END - PATCH_IF !ee_game BEGIN - LPF CD_SPLIT_SAVE_DAMAGE END - END - - COPY ~iwdification/itm/blank.itm~ ~override/cdia806.itm~ - SAY 0x0c @3400 - SAY 0x54 @3401 - LPF cd_scroll INT_VAR unusable1 = BIT1 target_hdr = 4 range = 22 opcode = 148 target_eff = 1 price = 2400 STR_VAR spell = EVAL ~%current_spell_res%~ END - - COPY ~iwdification/bam/cdia806a.bam~ ~override~ - ~iwdification/bam/cdia806b.bam~ ~override~ - ~iwdification/bam/cdia806c.bam~ ~override~ - ~iwdification/bam/cdigshou.bam~ ~override~ - ~iwdification/wav/cdiem101.wav~ ~override~ - ~iwdification/wav/cditra08.wav~ ~override~ - -END - -///// \\\\\ -///// WIZARD_IRON_BODY \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_IRON_BODY~) OR override_arcane) BEGIN - - LAF cd_new_portrait_icon INT_VAR string = RESOLVE_STR_REF(@3410) STR_VAR bam_file = cdia814d RET icon END - - ADD_SPELL ~iwdification/spl/cdia814.spl~ 2 8 WIZARD_IRON_BODY - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3410 // name - SAY 0x50 @3411 // descript - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 37607 parameter1 = string_poisoned END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 36317 parameter1 = string_poison END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 35593 parameter1 = string_diseased END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 39752 parameter1 = string_stricken END - LPF CLONE_EFFECT INT_VAR match_opcode = 206 STR_VAR match_resource = spwi502 resource = spin673 END - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT STR_VAR match_resource = cdia814 resource = EVAL ~%DEST_RES%~ END - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 172 parameter2 = icon END - LPF CLONE_EFFECT INT_VAR match_opcode = 206 opcode = 318 parameter2 = 0 STR_VAR match_resource = spwi502 resource = wand13 END - END ELSE BEGIN // move spell effects to 'paw' - READ_LONG 0x6a fx_off - SET fx_num = ((SOURCE_SIZE - fx_off) / 0x30) - READ_ASCII fx_off fx (fx_num * 0x30) - LPF DELETE_EFFECT END - LPF ADD_SPELL_EFFECT INT_VAR opcode = 111 target = 1 power = 8 duration = 120 STR_VAR resource = cdiibody END - LPF ADD_SPELL_EFFECT INT_VAR opcode = 174 target = 1 power = 8 timing = 1 STR_VAR resource = cdiem102 END - END - - COPY ~iwdification/itm/blank.itm~ ~override/cdia814.itm~ - SAY 0x0c @3410 - SAY 0x54 @3411 - LPF cd_scroll INT_VAR unusable2 = BIT6 target_hdr = 5 range = 1 target_eff = 1 price = 800 STR_VAR spell = EVAL ~%current_spell_res%~ END - - COPY ~iwdification/itm/cdiibody.itm~ ~override~ - SAY 0x08 @3412 - SAY 0x0c @3412 - PATCH_IF !ee_game BEGIN // move spell effects to 'paw' - READ_LONG 0x64 abil_off ELSE 0 - READ_SHORT 0x68 abil_num ELSE 0 - READ_LONG 0x6a fx_off - WRITE_SHORT 0x70 (THIS + fx_num) - FOR (index = 0 ; index < abil_num ; ++index) BEGIN // start iterating through abilities - WRITE_SHORT (abil_off + 0x20 + (0x28 * index)) (THIS + fx_num) - END - INSERT_BYTES fx_off (fx_num * 0x30) - WRITE_ASCIIE fx_off ~%fx%~ - PATCH_FOR_EACH op IN 321 111 174 BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = op END - END - LPF DELETE_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 172 END - LPF DELETE_EFFECT INT_VAR match_opcode = 1 multi_match = 1 END - LPF ALTER_EFFECT INT_VAR match_opcode = 318 opcode = 206 parameter1 = 0 END - LPF ALTER_EFFECT INT_VAR timing = 2 END - END - - COPY ~iwdification/bam/cdia814a.bam~ ~override~ - ~iwdification/bam/cdia814b.bam~ ~override~ - ~iwdification/bam/cdia814c.bam~ ~override~ - ~iwdification/bam/cdia814d.bam~ ~override~ - ~iwdification/bam/cdiibody.bam~ ~override~ - ~iwdification/wav/cdiem102.wav~ ~override~ - -END - -///// \\\\\ -///// WIZARD_MONSTER_SUMMONING_7 \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~WIZARD_MONSTER_SUMMONING_7~) OR override_arcane) BEGIN - - LAF cd_new_summon_table STR_VAR descript = "Monster_summoning_VII" 2da_file = cdimsum7 RET table END - - ADD_SPELL ~iwdification/spl/cdia901.spl~ 2 9 WIZARD_MONSTER_SUMMONING_7 - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @3420 // name - SAY 0x50 @3421 // descript - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 331 parameter2 = table END - END ELSE BEGIN - LPF CLONE_EFFECT INT_VAR match_opcode = 331 opcode = 215 parameter2 = 2 STR_VAR resource = cdimsm1h END - LPF CLONE_EFFECT INT_VAR match_opcode = 331 opcode = 127 parameter1 = 1 parameter2 = 0 probability1 = 49 dicesize = 0 dicenumber = 0 STR_VAR resource = cdimsum7 END - LPF ALTER_EFFECT INT_VAR match_opcode = 331 opcode = 127 parameter1 = 1 parameter2 = 0 dicesize = 0 dicenumber = 0 STR_VAR resource = cdimsum7 END - END - - COPY ~iwdification/itm/blank.itm~ ~override/cdia901.itm~ - SAY 0x0c @3420 - SAY 0x54 @3421 - LPF cd_scroll INT_VAR unusable1 = (BIT0 + BIT3) target_hdr = 4 range = 20 opcode = 148 target_eff = 1 price = 2700 STR_VAR spell = EVAL ~%current_spell_res%~ END - - ACTION_IF ee_game BEGIN // use iwdee gaze for ee games - - ADD_PROJECTILE ~iwdification/pro/cdi281.pro~ - - COMPILE ~iwdification/baf/cdiuhgaz.baf~ - - COPY ~iwdification/spl/cdiumbr1.spl~ ~override~ // gaze staging - COPY ~iwdification/spl/cdiumbr2.spl~ ~override~ // actual gaze - SAY 0xce @3273 - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi281 END - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 37604 parameter1 = string_confused END - - END ELSE BEGIN - - COPY_EXISTING ~umbhul01.bcs~ ~override/cdiuhgaz.bcs~ // use bg2 umber hulk scripting - DECOMPILE_AND_PATCH BEGIN - REPLACE_TEXTUALLY ~AreaCheck("AR1106")~ ~False()~ - END - - END - - LAF cd_animation STR_VAR code = eb20 END // 60192 MSKB skeleton_fiend - COPY ~iwdification/cre/cdi7bgrd.cre~ ~override~ - SAY 0x08 @3422 - SAY 0x0c @3422 - - LAF cd_animation STR_VAR code = e0d0 END // 57552 MUMB umber_hulk_elder - MUMB doubles with bg2 umber hulk - COPY ~iwdification/cre/cdi7umbh.cre~ ~override~ - SAY 0x08 @3272 - SAY 0x0c @3272 - WRITE_LONG 0x28 anim_uhulk - - COPY ~iwdification/itm/cdiumbhk.itm~ ~override~ - WRITE_LONG 0x08 string_attack - WRITE_LONG 0x0c string_attack - - COPY ~iwdification/bam/cdia901a.bam~ ~override~ - ~iwdification/bam/cdia901b.bam~ ~override~ - ~iwdification/bam/cdia901c.bam~ ~override~ - ~iwdification/bam/cdimsm1h.bam~ ~override~ - ~iwdification/bam/cdimsm1x.bam~ ~override~ - ~iwdification/vvc/cdimsm1h.vvc~ ~override~ - ~iwdification/vvc/cdimsm1x.vvc~ ~override~ - - COPY ~iwdification/2da/cdimsum7.2da~ ~override~ - PATCH_IF !ee_game BEGIN// delete 2nd & 3rd columns for vanilla summon tables - REPLACE_TEXTUALLY ~[ %TAB%]+HitAnimation[ %TAB%]+AreaHitAnimation~ ~~ - REPLACE_TEXTUALLY ~[ %TAB%]+cdimsm1h[ %TAB%]+.+$~ ~~ - END - -END - -///// \\\\\ -///// arcane spell crosspatching \\\\\ -///// \\\\\ - -OUTER_SET NUM_a411 = ((IDS_OF_SYMBOL (~spell~ ~WIZARD_EMOTION_HOPELESSNESS~)) - 2000) -OUTER_SET NUM_a422 = ((IDS_OF_SYMBOL (~spell~ ~WIZARD_BELTYNS_BURNING_BLOOD~)) - 2000) -OUTER_SET NUM_a427 = ((IDS_OF_SYMBOL (~spell~ ~WIZARD_EMOTION_COURAGE~)) - 2000) -OUTER_SET NUM_a428 = ((IDS_OF_SYMBOL (~spell~ ~WIZARD_EMOTION_FEAR~)) - 2000) -OUTER_SET NUM_a429 = ((IDS_OF_SYMBOL (~spell~ ~WIZARD_EMOTION_HOPE~)) - 2000) -OUTER_SET NUM_a431 = ((IDS_OF_SYMBOL (~spell~ ~WIZARD_SHOUT~)) - 2000) -OUTER_SET NUM_a432 = ((IDS_OF_SYMBOL (~spell~ ~WIZARD_VITRIOLIC_SPHERE~)) - 2000) -OUTER_SET NUM_a524 = ((IDS_OF_SYMBOL (~spell~ ~WIZARD_SHROUD_OF_FLAME~)) - 2000) -OUTER_SET NUM_a610 = ((IDS_OF_SYMBOL (~spell~ ~WIZARD_ANTIMAGIC_SHELL~)) - 2000) -OUTER_SET NUM_a631 = ((IDS_OF_SYMBOL (~spell~ ~WIZARD_SOUL_EATER~)) - 2000) -OUTER_SET NUM_a724 = ((IDS_OF_SYMBOL (~spell~ ~WIZARD_ACID_STORM~)) - 2000) -OUTER_SET NUM_a726 = ((IDS_OF_SYMBOL (~spell~ ~WIZARD_SUFFOCATE~)) - 2000) -OUTER_SET NUM_a814 = ((IDS_OF_SYMBOL (~spell~ ~WIZARD_IRON_BODY~)) - 2000) - -ACTION_IF ((NUM_a411 > 0) AND (NUM_a429 > 0)) BEGIN - - COPY_EXISTING ~spwi%NUM_a411%.spl~ ~override~ - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdia429 resource = EVAL ~spwi%NUM_a429%~ END - BUT_ONLY - - COPY_EXISTING ~spwi%NUM_a429%.spl~ ~override~ - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdia411 resource = EVAL ~spwi%NUM_a411%~ END - BUT_ONLY - -END - -ACTION_IF ((NUM_a427 > 0) AND (NUM_a428 > 0)) BEGIN - - COPY_EXISTING ~spwi%NUM_a427%.spl~ ~override~ - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdia428 resource = EVAL ~spwi%NUM_a428%~ END - BUT_ONLY - - COPY_EXISTING ~spwi%NUM_a428%.spl~ ~override~ - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdia427 resource = EVAL ~spwi%NUM_a427%~ END - BUT_ONLY - -END - -ACTION_IF NUM_a610 > 0 BEGIN - - COPY_EXISTING ~spwi%NUM_a610%.spl~ ~override~ - PATCH_IF NUM_a726 > 0 BEGIN - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdia726 resource = EVAL ~spwi%NUM_a726%~ END - END - PATCH_IF NUM_a724 > 0 BEGIN - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdia724 resource = EVAL ~spwi%NUM_a724%~ END - END - PATCH_IF NUM_a631 > 0 BEGIN - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdia631 resource = EVAL ~spwi%NUM_a631%~ END - END - PATCH_IF NUM_a524 > 0 BEGIN - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdia524 resource = EVAL ~spwi%NUM_a524%~ END - END - PATCH_IF NUM_a432 > 0 BEGIN - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdia432 resource = EVAL ~spwi%NUM_a432%~ END - END - BUT_ONLY - -END - -ACTION_IF NUM_a431 > 0 BEGIN - - COPY_EXISTING ~cdia725y.spl~ ~override~ - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdia431 resource = EVAL ~spwi%NUM_a431%~ END - BUT_ONLY IF_EXISTS - -END - -ACTION_IF NUM_a814 > 0 BEGIN - - COPY_EXISTING ~spwi%NUM_a814%.spl~ ~override~ - PATCH_IF NUM_a726 > 0 BEGIN - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdia726 resource = EVAL ~spwi%NUM_a726%~ END - END - PATCH_IF NUM_a422 > 0 BEGIN - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdia724 resource = EVAL ~spwi%NUM_a422%~ END - END - BUT_ONLY - -END - -ACTION_IF !ee_game BEGIN - - COPY_EXISTING ~cdidbone.bam~ ~override~ - ~cdideca.bam~ ~override~ - ~cdiibody.bam~ ~override~ - ~cdiltou.bam~ ~override~ - ~cdiplybb.bam~ ~override~ - ~cdiplypb.bam~ ~override~ - ~cdiplyww.bam~ ~override~ - ~cdismcud.bam~ ~override~ - READ_LONG 0x0c frame_off - WRITE_LONG frame_off + 0x04 0 - IF_EXISTS - -END - -///// \\\\\ -///// arcane-divine cross-patching \\\\\ -///// \\\\\ - -ACTION_IF MOD_IS_INSTALLED ~IWDIFICATION/SETUP-IWDIFICATION.TP2~ ~40~ THEN BEGIN - - INCLUDE ~iwdification/lib/cross_patch_both.tpa~ - -END - -///// \\\\\ -///// add scrolls to stores \\\\\ -///// \\\\\ - -COPY_EXISTING_REGEXP GLOB ~^[_h]ighhedg\.sto$~ ~override~ // adds lev 1, 2 scrolls to High Hedge - ~^_?sto0703\.sto$~ ~override~ // adds lev 1, 2 scrolls to Sorcerous Sundries - ~^bdsorcsc\.sto$~ ~override~ // adds lev 1, 2 scrolls to SoD Sorcerous Sundries - ~^bdbeleg3\.sto$~ ~override~ // adds lev 1, 2 scrolls to SoD Quartermaster - ~^bpding01\.sto$~ ~override~ // adds lev 1, 2 scrolls to Dinguer the Mad (Black Pits) - PATCH_IF FILE_EXISTS_IN_GAME cdia126.itm BEGIN ADD_STORE_ITEM ~cdia126~ AFTER ~scrl84 _scrl84~ #1 #0 #0 ~IDENTIFIED~ #2 END // expeditious retreat - PATCH_IF FILE_EXISTS_IN_GAME cdia204.itm BEGIN ADD_STORE_ITEM ~cdia204~ AFTER ~scrl89 _scrl89~ #1 #0 #0 ~IDENTIFIED~ #2 END // Snilloc's Snowball Swarm - PATCH_IF FILE_EXISTS_IN_GAME cdia216.itm BEGIN ADD_STORE_ITEM ~cdia216~ AFTER ~scrl89 _scrl89~ #1 #0 #0 ~IDENTIFIED~ #2 END // decastave - PATCH_IF FILE_EXISTS_IN_GAME cdia225.itm BEGIN ADD_STORE_ITEM ~cdia225~ AFTER ~scrl89 _scrl89~ #1 #0 #0 ~IDENTIFIED~ #2 END // cats grace - BUT_ONLY IF_EXISTS - -COPY_EXISTING_REGEXP GLOB ~^_?sto0703\.sto$~ ~override~ // adds lev 3, 4, 5 scrolls to Sorcerous Sundries - ~^bdsorcsc\.sto$~ ~override~ // adds lev 3, 4, 5 scrolls to SoD Sorcerous Sundries - ~^bdbeleg3\.sto$~ ~override~ // adds lev 3, 4, 5 scrolls to SoD Quartermaster - ~^bpding01\.sto$~ ~override~ // adds lev 3, 4, 5 scrolls to Dinguer the Mad (Black Pits) - PATCH_IF FILE_EXISTS_IN_GAME cdia327.itm BEGIN ADD_STORE_ITEM ~cdia327~ AFTER ~scrl1k _scrl1k~ #1 #0 #0 ~IDENTIFIED~ #2 END // Icelance - PATCH_IF FILE_EXISTS_IN_GAME cdia328.itm BEGIN ADD_STORE_ITEM ~cdia328~ AFTER ~scrl1k _scrl1k~ #1 #0 #0 ~IDENTIFIED~ #2 END // Lance of Disruption - PATCH_IF FILE_EXISTS_IN_GAME cdia422.itm BEGIN ADD_STORE_ITEM ~cdia422~ AFTER ~scrl5g _scrl5g~ #1 #0 #0 ~IDENTIFIED~ #2 END // Beltyn's Burning Blood - PATCH_IF FILE_EXISTS_IN_GAME cdia426.itm BEGIN ADD_STORE_ITEM ~cdia426~ AFTER ~scrl5g _scrl5g~ #1 #0 #0 ~IDENTIFIED~ #2 END // Shadow Monsters - PATCH_IF FILE_EXISTS_IN_GAME cdia427.itm BEGIN ADD_STORE_ITEM ~cdia427~ AFTER ~scrl5g _scrl5g~ #1 #0 #0 ~IDENTIFIED~ #2 END // Emotion: Courage - PATCH_IF FILE_EXISTS_IN_GAME cdia428.itm BEGIN ADD_STORE_ITEM ~cdia428~ AFTER ~scrl5g _scrl5g~ #1 #0 #0 ~IDENTIFIED~ #2 END // Emotion: Fear - PATCH_IF FILE_EXISTS_IN_GAME cdia429.itm BEGIN ADD_STORE_ITEM ~cdia429~ AFTER ~scrl5g _scrl5g~ #1 #0 #0 ~IDENTIFIED~ #2 END // Emotion: Hope - PATCH_IF FILE_EXISTS_IN_GAME cdia430.itm BEGIN ADD_STORE_ITEM ~cdia430~ AFTER ~scrl5g _scrl5g~ #1 #0 #0 ~IDENTIFIED~ #2 END // mordenkainen's force missiles - PATCH_IF FILE_EXISTS_IN_GAME cdia432.itm BEGIN ADD_STORE_ITEM ~cdia432~ AFTER ~scrl5g _scrl5g~ #1 #0 #0 ~IDENTIFIED~ #2 END // Vitriolic Sphere - PATCH_IF FILE_EXISTS_IN_GAME cdia524.itm BEGIN ADD_STORE_ITEM ~cdia524~ AFTER ~scrl5k _scrl5k~ #1 #0 #0 ~IDENTIFIED~ #1 END // shroud of flame - PATCH_IF FILE_EXISTS_IN_GAME cdia525.itm BEGIN ADD_STORE_ITEM ~cdia525~ AFTER ~scrl5k _scrl5k~ #1 #0 #0 ~IDENTIFIED~ #1 END // Demi-Shadow Monsters - PATCH_IF FILE_EXISTS_IN_GAME cdia526.itm BEGIN ADD_STORE_ITEM ~cdia526~ AFTER ~scrl5k _scrl5k~ #1 #0 #0 ~IDENTIFIED~ #1 END // Summon Shadow - PATCH_IF FILE_EXISTS_IN_GAME cdia528.itm BEGIN ADD_STORE_ITEM ~cdia528~ AFTER ~scrl5k _scrl5k~ #1 #0 #0 ~IDENTIFIED~ #1 END // contact other plane - PATCH_IF FILE_EXISTS_IN_GAME cdia533.itm BEGIN ADD_STORE_ITEM ~cdia533~ AFTER ~scrl5k _scrl5k~ #1 #0 #0 ~IDENTIFIED~ #1 END // Conjure water elemental - BUT_ONLY IF_EXISTS - -COPY_EXISTING ~25spell.sto~ ~override~ // arcana archives - ~25spell2.sto~ ~override~ // arcana archives - ~ohbmhsm.sto~ ~override~ // Book Merchant (BG2EE Black Pits 2) - ~ohnmhsm.sto~ ~override~ // Book Merchant (BG2EE Neera's Quest) - PATCH_IF FILE_EXISTS_IN_GAME cdia126.itm BEGIN ADD_STORE_ITEM ~cdia126~ AFTER ~scrl84~ #1 #0 #0 ~IDENTIFIED~ #2 END // expeditious retreat - PATCH_IF FILE_EXISTS_IN_GAME cdia204.itm BEGIN ADD_STORE_ITEM ~cdia204~ AFTER ~scrl93~ #1 #0 #0 ~IDENTIFIED~ #2 END // Snilloc's Snowball Swarm - PATCH_IF FILE_EXISTS_IN_GAME cdia216.itm BEGIN ADD_STORE_ITEM ~cdia216~ AFTER ~scrl93~ #1 #0 #0 ~IDENTIFIED~ #2 END // decastave - PATCH_IF FILE_EXISTS_IN_GAME cdia225.itm BEGIN ADD_STORE_ITEM ~cdia225~ AFTER ~scrl93~ #1 #0 #0 ~IDENTIFIED~ #2 END // cats grace - PATCH_IF FILE_EXISTS_IN_GAME cdia327.itm BEGIN ADD_STORE_ITEM ~cdia327~ AFTER ~scrl1e~ #1 #0 #0 ~IDENTIFIED~ #2 END // Icelance - PATCH_IF FILE_EXISTS_IN_GAME cdia328.itm BEGIN ADD_STORE_ITEM ~cdia328~ AFTER ~scrl1e~ #1 #0 #0 ~IDENTIFIED~ #2 END // Lance of Disruption - PATCH_IF FILE_EXISTS_IN_GAME cdia422.itm BEGIN ADD_STORE_ITEM ~cdia422~ AFTER ~scrl1y~ #1 #0 #0 ~IDENTIFIED~ #2 END // Beltyn's Burning Blood - PATCH_IF FILE_EXISTS_IN_GAME cdia426.itm BEGIN ADD_STORE_ITEM ~cdia426~ AFTER ~scrl1y~ #1 #0 #0 ~IDENTIFIED~ #2 END // Shadow Monsters - PATCH_IF FILE_EXISTS_IN_GAME cdia427.itm BEGIN ADD_STORE_ITEM ~cdia427~ AFTER ~scrl1y~ #1 #0 #0 ~IDENTIFIED~ #2 END // Emotion: Courage - PATCH_IF FILE_EXISTS_IN_GAME cdia428.itm BEGIN ADD_STORE_ITEM ~cdia428~ AFTER ~scrl1y~ #1 #0 #0 ~IDENTIFIED~ #2 END // Emotion: Fear - PATCH_IF FILE_EXISTS_IN_GAME cdia429.itm BEGIN ADD_STORE_ITEM ~cdia429~ AFTER ~scrl1y~ #1 #0 #0 ~IDENTIFIED~ #2 END // Emotion: Hope - PATCH_IF FILE_EXISTS_IN_GAME cdia430.itm BEGIN ADD_STORE_ITEM ~cdia430~ AFTER ~scrl1y~ #1 #0 #0 ~IDENTIFIED~ #2 END // mordenkainen's force missiles - PATCH_IF FILE_EXISTS_IN_GAME cdia432.itm BEGIN ADD_STORE_ITEM ~cdia432~ AFTER ~scrl1y~ #1 #0 #0 ~IDENTIFIED~ #2 END // Vitriolic Sphere - PATCH_IF FILE_EXISTS_IN_GAME cdia524.itm BEGIN ADD_STORE_ITEM ~cdia524~ AFTER ~scrl6v~ #1 #0 #0 ~IDENTIFIED~ #2 END // Shroud of Flame - PATCH_IF FILE_EXISTS_IN_GAME cdia525.itm BEGIN ADD_STORE_ITEM ~cdia525~ AFTER ~scrl6v~ #1 #0 #0 ~IDENTIFIED~ #2 END // Demi-Shadow Monsters - PATCH_IF FILE_EXISTS_IN_GAME cdia526.itm BEGIN ADD_STORE_ITEM ~cdia526~ AFTER ~scrl6v~ #1 #0 #0 ~IDENTIFIED~ #2 END // Summon Shadow - PATCH_IF FILE_EXISTS_IN_GAME cdia528.itm BEGIN ADD_STORE_ITEM ~cdia528~ AFTER ~scrl6v~ #1 #0 #0 ~IDENTIFIED~ #2 END // Contact Other Plane - PATCH_IF FILE_EXISTS_IN_GAME cdia533.itm BEGIN ADD_STORE_ITEM ~cdia533~ AFTER ~scrl6v~ #1 #0 #0 ~IDENTIFIED~ #2 END // Conjure water elemental - PATCH_IF FILE_EXISTS_IN_GAME cdia610.itm BEGIN ADD_STORE_ITEM ~cdia610~ AFTER ~scrl7p~ #1 #0 #0 ~IDENTIFIED~ #2 END // Antimagic Shell - PATCH_IF FILE_EXISTS_IN_GAME cdia626.itm BEGIN ADD_STORE_ITEM ~cdia626~ AFTER ~scrl7p~ #1 #0 #0 ~IDENTIFIED~ #2 END // Lich Touch - PATCH_IF FILE_EXISTS_IN_GAME cdia627.itm BEGIN ADD_STORE_ITEM ~cdia627~ AFTER ~scrl7p~ #1 #0 #0 ~IDENTIFIED~ #2 END // Monster Summoning IV - PATCH_IF FILE_EXISTS_IN_GAME cdia628.itm BEGIN ADD_STORE_ITEM ~cdia628~ AFTER ~scrl7p~ #1 #0 #0 ~IDENTIFIED~ #2 END // Otiluke's Freezing Sphere - PATCH_IF FILE_EXISTS_IN_GAME cdia629.itm BEGIN ADD_STORE_ITEM ~cdia629~ AFTER ~scrl7p~ #1 #0 #0 ~IDENTIFIED~ #2 END // Shades - PATCH_IF FILE_EXISTS_IN_GAME cdia630.itm BEGIN ADD_STORE_ITEM ~cdia630~ AFTER ~scrl7p~ #1 #0 #0 ~IDENTIFIED~ #2 END // Darts of Bone - PATCH_IF FILE_EXISTS_IN_GAME cdia631.itm BEGIN ADD_STORE_ITEM ~cdia631~ AFTER ~scrl7p~ #1 #0 #0 ~IDENTIFIED~ #2 END // soul eater - PATCH_IF FILE_EXISTS_IN_GAME cdia632.itm BEGIN ADD_STORE_ITEM ~cdia632~ AFTER ~scrl7p~ #1 #0 #0 ~IDENTIFIED~ #2 END // Trollish Fortitude - PATCH_IF FILE_EXISTS_IN_GAME cdia706.itm BEGIN ADD_STORE_ITEM ~cdia706~ AFTER ~scrl8p~ #1 #0 #0 ~IDENTIFIED~ #2 END // Monster Summoning V - PATCH_IF FILE_EXISTS_IN_GAME cdia709.itm BEGIN ADD_STORE_ITEM ~cdia709~ AFTER ~scrl8p~ #1 #0 #0 ~IDENTIFIED~ #2 END // Malavon's Rage - PATCH_IF FILE_EXISTS_IN_GAME cdia724.itm BEGIN ADD_STORE_ITEM ~cdia724~ AFTER ~scrl8p~ #1 #0 #0 ~IDENTIFIED~ #2 END // Acid Storm - PATCH_IF FILE_EXISTS_IN_GAME cdia725.itm BEGIN ADD_STORE_ITEM ~cdia725~ AFTER ~scrl8p~ #1 #0 #0 ~IDENTIFIED~ #2 END // seven eyes - PATCH_IF FILE_EXISTS_IN_GAME cdia726.itm BEGIN ADD_STORE_ITEM ~cdia726~ AFTER ~scrl8p~ #1 #0 #0 ~IDENTIFIED~ #2 END // Suffocate - PATCH_IF FILE_EXISTS_IN_GAME cdia801.itm BEGIN ADD_STORE_ITEM ~cdia801~ AFTER ~scrl8p~ #1 #0 #0 ~IDENTIFIED~ #2 END // Monster Summoning VI - PATCH_IF FILE_EXISTS_IN_GAME cdia802.itm BEGIN ADD_STORE_ITEM ~cdia802~ AFTER ~scrl8p~ #1 #0 #0 ~IDENTIFIED~ #2 END // Mind Blank - PATCH_IF FILE_EXISTS_IN_GAME cdia806.itm BEGIN ADD_STORE_ITEM ~cdia806~ AFTER ~scrl8p~ #1 #0 #0 ~IDENTIFIED~ #2 END // great shout - PATCH_IF FILE_EXISTS_IN_GAME cdia814.itm BEGIN ADD_STORE_ITEM ~cdia814~ AFTER ~scrl8p~ #1 #0 #0 ~IDENTIFIED~ #2 END // Iron Body - PATCH_IF FILE_EXISTS_IN_GAME cdia901.itm BEGIN ADD_STORE_ITEM ~cdia901~ AFTER ~scrlb4~ #1 #0 #0 ~IDENTIFIED~ #2 END // Monster Summoning VII - BUT_ONLY IF_EXISTS - -COPY_EXISTING ~scrolls.sto~ ~override~ // yuth - PATCH_IF FILE_EXISTS_IN_GAME cdia126.itm BEGIN ADD_STORE_ITEM ~cdia126~ AFTER ~scrl84~ #1 #0 #0 ~IDENTIFIED~ #2 END // expeditious retreat - PATCH_IF FILE_EXISTS_IN_GAME cdia204.itm BEGIN ADD_STORE_ITEM ~cdia204~ AFTER ~scrl93~ #1 #0 #0 ~IDENTIFIED~ #2 END // Snilloc's Snowball Swarm - PATCH_IF FILE_EXISTS_IN_GAME cdia216.itm BEGIN ADD_STORE_ITEM ~cdia216~ AFTER ~scrl93~ #1 #0 #0 ~IDENTIFIED~ #2 END // decastave - PATCH_IF FILE_EXISTS_IN_GAME cdia225.itm BEGIN ADD_STORE_ITEM ~cdia225~ AFTER ~scrl93~ #1 #0 #0 ~IDENTIFIED~ #2 END // cats grace - PATCH_IF FILE_EXISTS_IN_GAME cdia327.itm BEGIN ADD_STORE_ITEM ~cdia327~ AFTER ~scrl1e~ #1 #0 #0 ~IDENTIFIED~ #2 END // Icelance - PATCH_IF FILE_EXISTS_IN_GAME cdia328.itm BEGIN ADD_STORE_ITEM ~cdia328~ AFTER ~scrl1e~ #1 #0 #0 ~IDENTIFIED~ #2 END // Lance of Disruption - PATCH_IF FILE_EXISTS_IN_GAME cdia422.itm BEGIN ADD_STORE_ITEM ~cdia422~ AFTER ~scrl1y~ #1 #0 #0 ~IDENTIFIED~ #3 END // Beltyn's Burning Blood - PATCH_IF FILE_EXISTS_IN_GAME cdia426.itm BEGIN ADD_STORE_ITEM ~cdia426~ AFTER ~scrl1y~ #1 #0 #0 ~IDENTIFIED~ #2 END // Shadow Monsters - PATCH_IF FILE_EXISTS_IN_GAME cdia427.itm BEGIN ADD_STORE_ITEM ~cdia427~ AFTER ~scrl1y~ #1 #0 #0 ~IDENTIFIED~ #2 END // Emotion: Courage - PATCH_IF FILE_EXISTS_IN_GAME cdia428.itm BEGIN ADD_STORE_ITEM ~cdia428~ AFTER ~scrl1y~ #1 #0 #0 ~IDENTIFIED~ #2 END // Emotion: Fear - PATCH_IF FILE_EXISTS_IN_GAME cdia429.itm BEGIN ADD_STORE_ITEM ~cdia429~ AFTER ~scrl1y~ #1 #0 #0 ~IDENTIFIED~ #2 END // Emotion: Hope - PATCH_IF FILE_EXISTS_IN_GAME cdia430.itm BEGIN ADD_STORE_ITEM ~cdia430~ AFTER ~scrl1y~ #1 #0 #0 ~IDENTIFIED~ #2 END // mordenkainen's force missiles - PATCH_IF FILE_EXISTS_IN_GAME cdia432.itm BEGIN ADD_STORE_ITEM ~cdia432~ AFTER ~scrl1y~ #1 #0 #0 ~IDENTIFIED~ #2 END // Vitriolic Sphere - PATCH_IF FILE_EXISTS_IN_GAME cdia524.itm BEGIN ADD_STORE_ITEM ~cdia524~ AFTER ~scrl6v~ #1 #0 #0 ~IDENTIFIED~ #4 END // Shroud of Flame - PATCH_IF FILE_EXISTS_IN_GAME cdia525.itm BEGIN ADD_STORE_ITEM ~cdia525~ AFTER ~scrl6v~ #1 #0 #0 ~IDENTIFIED~ #3 END // Demi-Shadow Monsters - PATCH_IF FILE_EXISTS_IN_GAME cdia526.itm BEGIN ADD_STORE_ITEM ~cdia526~ AFTER ~scrl6v~ #1 #0 #0 ~IDENTIFIED~ #2 END // Summon Shadow - PATCH_IF FILE_EXISTS_IN_GAME cdia528.itm BEGIN ADD_STORE_ITEM ~cdia528~ AFTER ~scrl6v~ #1 #0 #0 ~IDENTIFIED~ #2 END // Contact Other Plane - PATCH_IF FILE_EXISTS_IN_GAME cdia533.itm BEGIN ADD_STORE_ITEM ~cdia533~ AFTER ~scrl6v~ #1 #0 #0 ~IDENTIFIED~ #2 END // Conjure water elemental - PATCH_IF FILE_EXISTS_IN_GAME cdia610.itm BEGIN ADD_STORE_ITEM ~cdia610~ AFTER ~scrlal~ #1 #0 #0 ~IDENTIFIED~ #2 END // Antimagic Shell - PATCH_IF FILE_EXISTS_IN_GAME cdia626.itm BEGIN ADD_STORE_ITEM ~cdia626~ AFTER ~scrlal~ #1 #0 #0 ~IDENTIFIED~ #2 END // Lich Touch - PATCH_IF FILE_EXISTS_IN_GAME cdia627.itm BEGIN ADD_STORE_ITEM ~cdia627~ AFTER ~scrlal~ #1 #0 #0 ~IDENTIFIED~ #2 END // Monster Summoning IV - PATCH_IF FILE_EXISTS_IN_GAME cdia628.itm BEGIN ADD_STORE_ITEM ~cdia628~ AFTER ~scrlal~ #1 #0 #0 ~IDENTIFIED~ #3 END // Otiluke's Freezing Sphere - PATCH_IF FILE_EXISTS_IN_GAME cdia629.itm BEGIN ADD_STORE_ITEM ~cdia629~ AFTER ~scrlal~ #1 #0 #0 ~IDENTIFIED~ #2 END // Shades - PATCH_IF FILE_EXISTS_IN_GAME cdia630.itm BEGIN ADD_STORE_ITEM ~cdia630~ AFTER ~scrlal~ #1 #0 #0 ~IDENTIFIED~ #3 END // Darts of Bone - PATCH_IF FILE_EXISTS_IN_GAME cdia631.itm BEGIN ADD_STORE_ITEM ~cdia631~ AFTER ~scrlal~ #1 #0 #0 ~IDENTIFIED~ #2 END // soul eater - PATCH_IF FILE_EXISTS_IN_GAME cdia632.itm BEGIN ADD_STORE_ITEM ~cdia632~ AFTER ~scrlal~ #1 #0 #0 ~IDENTIFIED~ #2 END // Trollish Fortitude - PATCH_IF FILE_EXISTS_IN_GAME cdia706.itm BEGIN ADD_STORE_ITEM ~cdia706~ AFTER ~scrlal~ #1 #0 #0 ~IDENTIFIED~ #2 END // Monster Summoning V - PATCH_IF FILE_EXISTS_IN_GAME cdia709.itm BEGIN ADD_STORE_ITEM ~cdia709~ AFTER ~scrlal~ #1 #0 #0 ~IDENTIFIED~ #2 END // Malavon's Rage - PATCH_IF FILE_EXISTS_IN_GAME cdia724.itm BEGIN ADD_STORE_ITEM ~cdia724~ AFTER ~scrlal~ #1 #0 #0 ~IDENTIFIED~ #3 END // Acid Storm - PATCH_IF FILE_EXISTS_IN_GAME cdia725.itm BEGIN ADD_STORE_ITEM ~cdia725~ AFTER ~scrlal~ #1 #0 #0 ~IDENTIFIED~ #2 END // seven eyes - PATCH_IF FILE_EXISTS_IN_GAME cdia726.itm BEGIN ADD_STORE_ITEM ~cdia726~ AFTER ~scrlal~ #1 #0 #0 ~IDENTIFIED~ #2 END // Suffocate - PATCH_IF FILE_EXISTS_IN_GAME cdia901.itm BEGIN ADD_STORE_ITEM ~cdia901~ AFTER ~scrlan~ #1 #0 #0 ~IDENTIFIED~ #2 END // Monster Summoning VII - PATCH_IF FILE_EXISTS_IN_GAME cdia801.itm BEGIN ADD_STORE_ITEM ~cdia801~ AFTER ~scrlan~ #1 #0 #0 ~IDENTIFIED~ #2 END // Monster Summoning VI - PATCH_IF FILE_EXISTS_IN_GAME cdia802.itm BEGIN ADD_STORE_ITEM ~cdia802~ AFTER ~scrlan~ #1 #0 #0 ~IDENTIFIED~ #3 END // Mind Blank - PATCH_IF FILE_EXISTS_IN_GAME cdia806.itm BEGIN ADD_STORE_ITEM ~cdia806~ AFTER ~scrlan~ #1 #0 #0 ~IDENTIFIED~ #2 END // great shout - PATCH_IF FILE_EXISTS_IN_GAME cdia814.itm BEGIN ADD_STORE_ITEM ~cdia814~ AFTER ~scrlan~ #1 #0 #0 ~IDENTIFIED~ #2 END // Iron Body - BUT_ONLY IF_EXISTS - -COPY_EXISTING ~shop08.sto~ ~override~ // galoomp - PATCH_IF FILE_EXISTS_IN_GAME cdia126.itm BEGIN ADD_STORE_ITEM ~cdia126~ AFTER ~scrl84~ #1 #0 #0 ~IDENTIFIED~ #2 END // expeditious retreat - PATCH_IF FILE_EXISTS_IN_GAME cdia204.itm BEGIN ADD_STORE_ITEM ~cdia204~ AFTER ~scrl93~ #1 #0 #0 ~IDENTIFIED~ #4 END // Snilloc's Snowball Swarm - PATCH_IF FILE_EXISTS_IN_GAME cdia216.itm BEGIN ADD_STORE_ITEM ~cdia216~ AFTER ~scrl93~ #1 #0 #0 ~IDENTIFIED~ #2 END // decastave - PATCH_IF FILE_EXISTS_IN_GAME cdia225.itm BEGIN ADD_STORE_ITEM ~cdia225~ AFTER ~scrl93~ #1 #0 #0 ~IDENTIFIED~ #2 END // cats grace - PATCH_IF FILE_EXISTS_IN_GAME cdia327.itm BEGIN ADD_STORE_ITEM ~cdia327~ AFTER ~scrl1e~ #1 #0 #0 ~IDENTIFIED~ #2 END // Icelance - PATCH_IF FILE_EXISTS_IN_GAME cdia328.itm BEGIN ADD_STORE_ITEM ~cdia328~ AFTER ~scrl1e~ #1 #0 #0 ~IDENTIFIED~ #2 END // Lance of Disruption - PATCH_IF FILE_EXISTS_IN_GAME cdia422.itm BEGIN ADD_STORE_ITEM ~cdia422~ AFTER ~scrl5m~ #1 #0 #0 ~IDENTIFIED~ #2 END // Beltyn's Burning Blood - PATCH_IF FILE_EXISTS_IN_GAME cdia426.itm BEGIN ADD_STORE_ITEM ~cdia426~ AFTER ~scrl5m~ #1 #0 #0 ~IDENTIFIED~ #3 END // Shadow Monsters - PATCH_IF FILE_EXISTS_IN_GAME cdia427.itm BEGIN ADD_STORE_ITEM ~cdia427~ AFTER ~scrl5m~ #1 #0 #0 ~IDENTIFIED~ #2 END // Emotion: Courage - PATCH_IF FILE_EXISTS_IN_GAME cdia428.itm BEGIN ADD_STORE_ITEM ~cdia428~ AFTER ~scrl5m~ #1 #0 #0 ~IDENTIFIED~ #2 END // Emotion: Fear - PATCH_IF FILE_EXISTS_IN_GAME cdia429.itm BEGIN ADD_STORE_ITEM ~cdia429~ AFTER ~scrl5m~ #1 #0 #0 ~IDENTIFIED~ #2 END // Emotion: Hope - PATCH_IF FILE_EXISTS_IN_GAME cdia430.itm BEGIN ADD_STORE_ITEM ~cdia430~ AFTER ~scrl5m~ #1 #0 #0 ~IDENTIFIED~ #2 END // mordenkainen's force missiles - PATCH_IF FILE_EXISTS_IN_GAME cdia432.itm BEGIN ADD_STORE_ITEM ~cdia432~ AFTER ~scrl5m~ #1 #0 #0 ~IDENTIFIED~ #3 END // Vitriolic Sphere - PATCH_IF FILE_EXISTS_IN_GAME cdia524.itm BEGIN ADD_STORE_ITEM ~cdia524~ AFTER ~scrl2f~ #1 #0 #0 ~IDENTIFIED~ #3 END // Shroud of Flame - PATCH_IF FILE_EXISTS_IN_GAME cdia525.itm BEGIN ADD_STORE_ITEM ~cdia525~ AFTER ~scrl2f~ #1 #0 #0 ~IDENTIFIED~ #2 END // Demi-Shadow Monsters - PATCH_IF FILE_EXISTS_IN_GAME cdia526.itm BEGIN ADD_STORE_ITEM ~cdia526~ AFTER ~scrl2f~ #1 #0 #0 ~IDENTIFIED~ #2 END // Summon Shadow - PATCH_IF FILE_EXISTS_IN_GAME cdia528.itm BEGIN ADD_STORE_ITEM ~cdia528~ AFTER ~scrl2f~ #1 #0 #0 ~IDENTIFIED~ #1 END // Contact Other Plane - PATCH_IF FILE_EXISTS_IN_GAME cdia533.itm BEGIN ADD_STORE_ITEM ~cdia533~ AFTER ~scrl2f~ #1 #0 #0 ~IDENTIFIED~ #2 END // Conjure water elemental - BUT_ONLY IF_EXISTS - -/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ -/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ -///// \\\\\ -///// IWD divine spell pack \\\\\ -///// \\\\\ -/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ -/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ - -BEGIN @4000 DESIGNATED 40 - -INCLUDE ~iwdification/lib/spell_prep.tpa~ - -///// \\\\\ -///// CLERIC_CURSE \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_CURSE~) OR override_divine) BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdi237.pro~ - - ADD_SPELL ~iwdification/spl/cdid112.spl~ 1 1 CLERIC_CURSE - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4010 // name - SAY 0x50 @4011 // descript - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 14406 parameter1 = string_cursed END - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi237 END - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT STR_VAR match_resource = cdid112 resource = EVAL ~%DEST_RES%~ END - END ELSE BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 321 END - LPF CLONE_EFFECT INT_VAR match_opcode = 54 opcode = 206 parameter1 = 0 parameter2 = 0 STR_VAR insert = last resource = EVAL ~%DEST_RES%~ END - END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid112.itm~ - SAY 0x0c @4010 - SAY 0x54 @4011 - LPF cd_scroll INT_VAR target_hdr = 4 range = 40 opcode = 148 target_eff = 1 price = 100 STR_VAR spell = EVAL ~%current_spell_res%~ END - - COPY ~iwdification/bam/cdid112a.bam~ ~override~ - ~iwdification/bam/cdid112b.bam~ ~override~ - ~iwdification/bam/cdid112c.bam~ ~override~ - ~iwdification/bam/cdiare1x.bam~ ~override~ - ~iwdification/bam/cdicurse.bam~ ~override~ - ~iwdification/vvc/cdibless.vvc~ ~override~ - ~iwdification/vvc/cdicurse.vvc~ ~override~ - ~iwdification/wav/cdiee04.wav~ ~override~ - ~iwdification/wav/cdiep32.wav~ ~override~ - ~iwdification/wav/cdiep99.wav~ ~override~ - -END - -///// \\\\\ -///// CLERIC_CAUSE_LIGHT_WOUNDS \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_CAUSE_LIGHT_WOUNDS~) OR override_divine) BEGIN - - ADD_SPELL ~iwdification/spl/cdid114.spl~ 1 1 CLERIC_CAUSE_LIGHT_WOUNDS - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4020 // name - SAY 0x50 @4021 // descript - LPF ALTER_EFFECT STR_VAR match_resource = cdid114 resource = EVAL ~%DEST_RES%~ END - PATCH_IF !ee_game BEGIN - LPF CLONE_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 144 parameter2 = 4 STR_VAR resource = cdixd114 END // race = golem - LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 4 parameter2 = 3 STR_VAR resource = cdixd114 END // general = undead - LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 104 opcode = 177 parameter2 = 4 STR_VAR resource = cdixd114 END // race = parameter1 - END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid114.itm~ - SAY 0x0c @4020 - SAY 0x54 @4021 - LPF cd_scroll INT_VAR unusable0 = (BIT2 + BIT12 + BIT21 + BIT30) range = 1 price = 100 STR_VAR spell = EVAL ~%current_spell_res%~ END // non-good, cleric - - COPY ~iwdification/bam/cdid114a.bam~ ~override~ - ~iwdification/bam/cdid114b.bam~ ~override~ - ~iwdification/bam/cdid114c.bam~ ~override~ - ~iwdification/bam/cdicldam.bam~ ~override~ - ~iwdification/vvc/cdicldam.vvc~ ~override~ - ~iwdification/wav/cdiem103.wav~ ~override~ - - ACTION_IF !ee_game BEGIN - - COPY ~iwdification/eff/immunity.eff~ ~override/cdixd114.eff~ - WRITE_ASCIIE 0x30 ~%current_spell_res%~ #8 - - END - -END - -///// \\\\\ -///// CLERIC_SUNSCORCH \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_SUNSCORCH~) OR override_divine) BEGIN - - ACTION_IF ee_game BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdisunsc.pro~ - - END - - ADD_SPELL ~iwdification/spl/cdid115.spl~ 1 1 CLERIC_SUNSCORCH - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4030 // name - SAY 0x50 @4031 // descript - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 37800 parameter1 = string_blinded END - PATCH_IF ee_game BEGIN - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdisunsc END - END ELSE BEGIN - LPF CLONE_EFFECT INT_VAR match_opcode = 326 opcode = 177 parameter1 = 4 parameter2 = 3 END // general = undead - LPF ALTER_EFFECT INT_VAR match_opcode = 326 opcode = 177 parameter1 = 164 parameter2 = 4 END // race = myconid - READ_SHORT 0x68 abil_num - FOR (index = 0 ; index < abil_num ; ++index) BEGIN - LPF ALTER_EFFECT INT_VAR header = index match_opcode = 12 parameter1 = ((index + 1) / 2) dicesize = 3 special = 0 END - LPF CLONE_EFFECT INT_VAR header = index match_opcode = 12 parameter1 = ((index + 0) / 2) savingthrow = 0 END - END - PATCH_FOR_EACH res IN cdid1151 cdid1152 cdid1153 cdid1154 BEGIN - LPF ADD_SPELL_EFFECT INT_VAR opcode = 215 target = 2 power = 1 timing = 1 resist_dispel = 3 STR_VAR resource = EVAL ~%res%~ END - END - END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid115.itm~ - SAY 0x0c @4030 - SAY 0x54 @4031 - LPF cd_scroll INT_VAR unusable0 = (BIT7 + BIT8 + BIT9 + BIT14 + BIT15 + BIT20 + BIT29) range = 100 price = 100 STR_VAR spell = EVAL ~%current_spell_res%~ END // druid - - COPY ~iwdification/bam/cdid115a.bam~ ~override~ - ~iwdification/bam/cdid115b.bam~ ~override~ - ~iwdification/bam/cdid115c.bam~ ~override~ - ~iwdification/bam/cdisunsc.bam~ ~override~ - ~iwdification/spl/cdid115d.spl~ ~override~ - ~iwdification/wav/cdiep39.wav~ ~override~ - - ACTION_IF ee_game BEGIN - - COPY ~iwdification/vvc/cdisunsc.vvc~ ~override~ - - END ELSE BEGIN - - COPY ~iwdification/vvc/cdid1151.vvc~ ~override~ - ~iwdification/vvc/cdid1152.vvc~ ~override~ - ~iwdification/vvc/cdid1153.vvc~ ~override~ - ~iwdification/vvc/cdid1154.vvc~ ~override~ - - COPY ~iwdification/eff/326.eff~ ~override/cdid115d.eff~ - WRITE_ASCII 0x30 ~cdid115d~ - - END - -END - -///// \\\\\ -///// CLERIC_CURE_MODERATE_WOUNDS \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_CURE_MODERATE_WOUNDS~) OR override_divine) BEGIN - - ADD_SPELL ~iwdification/spl/cdid217.spl~ 1 2 CLERIC_CURE_MODERATE_WOUNDS - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4040 // name - SAY 0x50 @4041 // descript - LPF ALTER_EFFECT STR_VAR match_resource = cdid217 resource = EVAL ~%DEST_RES%~ END - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 14022 parameter1 = string_healed END - PATCH_IF !ee_game BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 61 END - LPF CLONE_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 144 parameter2 = 4 STR_VAR resource = cdixd114 END // race = golem - LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 4 parameter2 = 3 STR_VAR resource = cdixd114 END // general = undead - LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 104 opcode = 177 parameter2 = 4 STR_VAR resource = cdixd114 END // race = parameter1 - END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid217.itm~ - SAY 0x0c @4040 - SAY 0x54 @4041 - LPF cd_scroll INT_VAR range = 1 price = 200 STR_VAR spell = EVAL ~%current_spell_res%~ END - - COPY ~iwdification/bam/cdid217a.bam~ ~override~ - ~iwdification/bam/cdid217b.bam~ ~override~ - ~iwdification/bam/cdid217c.bam~ ~override~ - ~iwdification/bam/cdicmwou.bam~ ~override~ - ~iwdification/vvc/cdicmwou.vvc~ ~override~ - ~iwdification/wav/cdiep26.wav~ ~override~ - - // add as option to temples that offer cure light wounds - OUTER_SET desc = RESOLVE_STR_REF(@4042) - APPEND ~speldesc.2da~ ~sppr217 %desc%~ - COPY_EXISTING_REGEXP GLOB ~^.+\.sto$~ ~override~ - READ_LONG 0x70 cure_off - READ_LONG 0x74 cure_num - SET insert_cost = 0 - SET insert_off = 0 - FOR (index = 0 ; index < cure_num ; ++index) BEGIN - READ_ASCII (cure_off + (index * 0x0c)) spell - PATCH_IF ("%spell%" STRING_COMPARE_REGEXP "sppr1[0-9][0-9]" = 0) BEGIN - SET insert_off = (cure_off + ((index + 1) * 0x0c)) - PATCH_IF ("%spell%" STRING_COMPARE_CASE "sppr103" = 0) BEGIN - READ_LONG (cure_off + 0x08 + (index * 0x0c)) insert_cost - END - END - END - PATCH_IF insert_off AND insert_cost BEGIN - INSERT_BYTES (insert_off ) 0x0c - WRITE_ASCIIE (insert_off ) ~%current_spell_res%~ #8 - WRITE_LONG (insert_off + 0x08) (insert_cost * 2) - WRITE_LONG 0x74 (THIS + 1) - PATCH_FOR_EACH off IN 0x2c 0x34 0x4c BEGIN // item, sale, drink offsets - READ_LONG off val // read offset - PATCH_IF val > cure_off BEGIN // if after cure list... - WRITE_LONG off (THIS + 0x0c) // push back for new cure - END - END - END - BUT_ONLY - -END - -///// \\\\\ -///// CLERIC_ALICORN_LANCE \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_ALICORN_LANCE~) OR override_divine) BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdi298.pro~ - - ADD_SPELL ~iwdification/spl/cdid218.spl~ 1 2 CLERIC_ALICORN_LANCE - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4050 // name - SAY 0x50 @4051 // descript - SAY 0x2ae @4052 - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi298 END - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT STR_VAR match_resource = cdid218 resource = EVAL ~%DEST_RES%~ END - END ELSE BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 321 END - LPF CD_SPLIT_SAVE_DAMAGE END - END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid218.itm~ - SAY 0x0c @4050 - SAY 0x54 @4051 - LPF cd_scroll INT_VAR unusable0 = (BIT7 + BIT8 + BIT9 + BIT14 + BIT15 + BIT20 + BIT29) range = 100 price = 200 STR_VAR spell = EVAL ~%current_spell_res%~ END // druid - - COPY ~iwdification/bam/cdid218a.bam~ ~override~ - ~iwdification/bam/cdid218b.bam~ ~override~ - ~iwdification/bam/cdid218c.bam~ ~override~ - ~iwdification/bam/cdilanct.bam~ ~override~ - ~iwdification/wav/cdiee08.wav~ ~override~ - ~iwdification/wav/cditra57.wav~ ~override~ - -END - -///// \\\\\ -///// CLERIC_BEAST_CLAW \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_BEAST_CLAW~) OR override_divine) BEGIN - - ADD_SPELL ~iwdification/spl/cdid219.spl~ 1 2 CLERIC_BEAST_CLAW - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4060 // name - SAY 0x50 @4061 // descript - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid219.itm~ - SAY 0x0c @4060 - SAY 0x54 @4061 - LPF cd_scroll INT_VAR unusable0 = (BIT7 + BIT8 + BIT9 + BIT14 + BIT15 + BIT20 + BIT29) target_hdr = 5 range = 1 price = 200 STR_VAR spell = EVAL ~%current_spell_res%~ END - - COPY ~iwdification/itm/cdibclaw.itm~ ~override~ - SAY 0x08 @4060 - SAY 0x0c @4060 - - COPY ~iwdification/bam/cdid219a.bam~ ~override~ - ~iwdification/bam/cdid219b.bam~ ~override~ - ~iwdification/bam/cdid219c.bam~ ~override~ - ~iwdification/bam/cdialter.bam~ ~override~ - ~iwdification/bam/cdibclaw.bam~ ~override~ - ~iwdification/vvc/cdialter.vvc~ ~override~ - ~iwdification/wav/cdiep07.wav~ ~override~ - -END - -///// \\\\\ -///// CLERIC_CAUSE_MODERATE_WOUNDS \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_CAUSE_MODERATE_WOUNDS~) OR override_divine) BEGIN - - ADD_SPELL ~iwdification/spl/cdid220.spl~ 1 2 CLERIC_CAUSE_MODERATE_WOUNDS - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4070 // name - SAY 0x50 @4071 // descript - LPF ALTER_EFFECT STR_VAR match_resource = cdid220 resource = EVAL ~%DEST_RES%~ END - PATCH_IF !ee_game BEGIN - LPF CLONE_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 144 parameter2 = 4 STR_VAR resource = cdixd220 END // race = golem - LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 4 parameter2 = 3 STR_VAR resource = cdixd220 END // general = undead - LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 104 opcode = 177 parameter2 = 4 STR_VAR resource = cdixd220 END // race = parameter1 - LPF CD_SPLIT_SAVE_DAMAGE END - END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid220.itm~ - SAY 0x0c @4070 - SAY 0x54 @4071 - LPF cd_scroll INT_VAR unusable0 = (BIT2 + BIT12 + BIT21 + BIT30) range = 1 price = 200 STR_VAR spell = EVAL ~%current_spell_res%~ END // non-good cleric - - COPY ~iwdification/bam/cdid220a.bam~ ~override~ - ~iwdification/bam/cdid220b.bam~ ~override~ - ~iwdification/bam/cdid220c.bam~ ~override~ - ~iwdification/bam/cdicmdam.bam~ ~override~ - ~iwdification/vvc/cdicmdam.vvc~ ~override~ - ~iwdification/wav/cdiem103.wav~ ~override~ - - ACTION_IF !ee_game BEGIN - - COPY ~iwdification/eff/immunity.eff~ ~override/cdixd220.eff~ - WRITE_ASCIIE 0x30 ~%current_spell_res%~ #8 - - END - -END - -///// \\\\\ -///// CLERIC_PRAYER \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_PRAYER~) OR override_divine) BEGIN - - LAF cd_new_portrait_icon INT_VAR string = RESOLVE_STR_REF(@4080) STR_VAR bam_file = cdid316d RET icon END - - ADD_PROJECTILE ~iwdification/pro/cdivrnp.pro~ - ADD_PROJECTILE ~iwdification/pro/cdivrpo.pro~ - - ADD_SPELL ~iwdification/spl/cdid316.spl~ 1 3 CLERIC_PRAYER - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4080 // name - SAY 0x50 @4081 // descript - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid316.itm~ - SAY 0x0c @4080 - SAY 0x54 @4081 - LPF cd_scroll INT_VAR unusable0 = (BIT12 + BIT21 + BIT30) target_hdr = 5 range = 40 price = 300 STR_VAR spell = EVAL ~%current_spell_res%~ END // cleric - - COPY ~iwdification/spl/cdid316b.spl~ ~override~ - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdivrnp END - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 40257 parameter1 = RESOLVE_STR_REF(@4082) END - PATCH_IF !ee_game BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 321 END - LPF CLONE_EFFECT INT_VAR match_opcode = 54 opcode = 206 parameter1 = 0 parameter2 = 0 STR_VAR insert = last resource = cdid316b END - LPF CD_CONVERT_9_255 END - END - - COPY ~iwdification/spl/cdid316g.spl~ ~override~ - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdivrpo END - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 40256 parameter1 = RESOLVE_STR_REF(@4083) END - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 183 parameter2 = icon END - END ELSE BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 321 END - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 183 parameter2 = 18 END - LPF CLONE_EFFECT INT_VAR match_opcode = 54 opcode = 206 parameter1 = 0 parameter2 = 0 STR_VAR insert = last resource = cdid316g END - LPF CD_CONVERT_9_255 END - END - - COPY ~iwdification/bam/cdid316a.bam~ ~override~ - ~iwdification/bam/cdid316b.bam~ ~override~ - ~iwdification/bam/cdid316c.bam~ ~override~ - ~iwdification/bam/cdid316d.bam~ ~override~ - ~iwdification/bam/cdiprayh.bam~ ~override~ - ~iwdification/vvc/cdiprayg.vvc~ ~override~ - ~iwdification/vvc/cdiprayh.vvc~ ~override~ - ~iwdification/wav/cdiep31.wav~ ~override~ - -END - -///// \\\\\ -///// CLERIC_CAUSE_DISEASE \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_CAUSE_DISEASE~) OR override_divine) BEGIN - - ADD_SPELL ~iwdification/spl/cdid320.spl~ 1 3 CLERIC_CAUSE_DISEASE - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4090 // name - SAY 0x50 @4091 // descript - LPF ALTER_EFFECT STR_VAR match_resource = cdid320 resource = EVAL ~%DEST_RES%~ END - PATCH_IF !ee_game BEGIN - LPF CLONE_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 144 parameter2 = 4 STR_VAR resource = cdixd320 END // race = golem - LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 4 parameter2 = 3 STR_VAR resource = cdixd320 END // general = undead - LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 104 opcode = 177 parameter2 = 4 STR_VAR resource = cdixd320 END // race = parameter1 - END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid320.itm~ - SAY 0x0c @4090 - SAY 0x54 @4091 - LPF cd_scroll INT_VAR unusable0 = (BIT2 + BIT12 + BIT21 + BIT30) range = 1 price = 300 STR_VAR spell = EVAL ~%current_spell_res%~ END // non-good cleric - - COPY ~iwdification/bam/cdid320a.bam~ ~override~ - ~iwdification/bam/cdid320b.bam~ ~override~ - ~iwdification/bam/cdid320c.bam~ ~override~ - ~iwdification/bam/cdidise.bam~ ~override~ - ~iwdification/vvc/cdidise.vvc~ ~override~ - ~iwdification/wav/cdiep108.wav~ ~override~ - - ACTION_IF !ee_game BEGIN - - COPY ~iwdification/eff/immunity.eff~ ~override/cdixd320.eff~ - WRITE_ASCIIE 0x30 ~%current_spell_res%~ #8 - - END - -END - -///// \\\\\ -///// CLERIC_EXALTATION \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_EXALTATION~) OR override_divine) BEGIN - - LAF cd_new_portrait_icon INT_VAR string = RESOLVE_STR_REF(@4100) STR_VAR bam_file = cdid321d RET icon END - - ADD_SPELL ~iwdification/spl/cdid321.spl~ 1 3 CLERIC_EXALTATION - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4100 // name - SAY 0x50 @4101 // descript - LPF ALTER_EFFECT STR_VAR match_resource = cdid321 resource = EVAL ~%DEST_RES%~ END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 20568 parameter1 = string_mf_panic END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 35484 parameter1 = string_panic END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 37340 parameter1 = string_uncon END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 37603 parameter1 = string_rthinking END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 37604 parameter1 = string_confused END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 37605 parameter1 = string_berserk END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 37606 parameter1 = string_intoxicated END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 37613 parameter1 = string_sleep END - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 174 parameter2 = icon END - END ELSE BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 321 END - LPF DELETE_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 174 END - LPF ALTER_EFFECT INT_VAR match_opcode = 324 opcode = 206 target = 1 parameter1 = 0 parameter2 = 0 END // prevent self-cast - END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid321.itm~ - SAY 0x0c @4100 - SAY 0x54 @4101 - LPF cd_scroll INT_VAR unusable0 = (BIT12 + BIT21 + BIT30) range = 1 price = 300 STR_VAR spell = EVAL ~%current_spell_res%~ END // cleric - - COPY ~iwdification/bam/cdid321a.bam~ ~override~ - ~iwdification/bam/cdid321b.bam~ ~override~ - ~iwdification/bam/cdid321c.bam~ ~override~ - ~iwdification/bam/cdid321d.bam~ ~override~ - ~iwdification/bam/cdiexalt.bam~ ~override~ - ~iwdification/vvc/cdiexalt.vvc~ ~override~ - ~iwdification/wav/cdiep106.wav~ ~override~ - -END - -///// \\\\\ -///// CLERIC_MOONBLADE \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_MOONBLADE~) OR override_divine) BEGIN - - ADD_SPELL ~iwdification/spl/cdid322.spl~ 1 3 CLERIC_MOONBLADE - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4110 // name - SAY 0x50 @4111 // descript - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid322.itm~ - SAY 0x0c @4110 - SAY 0x54 @4111 - LPF cd_scroll INT_VAR unusable0 = (BIT7 + BIT8 + BIT9 + BIT14 + BIT15 + BIT20 + BIT29) target_hdr = 5 range = 1 price = 300 STR_VAR spell = EVAL ~%current_spell_res%~ END - - COPY ~iwdification/itm/cdimoonb.itm~ ~override~ - SAY 0x08 @4110 - SAY 0x0c @4110 - LPF ALTER_EFFECT STR_VAR match_resource = moonbla resource = cdimoonb END - PATCH_IF !ee_game BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 12 match_parameter1 = 0 END // delete undead damage, since it's going through an EFF - LPF ALTER_EFFECT INT_VAR match_opcode = 318 opcode = 177 parameter1 = 4 parameter2 = 3 timing = 1 duration = 0 END - END - - COPY ~iwdification/bam/cdid322a.bam~ ~override~ - ~iwdification/bam/cdid322b.bam~ ~override~ - ~iwdification/bam/cdid322c.bam~ ~override~ - ~iwdification/bam/cdiinvoc.bam~ ~override~ - ~iwdification/bam/cdimoonb.bam~ ~override~ - ~iwdification/vvc/cdiinvoc.vvc~ ~override~ - ~iwdification/wav/cdiem06.wav~ ~override~ - - ACTION_IF !ee_game BEGIN - - COPY ~iwdification/eff/cdimoonb.eff~ ~override~ - - END - -END - -///// \\\\\ -///// CLERIC_CIRCLE_OF_BONES \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_CIRCLE_OF_BONES~) OR override_divine) BEGIN - - ADD_SPELL ~iwdification/spl/cdid323.spl~ 1 3 CLERIC_CIRCLE_OF_BONES - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4120 // name - SAY 0x50 @4121 // descript - LPF ALTER_EFFECT INT_VAR match_opcode = 126 opcode = 176 END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid323.itm~ - SAY 0x0c @4120 - SAY 0x54 @4121 - LPF cd_scroll INT_VAR unusable0 = (BIT2 + BIT12 + BIT21 + BIT30) target_hdr = 5 range = 1 price = 300 STR_VAR spell = EVAL ~%current_spell_res%~ END // non-good cleric - - COPY ~iwdification/bam/cdid323a.bam~ ~override~ - ~iwdification/bam/cdid323b.bam~ ~override~ - ~iwdification/bam/cdid323c.bam~ ~override~ - ~iwdification/bam/cdibone1.bam~ ~override~ - ~iwdification/bam/cdibone2.bam~ ~override~ - ~iwdification/spl/cdid323d.spl~ ~override~ - ~iwdification/vvc/cdibone1.vvc~ ~override~ - ~iwdification/vvc/cdibone2.vvc~ ~override~ - ~iwdification/wav/cdiafp22.wav~ ~override~ - ~iwdification/wav/cdiarp21.wav~ ~override~ - ~iwdification/wav/cdiep101.wav~ ~override~ - -END - -///// \\\\\ -///// CLERIC_SPIKE_GROWTH \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_SPIKE_GROWTH~) OR override_divine) BEGIN - - ACTION_IF ee_game BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdi300.pro~ - - END ELSE BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdi300a.pro~ - - END - - ADD_SPELL ~iwdification/spl/cdid324.spl~ 1 3 CLERIC_SPIKE_GROWTH - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4130 // name - SAY 0x50 @4131 // descript - PATCH_IF ee_game BEGIN - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi300 END - END ELSE BEGIN - LPF DELETE_EFFECT END - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi300a END - LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 1 parameter2 = 2 timing = 1 parameter2 = 2 STR_VAR resource = cdid324 END - LPF ADD_SPELL_EFFECT INT_VAR opcode = 215 target = 1 parameter2 = 2 timing = 1 STR_VAR resource = cdisgrwa END - END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid324.itm~ - SAY 0x0c @4130 - SAY 0x54 @4131 - LPF cd_scroll INT_VAR unusable0 = (BIT7 + BIT8 + BIT9 + BIT14 + BIT15 + BIT20 + BIT29) target_hdr = 4 range = 100 opcode = 148 target_eff = 1 price = 300 STR_VAR spell = EVAL ~%current_spell_res%~ END // druid - - COPY ~iwdification/bam/cdid324a.bam~ ~override~ - ~iwdification/bam/cdid324b.bam~ ~override~ - ~iwdification/bam/cdid324c.bam~ ~override~ - ~iwdification/bam/cdisgrwa.bam~ ~override~ - ~iwdification/bam/cdisgrwx.bam~ ~override~ - ~iwdification/vvc/cdisgrwa.vvc~ ~override~ - ~iwdification/vvc/cdisgrwx.vvc~ ~override~ - ~iwdification/wav/cdiafp24.wav~ ~override~ - - ACTION_IF !ee_game BEGIN - - LAUNCH_ACTION_FUNCTION cd_create_cloud INT_VAR visloop = 5 cloud_dur = 60 STR_VAR code = cdid324 anim = cdisgrwa END - - COPY ~iwdification/spl/cdid324.spl~ ~override~ - WRITE_LONG 0x08 "-1" // name - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi300a END - LPF ADD_SPELL_EFFECT INT_VAR opcode = 215 target = 2 duration = 3 STR_VAR resource = cdisgrwx END - LPF ADD_SPELL_EFFECT INT_VAR opcode = 206 target = 2 duration = 6 STR_VAR resource = cdid324 END - - END - -END - -///// \\\\\ -///// CLERIC_CLOUDBURST \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_CLOUDBURST~) OR override_divine) BEGIN - - ACTION_IF ee_game BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdi301.pro~ - - END ELSE BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdi301a.pro~ - - END - - ADD_SPELL ~iwdification/spl/cdid325.spl~ 1 3 CLERIC_CLOUDBURST - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4140 // name - SAY 0x50 @4141 // descript - PATCH_IF ee_game BEGIN - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi301 END - PATCH_FOR_EACH res IN firau1d2 firau3d6 frostd10 spin187 spin128 BEGIN // leftover iwdee references - LPF DELETE_EFFECT STR_VAR match_resource = EVAL ~%res%~ END - END - LPF ALTER_EFFECT STR_VAR match_resource = cdid325 resource = EVAL ~%DEST_RES%~ END - LPF ALTER_EFFECT STR_VAR match_resource = fsalring resource = cdisalfi END // iwdifcation moves aura visuals to weapons - LPF ALTER_EFFECT STR_VAR match_resource = csalring resource = cdisalfr END // iwdifcation moves aura visuals to weapons - END ELSE BEGIN - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi301a END - LPF DELETE_EFFECT END - LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 1 timing = 1 parameter2 = 2 STR_VAR resource = cdid325 END - END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid325.itm~ - SAY 0x0c @4140 - SAY 0x54 @4141 - LPF cd_scroll INT_VAR unusable0 = (BIT7 + BIT8 + BIT9 + BIT14 + BIT15 + BIT20 + BIT29) target_hdr = 4 range = 100 opcode = 148 target_eff = 1 price = 300 STR_VAR spell = EVAL ~%current_spell_res%~ END // druid - - COPY ~iwdification/bam/cdid325a.bam~ ~override~ - ~iwdification/bam/cdid325b.bam~ ~override~ - ~iwdification/bam/cdid325c.bam~ ~override~ - ~iwdification/wav/cdiarp24.wav~ ~override~ - - ACTION_IF ee_game BEGIN - - COPY ~iwdification/bam/cdibacld.bam~ ~override~ - ~iwdification/bam/cdibhcld.bam~ ~override~ - ~iwdification/vvc/cdibhcld.vvc~ ~override~ - - END ELSE BEGIN - - LAUNCH_ACTION_FUNCTION cd_create_cloud INT_VAR visloop = 1 cloud_dur = 12 zosa = 1 STR_VAR code = cdid325 anim = cdibacld END - - COPY_EXISTING ~iwdification/spl/cdid325.spl~ ~override~ - WRITE_LONG 0x08 "-1" // name - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi301a END - LPF DELETE_EFFECT INT_VAR match_opcode = 321 END - LPF DELETE_EFFECT INT_VAR match_opcode = 318 END - LPF DELETE_EFFECT INT_VAR match_opcode = 206 END - LPF CD_SPLIT_SAVE_DAMAGE END - PATCH_FOR_EACH res IN cdifire6 cdifros6 cdia524 cdia524b BEGIN // leftover iwdee references - LPF ADD_SPELL_EFFECT INT_VAR opcode = 206 target = 2 duration = 6 STR_VAR resource = EVAL ~%res%~ END - END - LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 2 power = 3 parameter1 = 187 parameter2 = 5 timing = 1 resist_dispel = 1 STR_VAR resource = cdid325c END // extra dam for class: fire elemental - LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 2 power = 3 parameter1 = 146 parameter2 = 5 timing = 1 resist_dispel = 1 STR_VAR resource = cdid325c END // extra dam for class: winter wolf - LPF ADD_SPELL_EFFECT INT_VAR opcode = 206 target = 2 duration = 6 STR_VAR resource = cdid325 END - - COPY ~iwdification/bam/cdid325v.bam~ ~override/cdibacld.bam~ - ~iwdification/eff/cdid325c.eff~ ~override~ - - END - -END - -///// \\\\\ -///// CLERIC_MOLD_TOUCH \\\\\ -///// \\\\\ - -ACTION_IF (ee_game AND (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_MOLD_TOUCH~) OR override_divine)) BEGIN - - ADD_SPELL ~iwdification/spl/cdid326.spl~ 1 3 CLERIC_MOLD_TOUCH - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4150 // name - SAY 0x50 @4151 // descript - LPF ALTER_EFFECT STR_VAR match_resource = cdid326 resource = EVAL ~%DEST_RES%~ END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid326.itm~ - SAY 0x0c @4150 - SAY 0x54 @4151 - LPF cd_scroll INT_VAR unusable0 = (BIT7 + BIT8 + BIT9 + BIT14 + BIT15 + BIT20 + BIT29) range = 1 price = 300 STR_VAR spell = EVAL ~%current_spell_res%~ END // druid - - COPY ~iwdification/bam/cdid326a.bam~ ~override~ - ~iwdification/bam/cdid326b.bam~ ~override~ - ~iwdification/bam/cdid326c.bam~ ~override~ - ~iwdification/bam/cdimoldt.bam~ ~override~ - ~iwdification/vvc/cdimoldt.vvc~ ~override~ - ~iwdification/wav/cdiep107.wav~ ~override~ - -END - -///// \\\\\ -///// CLERIC_STORM_SHELL \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_STORM_SHELL~) OR override_divine) BEGIN - - LAF cd_new_portrait_icon INT_VAR string = RESOLVE_STR_REF(@4160) STR_VAR bam_file = cdid327d RET icon END - - ADD_SPELL ~iwdification/spl/cdid327.spl~ 1 3 CLERIC_STORM_SHELL - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4160 // name - SAY 0x50 @4161 // descript - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 140 parameter2 = icon END - END ELSE BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 140 END - END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid327.itm~ - SAY 0x0c @4160 - SAY 0x54 @4161 - LPF cd_scroll INT_VAR unusable0 = (BIT7 + BIT8 + BIT9 + BIT14 + BIT15 + BIT20 + BIT29) target_hdr = 5 range = 1 price = 300 STR_VAR spell = EVAL ~%current_spell_res%~ END // druid - - COPY ~iwdification/bam/cdid327a.bam~ ~override~ - ~iwdification/bam/cdid327b.bam~ ~override~ - ~iwdification/bam/cdid327c.bam~ ~override~ - ~iwdification/bam/cdid327d.bam~ ~override~ - ~iwdification/bam/cdisshel.bam~ ~override~ - ~iwdification/vvc/cdistorm.vvc~ ~override~ - ~iwdification/wav/cdiafp25.wav~ ~override~ - -END - -///// \\\\\ -///// CLERIC_CAUSE_MEDIUM_WOUNDS \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_CAUSE_MEDIUM_WOUNDS~) OR override_divine) BEGIN - - ADD_SPELL ~iwdification/spl/cdid330.spl~ 1 3 CLERIC_CAUSE_MEDIUM_WOUNDS - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4170 // name - SAY 0x50 @4171 // descript - LPF ALTER_EFFECT STR_VAR match_resource = cdid330 resource = EVAL ~%DEST_RES%~ END - PATCH_IF !ee_game BEGIN - LPF CLONE_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 144 parameter2 = 4 STR_VAR resource = cdixd330 END // race = golem - LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 4 parameter2 = 3 STR_VAR resource = cdixd330 END // general = undead - LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 104 opcode = 177 parameter2 = 4 STR_VAR resource = cdixd330 END // race = parameter1 - END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid330.itm~ - SAY 0x0c @4170 - SAY 0x54 @4171 - LPF cd_scroll INT_VAR unusable0 = (BIT2 + BIT12 + BIT21 + BIT30) range = 1 price = 300 STR_VAR spell = EVAL ~%current_spell_res%~ END // non-good cleric - - COPY ~iwdification/bam/cdid330a.bam~ ~override~ - ~iwdification/bam/cdid330b.bam~ ~override~ - ~iwdification/bam/cdid330c.bam~ ~override~ - ~iwdification/bam/cdicmdam.bam~ ~override~ - ~iwdification/vvc/cdicmdam.vvc~ ~override~ - ~iwdification/wav/cdiem103.wav~ ~override~ - - ACTION_IF !ee_game BEGIN - - COPY ~iwdification/eff/immunity.eff~ ~override/cdixd330.eff~ - WRITE_ASCIIE 0x30 ~%current_spell_res%~ #8 - - END - -END - -///// \\\\\ -///// CLERIC_FAVOR_OF_ILMATER \\\\\ -///// \\\\\ - -ACTION_IF (ee_game AND (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_FAVOR_OF_ILMATER~) OR override_divine)) BEGIN - - ADD_SPELL ~iwdification/spl/cdid331.spl~ 1 3 CLERIC_FAVOR_OF_ILMATER - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4180 // name - SAY 0x50 @4181 // descript - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = sppr315 resource = EVAL ~%DEST_RES%~ END // iwdee nightly has bug here - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdid331 resource = EVAL ~%DEST_RES%~ END // for when bug is fixed - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid331.itm~ - SAY 0x0c @4180 - SAY 0x54 @4181 - LPF cd_scroll INT_VAR unusable0 = (BIT1 + BIT12 + BIT21 + BIT30) range = 1 opcode = 146 target_eff = 2 price = 300 STR_VAR spell = EVAL ~%current_spell_res%~ END // non-evil cleric - - COPY ~iwdification/bam/cdid331a.bam~ ~override~ - ~iwdification/bam/cdid331b.bam~ ~override~ - ~iwdification/bam/cdid331c.bam~ ~override~ - ~iwdification/bam/cdicmdam.bam~ ~override~ - ~iwdification/bam/cdicmwou.bam~ ~override~ - ~iwdification/vvc/cdicmdam.vvc~ ~override~ - ~iwdification/vvc/cdicmwou.vvc~ ~override~ - ~iwdification/wav/cdiem103.wav~ ~override~ - ~iwdification/wav/cdiep26.wav~ ~override~ - -END - -///// \\\\\ -///// CLERIC_GIANT_INSECT \\\\\ -///// \\\\\ - -ACTION_IF (anim_beetle AND (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_GIANT_INSECT~) OR override_divine)) BEGIN // requires beetle animation, either EE or vanilla + infinity animations - - ADD_PROJECTILE ~iwdification/pro/cdi282.pro~ - - LAF cd_new_summon_table STR_VAR descript = "Giant_insect" 2da_file = cdiinsct RET table END - - ADD_SPELL ~iwdification/spl/cdid418.spl~ 1 4 CLERIC_GIANT_INSECT - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4190 // name - SAY 0x50 @4191 // descript - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 331 parameter2 = table END - END ELSE BEGIN - LPF CLONE_EFFECT INT_VAR match_opcode = 331 opcode = 215 parameter2 = 2 STR_VAR resource = cdimsm1h END - LPF CLONE_EFFECT INT_VAR match_opcode = 331 opcode = 127 parameter1 = 1 parameter2 = 0 probability1 = 49 dicesize = 0 dicenumber = 0 STR_VAR resource = cdiinsct END - LPF CLONE_EFFECT INT_VAR match_opcode = 331 opcode = 127 parameter1 = 1 parameter2 = 0 dicesize = 0 dicenumber = 0 STR_VAR resource = cdiinsct END - LPF ALTER_EFFECT INT_VAR match_opcode = 331 opcode = 127 parameter1 = 1 parameter2 = 0 dicesize = 0 dicenumber = 0 STR_VAR resource = cdiinsct END - END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid418.itm~ - SAY 0x0c @4190 - SAY 0x54 @4191 - LPF cd_scroll INT_VAR unusable0 = (BIT7 + BIT8 + BIT9 + BIT14 + BIT15 + BIT20 + BIT29) target_hdr = 4 opcode = 148 target_eff = 1 price = 400 STR_VAR spell = EVAL ~%current_spell_res%~ END // druid - - COPY_EXISTING ~cdi282.pro~ ~override~ - SAY 0x30 @4193 - - COMPILE ~iwdification/baf/cdibbcld.baf~ - - COPY ~iwdification/spl/cdibombb.spl~ ~override~ - SAY 0xce @4193 - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi282 END - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 35568 parameter1 = string_stunned END - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 14073 parameter1 = string_deafness END - - LAF cd_animation STR_VAR code = e220 END // 57888 MBBM beetle_black - COPY ~iwdification/cre/cdiibomb.cre~ ~override~ - SAY 0x08 @4192 - SAY 0x0c @4192 - WRITE_LONG 0x28 anim_beetle - - COPY ~iwdification/cre/cdiiborb.cre~ ~override~ - SAY 0x08 @3013 - SAY 0x0c @3013 - WRITE_LONG 0x28 anim_beetle - - COPY ~iwdification/itm/cdis5-20.itm~ ~override~ - WRITE_LONG 0x08 string_attack - WRITE_LONG 0x0c string_attack - - COPY ~iwdification/itm/cdifring.itm~ ~override~ - LPF ALTER_EFFECT STR_VAR match_resource = spin191 resource = cdibombb END - - COPY ~iwdification/bam/cdid418a.bam~ ~override~ - ~iwdification/bam/cdid418b.bam~ ~override~ - ~iwdification/bam/cdid418c.bam~ ~override~ - ~iwdification/bam/cdiasm1x.bam~ ~override~ - ~iwdification/bam/cdimsm1h.bam~ ~override~ - ~iwdification/bam/cdisclda.bam~ ~override~ - ~iwdification/bam/cdiscldr.bam~ ~override~ - ~iwdification/vvc/cdiasm1x.vvc~ ~override~ - ~iwdification/vvc/cdimsm1h.vvc~ ~override~ - ~iwdification/wav/cdiem47.wav~ ~override~ - - COPY ~iwdification/2da/cdiinsct.2da~ ~override~ - PATCH_IF !ee_game BEGIN// delete 2nd & 3rd columns for vanilla summon tables - REPLACE_TEXTUALLY ~[ %TAB%]+HitAnimation[ %TAB%]+AreaHitAnimation~ ~~ - REPLACE_TEXTUALLY ~[ %TAB%]+cdimsm1h[ %TAB%]+.+$~ ~~ - END - -END - -///// \\\\\ -///// CLERIC_PRODUCE_FIRE \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_PRODUCE_FIRE~) OR override_divine) BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdi215.pro~ - - ADD_SPELL ~iwdification/spl/cdid419.spl~ 1 4 CLERIC_PRODUCE_FIRE - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4200 // name - SAY 0x50 @4201 // descript - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi215 END - LPF ALTER_EFFECT STR_VAR match_resource = cdid419 resource = EVAL ~%DEST_RES%~ END - PATCH_IF !ee_game BEGIN - LPF ADD_SPELL_EFFECT INT_VAR opcode = 215 target = 1 parameter2 = 2 timing = 1 resist_dispel = 3 STR_VAR resource = cdiprfir END - END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid419.itm~ - SAY 0x0c @4200 - SAY 0x54 @4201 - LPF cd_scroll INT_VAR unusable0 = (BIT7 + BIT8 + BIT9 + BIT14 + BIT15 + BIT20 + BIT29) target_hdr = 4 range = 40 opcode = 148 target_eff = 1 price = 400 STR_VAR spell = EVAL ~%current_spell_res%~ END // druid - - COPY ~iwdification/bam/cdid419a.bam~ ~override~ - ~iwdification/bam/cdid419b.bam~ ~override~ - ~iwdification/bam/cdid419c.bam~ ~override~ - ~iwdification/bam/cdipfira.bam~ ~override~ - ~iwdification/bam/cdipfirx.bam~ ~override~ - ~iwdification/vvc/cdiprfir.vvc~ ~override~ - ~iwdification/wav/cdiarp03.wav~ ~override~ - ~iwdification/wav/cdiep45.wav~ ~override~ - - ACTION_IF !ee_game BEGIN - - COPY_EXISTING ~cdi215.pro~ ~override~ - WRITE_BYTE 0x217 255 - - END - -END - -///// \\\\\ -///// CLERIC_STATIC_CHARGE \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_STATIC_CHARGE~) OR override_divine) BEGIN - - LAF cd_new_portrait_icon INT_VAR string = RESOLVE_STR_REF(@4210) STR_VAR bam_file = cdid420d RET icon END - - ACTION_IF ee_game BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdistatc.pro~ - - END - - ADD_SPELL ~iwdification/spl/cdid420.spl~ 1 4 CLERIC_STATIC_CHARGE - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4210 // name - SAY 0x50 @4211 // descript - LPF ALTER_EFFECT STR_VAR match_resource = cdid420 resource = EVAL ~%DEST_RES%~ END - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 333 STR_VAR resource = cdid420b END - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 42 parameter2 = icon END - END ELSE BEGIN - LPF ALTER_SPELL_HEADER INT_VAR target = 1 projectile = 1 range = 30 END - LPF DELETE_EFFECT INT_VAR match_opcode = 321 END - LPF DELETE_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 42 END - LPF ALTER_EFFECT INT_VAR target = 2 dicenumber = 0 dicesize = 0 END - LPF CD_CONVERT_333 STR_VAR 333spell = cdid420b END - END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid420.itm~ - SAY 0x0c @4210 - SAY 0x54 @4211 - PATCH_IF ee_game BEGIN - LPF cd_scroll INT_VAR unusable0 = (BIT7 + BIT8 + BIT9 + BIT14 + BIT15 + BIT20 + BIT29) target_hdr = 5 range = 1 price = 400 STR_VAR spell = EVAL ~%current_spell_res%~ END // druid - END ELSE BEGIN - LPF cd_scroll INT_VAR unusable0 = (BIT7 + BIT8 + BIT9 + BIT14 + BIT15 + BIT20 + BIT29) target_hdr = 1 range = 30 price = 400 STR_VAR spell = EVAL ~%current_spell_res%~ END // druid - END - - COPY ~iwdification/spl/cdid420b.spl~ ~override~ - SAY 0x9e @4212 - PATCH_IF ee_game BEGIN - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdistatc END - END ELSE BEGIN - LPF ALTER_SPELL_HEADER INT_VAR target = 1 projectile = 1 range = 30 END - LPF ALTER_EFFECT INT_VAR match_opcode = 12 dicenumber = 4 dicesize = 8 special = 0 END - LPF CLONE_EFFECT INT_VAR match_opcode = 12 dicenumber = 5 savingthrow = 0 END - LPF CD_EXTEND-O-MATIC INT_VAR base_dur = 0 step_dur = 0 level_cap = 20 min_lev_alt = 7 END - READ_SHORT 0x68 abil_num - FOR (index = 0 ; index < abil_num ; ++index) BEGIN - LPF ALTER_EFFECT INT_VAR header = index match_opcode = 12 match_savingthrow = 0 dicenumber = ((index + 9) / 2) END - LPF ALTER_EFFECT INT_VAR header = index match_opcode = 12 match_savingthrow = BIT0 dicenumber = ((index + 10) / 2) END - END - END - - COPY ~iwdification/bam/cdid420a.bam~ ~override~ - ~iwdification/bam/cdid420b.bam~ ~override~ - ~iwdification/bam/cdid420c.bam~ ~override~ - ~iwdification/bam/cdid420d.bam~ ~override~ - ~iwdification/bam/cdistath.bam~ ~override~ - ~iwdification/vvc/cdistath.vvc~ ~override~ - ~iwdification/wav/cdiep42.wav~ ~override~ - -END - -///// \\\\\ -///// CLERIC_RECITATION \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_RECITATION~) OR override_divine) BEGIN - - LAF cd_new_portrait_icon INT_VAR string = RESOLVE_STR_REF(@4220) STR_VAR bam_file = cdid316d RET icon END - - ADD_PROJECTILE ~iwdification/pro/cdivrnp.pro~ - ADD_PROJECTILE ~iwdification/pro/cdivrpo.pro~ - - ADD_SPELL ~iwdification/spl/cdid421.spl~ 1 4 CLERIC_RECITATION - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4220 // name - SAY 0x50 @4221 // descript - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid421.itm~ - SAY 0x0c @4220 - SAY 0x54 @4221 - LPF cd_scroll INT_VAR unusable0 = (BIT12 + BIT21 + BIT30) target_hdr = 5 range = 40 price = 400 STR_VAR spell = EVAL ~%current_spell_res%~ END // cleric - - COPY ~iwdification/spl/cdid421b.spl~ ~override~ - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdivrnp END - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 40257 parameter1 = RESOLVE_STR_REF(@4082) END - PATCH_IF !ee_game BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 321 END - LPF CLONE_EFFECT INT_VAR match_opcode = 54 opcode = 206 parameter1 = 0 parameter2 = 0 STR_VAR insert = last resource = cdid421b END - LPF CD_CONVERT_9_255 END - END - - COPY ~iwdification/spl/cdid421g.spl~ ~override~ - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdivrpo END - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 40256 parameter1 = RESOLVE_STR_REF(@4083) END - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 175 parameter2 = icon END - END ELSE BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 175 parameter2 = 18 END - LPF DELETE_EFFECT INT_VAR match_opcode = 321 END - LPF CLONE_EFFECT INT_VAR match_opcode = 54 opcode = 206 parameter1 = 0 parameter2 = 0 STR_VAR insert = last resource = cdid421g END - LPF CD_CONVERT_9_255 END - END - - COPY ~iwdification/bam/cdid421a.bam~ ~override~ - ~iwdification/bam/cdid421b.bam~ ~override~ - ~iwdification/bam/cdid421c.bam~ ~override~ - ~iwdification/bam/cdid316d.bam~ ~override~ - ~iwdification/bam/cdirecih.bam~ ~override~ - ~iwdification/vvc/cdirecig.vvc~ ~override~ - ~iwdification/vvc/cdirecih.vvc~ ~override~ - ~iwdification/wav/cdiep44.wav~ ~override~ - -END - -///// \\\\\ -///// CLERIC_BLOOD_RAGE \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_BLOOD_RAGE~) OR override_divine) BEGIN - - LAF cd_new_portrait_icon INT_VAR string = RESOLVE_STR_REF(@4230) STR_VAR bam_file = cdid422d RET icon END - - ADD_SPELL ~iwdification/spl/cdid422.spl~ 1 4 CLERIC_BLOOD_RAGE - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4230 // name - SAY 0x50 @4231 // descript - LPF ALTER_EFFECT STR_VAR match_resource = cdid422 resource = EVAL ~%DEST_RES%~ END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 1280 parameter1 = string_stunned END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 14022 parameter1 = string_healed END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 14043 parameter1 = string_stun END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 14102 parameter1 = string_held END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 17392 parameter1 = string_dcharmed END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 20568 parameter1 = string_mf_panic END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 35473 parameter1 = string_healed END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 35484 parameter1 = string_panic END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 35542 parameter1 = string_paralyzed END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 35544 parameter1 = string_dominated END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 35606 parameter1 = string_held END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 37340 parameter1 = string_uncon END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 37603 parameter1 = string_rthinking END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 37604 parameter1 = string_confused END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 37613 parameter1 = string_sleep END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 37801 parameter1 = string_charmed END - PATCH_IF ee_game BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 318 STR_VAR match_resource = cdid422 END // should be last - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 176 parameter2 = icon END - LPF CLONE_EFFECT INT_VAR match_opcode = 324 opcode = 318 match_parameter2 = 50 parameter2 = 0 STR_VAR insert = last END // reinserting as last - END ELSE BEGIN - LPF CLONE_EFFECT INT_VAR match_opcode = 324 opcode = 206 match_parameter2 = 50 parameter2 = 0 STR_VAR insert = last END // reinserting as last - LPF DELETE_EFFECT INT_VAR match_opcode = 321 END - LPF DELETE_EFFECT INT_VAR match_opcode = 324 END - LPF DELETE_EFFECT INT_VAR match_opcode = 328 END - LPF ALTER_EFFECT INT_VAR match_opcode = 318 opcode = 206 parameter1 = 0 parameter2 = 0 END - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 176 parameter2 = 4 END - PATCH_FOR_EACH ea IN 0 1 28 29 30 31 126 128 199 200 201 202 254 255 BEGIN // all ea values except charmed, controlled, ally, familiar, pc - LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 2 power = 4 parameter1 = ea parameter2 = 2 resist_dispel = 3 duration = 120 insert_point = 0 STR_VAR resource = cdixd422 END - END - LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 2 power = 4 parameter1 = 16 parameter2 = 8 resist_dispel = 3 duration = 120 insert_point = 0 STR_VAR resource = cdixd422 END // lawful - END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid422.itm~ - SAY 0x0c @4230 - SAY 0x54 @4231 - LPF cd_scroll INT_VAR unusable0 = (BIT4 + BIT12 + BIT21 + BIT30) price = 400 STR_VAR spell = EVAL ~%current_spell_res%~ END // non-lawful cleric - - COPY ~iwdification/bam/cdid422a.bam~ ~override~ - ~iwdification/bam/cdid422b.bam~ ~override~ - ~iwdification/bam/cdid422c.bam~ ~override~ - ~iwdification/bam/cdid422d.bam~ ~override~ - - ACTION_IF !ee_game BEGIN - - COPY ~iwdification/eff/immunity.eff~ ~override/cdixd422.eff~ - WRITE_ASCIIE 0x30 ~%current_spell_res%~ #8 - - END - -END - -///// \\\\\ -///// CLERIC_CLOUD_OF_PESTILENCE \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_CLOUD_OF_PESTILENCE~) OR override_divine) BEGIN - - ACTION_IF ee_game BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdi309.pro~ - - END ELSE BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdi309a.pro~ - - END - - ADD_SPELL ~iwdification/spl/cdid423.spl~ 1 4 CLERIC_CLOUD_OF_PESTILENCE - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4240 // name - SAY 0x50 @4241 // descript - PATCH_IF ee_game BEGIN - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi309 END - LPF ALTER_EFFECT STR_VAR match_resource = cdid423 resource = EVAL ~%DEST_RES%~ END - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 37800 parameter1 = string_blinded END - END ELSE BEGIN - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi309a END - LPF DELETE_EFFECT END - LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 1 timing = 1 parameter2 = 2 STR_VAR resource = cdid423 END - LPF ADD_SPELL_EFFECT INT_VAR opcode = 206 target = 1 duration = 24 STR_VAR resource = cdid423 END - END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid423.itm~ - SAY 0x0c @4240 - SAY 0x54 @4241 - LPF cd_scroll INT_VAR unusable0 = (BIT2 + BIT3 + BIT12 + BIT21 + BIT30) target_hdr = 4 range = 100 opcode = 148 target_eff = 1 price = 400 STR_VAR spell = EVAL ~%current_spell_res%~ END // evil cleric - - COPY ~iwdification/bam/cdid423a.bam~ ~override~ - ~iwdification/bam/cdid423b.bam~ ~override~ - ~iwdification/bam/cdid423c.bam~ ~override~ - ~iwdification/bam/cdicopes.bam~ ~override~ - ~iwdification/wav/cdiarp25.wav~ ~override~ - - ACTION_IF ee_game BEGIN - - APPEND ~clearair.2da~ ~Cloud_of_Pest %cdi309%~ - - END ELSE BEGIN - - APPEND ~clearair.2da~ ~Cloud_of_Pest %cdi309a%~ - - LAUNCH_ACTION_FUNCTION cd_create_cloud INT_VAR visloop = 9 cloud_dur = 24 zosa = 1 STR_VAR code = cdid423 anim = cdicopes END - - COPY ~iwdification/spl/cdid423.spl~ ~override~ - WRITE_LONG 0x08 "-1" // name - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi309a END - LPF ADD_SPELL_EFFECT INT_VAR opcode = 206 target = 2 duration = 6 STR_VAR resource = cdid423 END - LPF DELETE_EFFECT INT_VAR match_opcode = 318 END - LPF DELETE_EFFECT INT_VAR match_opcode = 321 END - LPF DELETE_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 39 END // class = paladin, but bg2 paladins don't have disease immunity - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 37800 parameter1 = string_blinded END - LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 9 opcode = 177 parameter1 = 145 parameter2 = 4 STR_VAR resource = cdixd423 END // race = elemental - LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 27 opcode = 177 parameter1 = 144 parameter2 = 4 STR_VAR resource = cdixd423 END // race = golem - LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 1 opcode = 177 parameter1 = 4 parameter2 = 3 STR_VAR resource = cdixd423 END // general = undead - - COPY ~iwdification/eff/immunity.eff~ ~override/cdixd423.eff~ - WRITE_ASCIIE 0x30 ~%current_spell_res%~ #8 - - END - -END - -///// \\\\\ -///// CLERIC_UNFAILING_ENDURANCE \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_UNFAILING_ENDURANCE~) OR override_divine) BEGIN - - ADD_SPELL ~iwdification/spl/cdid424.spl~ 1 4 CLERIC_UNFAILING_ENDURANCE - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4250 // name - SAY 0x50 @4251 // descript - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid424.itm~ - SAY 0x0c @4250 - SAY 0x54 @4251 - LPF cd_scroll INT_VAR unusable0 = (BIT12 + BIT21 + BIT30) range = 1 price = 400 STR_VAR spell = EVAL ~%current_spell_res%~ END // cleric - - COPY ~iwdification/bam/cdid424a.bam~ ~override~ - ~iwdification/bam/cdid424b.bam~ ~override~ - ~iwdification/bam/cdid424c.bam~ ~override~ - ~iwdification/bam/cdinecro.bam~ ~override~ - ~iwdification/vvc/cdinecro.vvc~ ~override~ - ~iwdification/wav/cdiep112.wav~ ~override~ - -END - -///// \\\\\ -///// CLERIC_STAR_METAL_CUDGEL \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_STAR_METAL_CUDGEL~) OR override_divine) BEGIN - - ADD_SPELL ~iwdification/spl/cdid425.spl~ 1 4 CLERIC_STAR_METAL_CUDGEL - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4260 // name - SAY 0x50 @4261 // descript - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid425.itm~ - SAY 0x0c @4260 - SAY 0x54 @4261 - LPF cd_scroll INT_VAR unusable0 = (BIT7 + BIT8 + BIT9 + BIT14 + BIT15 + BIT20 + BIT29) target_hdr = 5 range = 1 price = 400 STR_VAR spell = EVAL ~%current_spell_res%~ END // druid - - COPY ~iwdification/itm/cdismcud.itm~ ~override~ - SAY 0x08 @4260 - SAY 0x0c @4260 - - COPY ~iwdification/bam/cdid425a.bam~ ~override~ - ~iwdification/bam/cdid425b.bam~ ~override~ - ~iwdification/bam/cdid425c.bam~ ~override~ - ~iwdification/bam/cdiconju.bam~ ~override~ - ~iwdification/bam/cdismcud.bam~ ~override~ - ~iwdification/eff/cdismcud.eff~ ~override~ - ~iwdification/vvc/cdiconju.vvc~ ~override~ - ~iwdification/wav/cdiep02.wav~ ~override~ - -END - -///// \\\\\ -///// CLERIC_SMASHING_WAVE \\\\\ -///// \\\\\ - -ACTION_IF (ee_game AND (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_SMASHING_WAVE~) OR override_divine)) BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdiswave.pro~ - - ADD_SPELL ~iwdification/spl/cdid426.spl~ 1 4 CLERIC_SMASHING_WAVE - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4270 // name - SAY 0x50 @4271 // descript - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdiswave END - LPF ALTER_EFFECT STR_VAR match_resource = cdid426 resource = EVAL ~%DEST_RES%~ END - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 35568 parameter1 = string_stunned END - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 37340 parameter1 = string_uncon END - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 20438 parameter1 = string_uncon END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid426.itm~ - SAY 0x0c @4270 - SAY 0x54 @4271 - LPF cd_scroll INT_VAR unusable0 = (BIT7 + BIT8 + BIT9 + BIT14 + BIT15 + BIT20 + BIT29) target_hdr = 4 range = 100 opcode = 148 target_eff = 1 price = 400 STR_VAR spell = EVAL ~%current_spell_res%~ END // druid - - COPY ~iwdification/bam/cdid426a.bam~ ~override~ - ~iwdification/bam/cdid426b.bam~ ~override~ - ~iwdification/bam/cdid426c.bam~ ~override~ - ~iwdification/bam/cdiswavh.bam~ ~override~ - ~iwdification/bam/cdiswavx.bam~ ~override~ - ~iwdification/vvc/cdiswavh.vvc~ ~override~ - ~iwdification/wav/cdiep110.wav~ ~override~ - ~iwdification/wav/cditra56.wav~ ~override~ - -END - -///// \\\\\ -///// CLERIC_THORN_SPRAY \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_THORN_SPRAY~) OR override_divine) BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdi303.pro~ - - ADD_SPELL ~iwdification/spl/cdid427.spl~ 1 4 CLERIC_THORN_SPRAY - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4280 // name - SAY 0x50 @4281 // descript - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi303 END - PATCH_IF !ee_game BEGIN - LPF CD_SPLIT_SAVE_DAMAGE END - END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid427.itm~ - SAY 0x0c @4280 - SAY 0x54 @4281 - LPF cd_scroll INT_VAR unusable0 = (BIT7 + BIT8 + BIT9 + BIT14 + BIT15 + BIT20 + BIT29) target_hdr = 4 range = 30 opcode = 148 target_eff = 1 price = 400 STR_VAR spell = EVAL ~%current_spell_res%~ END // druid - - COPY ~iwdification/bam/cdid427a.bam~ ~override~ - ~iwdification/bam/cdid427b.bam~ ~override~ - ~iwdification/bam/cdid427c.bam~ ~override~ - ~iwdification/bam/cditspra.bam~ ~override~ - ~iwdification/wav/cditra61.wav~ ~override~ - - ACTION_IF !ee_game BEGIN - - COPY_EXISTING ~cdi303.pro~ ~override~ - WRITE_BYTE 0x217 11 // re-use cone of cold - WRITE_BYTE 0x218 0 - - END - -END - -///// \\\\\ -///// CLERIC_WALL_OF_MOONLIGHT \\\\\ -///// \\\\\ - -ACTION_IF (ee_game AND (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_WALL_OF_MOONLIGHT~) OR override_divine)) BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdiwallm.pro~ - - ADD_SPELL ~iwdification/spl/cdid428.spl~ 1 4 CLERIC_WALL_OF_MOONLIGHT - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4290 // name - SAY 0x50 @4291 // descript - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdiwallm END - LPF ALTER_EFFECT STR_VAR match_resource = cdid428 resource = EVAL ~%DEST_RES%~ END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid428.itm~ - SAY 0x0c @4290 - SAY 0x54 @4291 - LPF cd_scroll INT_VAR unusable0 = (BIT7 + BIT8 + BIT9 + BIT14 + BIT15 + BIT20 + BIT29) target_hdr = 4 range = 100 opcode = 148 target_eff = 1 price = 400 STR_VAR spell = EVAL ~%current_spell_res%~ END // druid - - COPY ~iwdification/bam/cdid428a.bam~ ~override~ - ~iwdification/bam/cdid428b.bam~ ~override~ - ~iwdification/bam/cdid428c.bam~ ~override~ - ~iwdification/bam/cdimoonx.bam~ ~override~ - ~iwdification/spl/cdid428a.spl~ ~override~ - ~iwdification/spl/cdid428b.spl~ ~override~ - ~iwdification/vvc/cdimoonx.vvc~ ~override~ - ~iwdification/wav/cdiafp21.wav~ ~override~ - ~iwdification/wav/cdiarp22.wav~ ~override~ - -END - -///// \\\\\ -///// CLERIC_RIGHTEOUS_WRATH_OF_THE_FAITHFUL \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_RIGHTEOUS_WRATH_OF_THE_FAITHFUL~) OR override_divine) BEGIN - - LAF cd_new_portrait_icon INT_VAR string = RESOLVE_STR_REF(@4300) STR_VAR bam_file = cdid316d RET icon END - - ADD_PROJECTILE ~iwdification/pro/cdi266.pro~ - - ADD_SPELL ~iwdification/spl/cdid518.spl~ 1 5 CLERIC_RIGHTEOUS_WRATH_OF_THE_FAITHFUL - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4300 // name - SAY 0x50 @4301 // descript - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi266 END - PATCH_IF !ee_game BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 318 END - LPF DELETE_EFFECT INT_VAR match_opcode = 146 STR_VAR match_resource = cdirwf00 END - PATCH_FOR_EACH align IN 17 18 19 33 34 35 49 50 51 BEGIN - LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 1 power = 5 parameter1 = align parameter2 = 8 timing = 1 resist_dispel = 3 STR_VAR resource = EVAL ~cdirwf%align%~ END - END - END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid518.itm~ - SAY 0x0c @4300 - SAY 0x54 @4301 - LPF cd_scroll INT_VAR unusable0 = (BIT12 + BIT21 + BIT30) target_hdr = 5 range = 40 price = 500 STR_VAR spell = EVAL ~%current_spell_res%~ END // cleric - - COPY ~iwdification/spl/cdirwf00.spl~ ~override~ - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 17392 parameter1 = string_dcharmed END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 35542 parameter1 = string_paralyzed END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 35544 parameter1 = string_dominated END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 35606 parameter1 = string_held END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 36035 parameter1 = string_hasted END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 37801 parameter1 = string_charmed END - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 184 parameter2 = icon END - END ELSE BEGIN // in non-ee, characters will get 00 AND 99 if matching alignment, so need to strip out anything already covered in 99 - LPF DELETE_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 184 END - PATCH_FOR_EACH op IN 321 8 174 215 18 93 BEGIN // cosmetics, sound, fatigue, hp bonus - LPF DELETE_EFFECT INT_VAR match_opcode = op END - END - PATCH_FOR_EACH op IN 54 33 34 35 36 37 BEGIN // already get +1 from 99, so only bump another +1 here - LPF ALTER_EFFECT INT_VAR match_opcode = op parameter1 = 1 END - END - LPF CLONE_EFFECT INT_VAR match_opcode = 54 opcode = 206 parameter1 = 0 parameter2 = 0 STR_VAR insert = last resource = cdirwf00 END - END - - COPY ~iwdification/spl/cdirwf99.spl~ ~override~ - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 184 parameter2 = icon END - END ELSE BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 321 END - LPF DELETE_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 184 END - LPF CLONE_EFFECT INT_VAR match_opcode = 54 opcode = 206 parameter1 = 0 parameter2 = 0 STR_VAR insert = last resource = cdirwf99 END - LPF CD_CONVERT_9_255 END - END - - COPY ~iwdification/bam/cdid518a.bam~ ~override~ - ~iwdification/bam/cdid518b.bam~ ~override~ - ~iwdification/bam/cdid518c.bam~ ~override~ - ~iwdification/bam/cdid316d.bam~ ~override~ - ~iwdification/bam/cdiabjux.bam~ ~override~ - ~iwdification/bam/cdirwtfh.bam~ ~override~ - ~iwdification/vvc/cdigabju.vvc~ ~override~ - ~iwdification/vvc/cdirwtfg.vvc~ ~override~ - ~iwdification/vvc/cdirwtfh.vvc~ ~override~ - ~iwdification/wav/cdiarm20.wav~ ~override~ - ~iwdification/wav/cdiee01.wav~ ~override~ - ~iwdification/wav/cdiep36.wav~ ~override~ - - ACTION_IF !ee_game BEGIN - - COPY ~iwdification/eff/cdirwf17.eff~ ~override/cdirwf00.eff~ - WRITE_ASCIIE 0x30 ~cdirwf00~ - - ACTION_FOR_EACH align IN 17 18 19 33 34 35 49 50 51 BEGIN - - COPY ~iwdification/eff/cdirwf17.eff~ ~override/cdirwf%align%.eff~ - WRITE_ASCIIE 0x30 ~cdirwf%align%~ - - COPY ~iwdification/spl/cdirwf17.spl~ ~override/cdirwf%align%.spl~ - WRITE_LONG 0x9e align - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi266 END - - END - - END - -END - -///// \\\\\ -///// CLERIC_SPIKE_STONES \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_SPIKE_STONES~) OR override_divine) BEGIN - - ACTION_IF ee_game BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdi213.pro~ - - END ELSE BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdi213a.pro~ - - END - - ADD_SPELL ~iwdification/spl/cdid519.spl~ 1 5 CLERIC_SPIKE_STONES - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4310 // name - SAY 0x50 @4311 // descript - PATCH_IF ee_game BEGIN - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi213 END - LPF DELETE_EFFECT STR_VAR match_resource = ~#sston~ END - END ELSE BEGIN - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi213a END - LPF DELETE_EFFECT END - LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 1 timing = 1 parameter2 = 2 STR_VAR resource = cdid519 END - END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid519.itm~ - SAY 0x0c @4310 - SAY 0x54 @4311 - LPF cd_scroll INT_VAR unusable0 = (BIT7 + BIT8 + BIT9 + BIT14 + BIT15 + BIT20 + BIT29) target_hdr = 4 range = 40 opcode = 148 target_eff = 1 price = 1500 STR_VAR spell = EVAL ~%current_spell_res%~ END // druid only - - COPY ~iwdification/bam/cdid519a.bam~ ~override~ - ~iwdification/bam/cdid519b.bam~ ~override~ - ~iwdification/bam/cdid519c.bam~ ~override~ - ~iwdification/bam/cdistone.bam~ ~override~ - ~iwdification/vvc/cdistone.vvc~ ~override~ - ~iwdification/wav/cdiarp04.wav~ ~override~ - ~iwdification/wav/cdicp03.wav~ ~override~ - ~iwdification/wav/cdiep48.wav~ ~override~ - - ACTION_IF ee_game BEGIN - - COPY ~iwdification/vvc/cdistone.vvc~ ~override~ - - END ELSE BEGIN - - LAUNCH_ACTION_FUNCTION cd_create_cloud INT_VAR visloop = 5 cloud_dur = 72 STR_VAR code = cdid519 anim = cdistone END - - COPY ~iwdification/spl/cdid519.spl~ ~override~ - WRITE_LONG 0x08 "-1" // name - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi213a END - LPF ADD_SPELL_EFFECT INT_VAR opcode = 206 target = 2 duration = 6 STR_VAR resource = cdid519 END - - END - -END - -///// \\\\\ -///// CLERIC_SHIELD_OF_LATHANDER \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_SHIELD_OF_LATHANDER~) OR override_divine) BEGIN - - LAF cd_new_portrait_icon INT_VAR string = RESOLVE_STR_REF(@4320) STR_VAR bam_file = cdid520d RET icon END - - ADD_SPELL ~iwdification/spl/cdid520.spl~ 1 5 CLERIC_SHIELD_OF_LATHANDER - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4320 // name - SAY 0x50 @4321 // descript - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 324 STR_VAR resource = EVAL ~%DEST_RES%~ END - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 164 parameter2 = icon END - END ELSE BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 164 END - LPF ALTER_EFFECT INT_VAR match_opcode = 324 opcode = 177 parameter1 = 3 parameter2 = 8 STR_VAR resource = cdixd520 END - END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid520.itm~ - SAY 0x0c @4320 - SAY 0x54 @4321 - LPF cd_scroll INT_VAR unusable0 = (BIT1 + BIT12 + BIT21 + BIT30) range = 1 price = 500 STR_VAR spell = EVAL ~%current_spell_res%~ END // non-evil cleric - - COPY ~iwdification/bam/cdid520a.bam~ ~override~ - ~iwdification/bam/cdid520b.bam~ ~override~ - ~iwdification/bam/cdid520c.bam~ ~override~ - ~iwdification/bam/cdid520d.bam~ ~override~ - ~iwdification/bam/cdisol1.bam~ ~override~ - ~iwdification/bam/cdisol2.bam~ ~override~ - ~iwdification/vvc/cdilatl1.vvc~ ~override~ - ~iwdification/vvc/cdilatl2.vvc~ ~override~ - ~iwdification/wav/cdiafp20.wav~ ~override~ - - ACTION_IF !ee_game BEGIN - - COPY ~iwdification/eff/immunity.eff~ ~override/cdixd520.eff~ - WRITE_ASCIIE 0x30 ~%current_spell_res%~ #8 - - END - -END - -///// \\\\\ -///// CLERIC_UNDEAD_WARD \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_UNDEAD_WARD~) OR override_divine) BEGIN - - ACTION_IF ee_game BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdiuward.pro~ - - END ELSE BEGIN - - OUTER_SET cdiuward = 1 - - END - - ADD_SPELL ~iwdification/spl/cdid521.spl~ 1 5 CLERIC_UNDEAD_WARD - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4330 // name - SAY 0x50 @4331 // descript - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdiuward END - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT STR_VAR match_resource = cdid521 resource = EVAL ~%DEST_RES%~ END - END ELSE BEGIN - LPF DELETE_EFFECT END - LPF ADD_SPELL_EFFECT INT_VAR opcode = 215 target = 1 power = 5 resist_dispel = 2 duration = 60 STR_VAR resource = cdiuwrdx END - LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 1 power = 5 parameter2 = 2 resist_dispel = 2 duration = 60 END - LPF CD_EXTEND-O-MATIC INT_VAR base_dur = 60 step_dur = 0 level_cap = 30 min_lev_alt = 9 END - READ_SHORT 0x68 abil_num - FOR (index = 9 ; index < (abil_num + 9) ; ++index) BEGIN - LPF ALTER_EFFECT INT_VAR header = (index - 9) match_opcode = 177 STR_VAR resource = EVAL ~cdiuwr%index%~ END - END - END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid521.itm~ - SAY 0x0c @4330 - SAY 0x54 @4331 - LPF cd_scroll INT_VAR unusable0 = (BIT12 + BIT21 + BIT30) target_hdr = 5 range = 1 price = 500 STR_VAR spell = EVAL ~%current_spell_res%~ END // cleric - - COPY ~iwdification/bam/cdid521a.bam~ ~override~ - ~iwdification/bam/cdid521b.bam~ ~override~ - ~iwdification/bam/cdid521c.bam~ ~override~ - ~iwdification/bam/cdiuwrdx.bam~ ~override~ - ~iwdification/vvc/cdiuwrdx.vvc~ ~override~ - ~iwdification/wav/cdiafp27.wav~ ~override~ - ~iwdification/wav/cdiarp28.wav~ ~override~ - - ACTION_IF !ee_game BEGIN - - COMPILE ~iwdification/baf/cdid521.baf~ - - OUTER_FOR (index = 9 ; index < 31 ; ++index) BEGIN - - COPY ~iwdification/eff/cdiuwr9.eff~ ~override/cdiuwr%index%.eff~ - WRITE_ASCIIE 0x30 "%DEST_RES%" #8 - - COPY ~iwdification/cre/cdiuwr9.cre~ ~override/cdiuwr%index%.cre~ - WRITE_BYTE 0x234 index - - END - - END - -END - -///// \\\\\ -///// CLERIC_ANIMAL_RAGE \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_ANIMAL_RAGE~) OR override_divine) BEGIN - - LAF cd_new_portrait_icon INT_VAR string = RESOLVE_STR_REF(@4340) STR_VAR bam_file = cdid522d RET icon END - - ADD_SPELL ~iwdification/spl/cdid522.spl~ 1 5 CLERIC_ANIMAL_RAGE - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4340 // name - SAY 0x50 @4341 // descript - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT STR_VAR match_resource = cdid522 resource = EVAL ~%DEST_RES%~ END - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 173 parameter2 = icon END - LPF ALTER_EFFECT INT_VAR match_opcode = 333 STR_VAR resource = cdid522b END - END ELSE BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 321 END - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 173 parameter2 = 83 END - LPF CLONE_EFFECT INT_VAR match_opcode = 33 opcode = 206 parameter1 = 0 parameter2 = 0 STR_VAR insert = last resource = EVAL ~%DEST_RES%~ END - LPF CD_CONVERT_333 STR_VAR 333spell = cdid522b END - LPF CD_CONVERT_9_255 END - END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid522.itm~ - SAY 0x0c @4340 - SAY 0x54 @4341 - LPF cd_scroll INT_VAR unusable0 = (BIT7 + BIT8 + BIT9 + BIT14 + BIT15 + BIT20 + BIT29) range = 1 price = 500 STR_VAR spell = EVAL ~%current_spell_res%~ END // druid - - COPY ~iwdification/spl/cdid522b.spl~ ~override~ - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 37605 parameter1 = string_berserk END - - COPY ~iwdification/bam/cdid522a.bam~ ~override~ - ~iwdification/bam/cdid522b.bam~ ~override~ - ~iwdification/bam/cdid522c.bam~ ~override~ - ~iwdification/bam/cdid522d.bam~ ~override~ - -END - -///// \\\\\ -///// CLERIC_MASS_CAUSE_LIGHT_WOUNDS \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_MASS_CAUSE_LIGHT_WOUNDS~) OR override_divine) BEGIN - - ADD_SPELL ~iwdification/spl/cdid523.spl~ 1 5 CLERIC_MASS_CAUSE_LIGHT_WOUNDS - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4350 // name - SAY 0x50 @4351 // descript - LPF ALTER_EFFECT STR_VAR match_resource = cdid523 resource = EVAL ~%DEST_RES%~ END - PATCH_IF !ee_game BEGIN - LPF CLONE_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 144 parameter2 = 4 STR_VAR resource = cdixd523 END // race = golem - LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 4 parameter2 = 3 STR_VAR resource = cdixd523 END // general = undead - LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 104 opcode = 177 parameter2 = 4 STR_VAR resource = cdixd523 END // race = parameter1 - LPF CD_SPLIT_SAVE_DAMAGE END - END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid523.itm~ - SAY 0x0c @4350 - SAY 0x54 @4351 - LPF cd_scroll INT_VAR unusable0 = (BIT2 + BIT3) target_hdr = 5 range = 20 price = 500 STR_VAR spell = EVAL ~%current_spell_res%~ END // evil only - - COPY ~iwdification/bam/cdid523a.bam~ ~override~ - ~iwdification/bam/cdid523b.bam~ ~override~ - ~iwdification/bam/cdid523c.bam~ ~override~ - ~iwdification/bam/cdicldam.bam~ ~override~ - ~iwdification/vvc/cdicldam.vvc~ ~override~ - ~iwdification/wav/cdiem103.wav~ ~override~ - - ACTION_IF !ee_game BEGIN - - COPY ~iwdification/eff/immunity.eff~ ~override/cdixd523.eff~ - WRITE_ASCIIE 0x30 ~%current_spell_res%~ #8 - - END - -END - -///// \\\\\ -///// CLERIC_ENTROPY_SHIELD \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_ENTROPY_SHIELD~) OR override_divine) BEGIN - - LAF cd_new_portrait_icon INT_VAR string = RESOLVE_STR_REF(@4360) STR_VAR bam_file = cdid615d RET icon END - - ADD_SPELL ~iwdification/spl/cdid615.spl~ 1 6 CLERIC_ENTROPY_SHIELD - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4360 // name - SAY 0x50 @4361 // descript - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT STR_VAR match_resource = cdid615 resource = EVAL ~%DEST_RES%~ END - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 56 parameter2 = icon END - END ELSE BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 321 END - LPF DELETE_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 56 END - LPF ALTER_EFFECT INT_VAR match_opcode = 318 opcode = 206 END - LPF CLONE_EFFECT INT_VAR match_opcode = 30 opcode = 206 parameter1 = 0 parameter2 = 0 STR_VAR insert = last resource = EVAL ~%DEST_RES%~ END - // iwdee/bgee/bg2ee/vanilla all match in projectiles until the 1pp slots for EE, so remove 1pp refs for vanilla (EEs all match, fortunately) - FOR (index = 282 ; index < 319 ; ++index) BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 83 match_parameter2 = index END - END - PATCH_IF FILE_EXISTS_IN_GAME ~1arow01.pro~ BEGIN // if 1pp is installed, re-add the references manually since they still may not sync with EE - PATCH_FOR_EACH proj IN // 1pp stuff - 1stafm0c 1arow01 1arow02 1arow03 1arow04 1arow05 1arow07 1arow10 1arow11 1arow15 1axe05 1axe08 1axe09 1axe10 1axe16 1bolt01 1bolt02 1bolt03 1bolt04 - 1bolt05 1bolt06 1bolt09 1bull02 1bull03 1bull04 1bull05 1bull06 1dagg05 1dagg11 1dagg12 1dagg16 1dart01 1dart02 1dart03 1dart04 1dart05 1dart08 - BEGIN - SET projids = IDS_OF_SYMBOL (~projectl~ ~%proj%~) - PATCH_IF projids > 0 BEGIN - LPF CLONE_EFFECT INT_VAR match_opcode = 83 match_parameter2 = 1 parameter2 = projids END - END - END - END - END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid615.itm~ - SAY 0x0c @4360 - SAY 0x54 @4361 - LPF cd_scroll INT_VAR target_hdr = 5 range = 1 price = 600 STR_VAR spell = EVAL ~%current_spell_res%~ END - - COPY ~iwdification/bam/cdid615a.bam~ ~override~ - ~iwdification/bam/cdid615b.bam~ ~override~ - ~iwdification/bam/cdid615c.bam~ ~override~ - ~iwdification/bam/cdid615d.bam~ ~override~ - ~iwdification/bam/cdiabjur.bam~ ~override~ - ~iwdification/bam/cdieshld.bam~ ~override~ - ~iwdification/vvc/cdiabjur.vvc~ ~override~ - ~iwdification/vvc/cdientro.vvc~ ~override~ - ~iwdification/wav/cdiafp03.wav~ ~override~ - -END - -///// \\\\\ -///// CLERIC_WHIRLWIND \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_WHIRLWIND~) OR override_divine) BEGIN - - ACTION_IF ee_game BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdiwhirl.pro~ - - END ELSE BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdiwhira.pro~ - - END - - ADD_SPELL ~iwdification/spl/cdid617.spl~ 1 6 CLERIC_WHIRLWIND - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4370 // name - SAY 0x50 @4371 // descript - PATCH_IF ee_game BEGIN - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdiwhirl END - LPF ALTER_EFFECT STR_VAR match_resource = cdid617 resource = EVAL ~%DEST_RES%~ END - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 35568 parameter1 = string_stunned END - END ELSE BEGIN - LPF ALTER_SPELL_HEADER INT_VAR projectile = 1 END - LPF DELETE_EFFECT END - LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 1 parameter2 = 2 resist_dispel = 2 duration = 120 STR_VAR resource = cdid617 END - END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid617.itm~ - SAY 0x0c @4370 - SAY 0x54 @4371 - LPF cd_scroll INT_VAR unusable0 = (BIT7 + BIT8 + BIT9 + BIT14 + BIT15 + BIT20 + BIT29) target_hdr = 4 range = 100 opcode = 148 target_eff = 1 price = 600 STR_VAR spell = EVAL ~%current_spell_res%~ END - - COPY ~iwdification/bam/cdid617a.bam~ ~override~ - ~iwdification/bam/cdid617b.bam~ ~override~ - ~iwdification/bam/cdid617c.bam~ ~override~ - ~iwdification/bam/cdiwhirx.bam~ ~override~ - ~iwdification/wav/cdiep105.wav~ ~override~ - - ACTION_IF !ee_game BEGIN - - COPY ~iwdification/spl/cdid617.spl~ ~override/cdid617b.spl~ - WRITE_LONG 0x08 "-1" - LPF DELETE_EFFECT INT_VAR match_opcode = 318 END - LPF DELETE_EFFECT INT_VAR match_opcode = 324 END - LPF ALTER_EFFECT STR_VAR match_resource = cdid617 resource = EVAL ~%DEST_RES%~ END - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 35568 parameter1 = string_stunned END - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdiwhira END - LPF ADD_SPELL_EFFECT INT_VAR opcode = 265 target = 1 parameter1 = 1 timing = 1 insert_point = 0 STR_VAR resource = cdizosa END - LPF ADD_SPELL_EFFECT INT_VAR opcode = 273 target = 1 timing = 1 resist_dispel = 3 insert_point = 0 STR_VAR resource = cdizosa END - PATCH_FOR_EACH race IN 146 118 119 142 101 102 145 144 127 199 BEGIN // dragon, syverns, slimes, giants, ankheg, basilisk, elemental, golem, otyugh, ettin - LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 2 parameter1 = race parameter2 = 4 duration = 1 insert_point = 0 STR_VAR resource = cdixd617 END - END - - COMPILE ~iwdification/baf/cdid617.baf~ - - COPY ~iwdification/cre/cdid617.cre~ ~override~ - ~iwdification/eff/cdid617.eff~ ~override~ - ~iwdification/eff/cdid617b.eff~ ~override~ - ~iwdification/vvc/cdiwhirx.vvc~ ~override~ - - COPY ~iwdification/eff/immunity.eff~ ~override/cdixd617.eff~ - WRITE_ASCII 0x30 ~cdid617b~ #8 - - END - -END - -///// \\\\\ -///// CLERIC_SPIRITUAL_WRATH \\\\\ -///// \\\\\ - -ACTION_IF (ee_game AND (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_SPIRITUAL_WRATH~) OR override_divine)) BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdi207.pro~ - ADD_PROJECTILE ~iwdification/pro/cdi312.pro~ - - ADD_SPELL ~iwdification/spl/cdid618.spl~ 1 6 CLERIC_SPIRITUAL_WRATH - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4380 // name - SAY 0x50 @4381 // descript - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi312 END - LPF ALTER_EFFECT STR_VAR match_resource = cdid618 resource = EVAL ~%DEST_RES%~ END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid618.itm~ - SAY 0x0c @4380 - SAY 0x54 @4381 - LPF cd_scroll INT_VAR unusable0 = (BIT12 + BIT21 + BIT30) target_hdr = 5 range = 100 price = 600 STR_VAR spell = EVAL ~%current_spell_res%~ END - - COPY_EXISTING ~cdi312.pro~ ~override~ - WRITE_SHORT 0x21a cdi207 - - COPY ~iwdification/bam/cdid618a.bam~ ~override~ - ~iwdification/bam/cdid618b.bam~ ~override~ - ~iwdification/bam/cdid618c.bam~ ~override~ - ~iwdification/bam/cdiliten.bam~ ~override~ - ~iwdification/vvc/cdiinvoc.vvc~ ~override~ - ~iwdification/wav/cdiep05.wav~ ~override~ - -END - -///// \\\\\ -///// CLERIC_SYMBOL_OF_PAIN \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_SYMBOL_OF_PAIN~) OR override_divine) BEGIN - - LAF cd_new_portrait_icon INT_VAR string = RESOLVE_STR_REF(@4393) STR_VAR bam_file = cdid714d RET icon END - - ADD_SPELL ~iwdification/spl/cdid714.spl~ 1 7 CLERIC_SYMBOL_OF_PAIN - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4390 // name - SAY 0x50 @4391 // descript - SAY 0x21e @4392 - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT STR_VAR match_resource = cdid714 resource = EVAL ~%DEST_RES%~ END - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 169 parameter2 = icon END - END ELSE BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 142 END - LPF DELETE_EFFECT INT_VAR match_opcode = 321 END - LPF DELETE_EFFECT INT_VAR match_opcode = 328 END - LPF CLONE_EFFECT INT_VAR match_opcode = 54 opcode = 206 parameter1 = 0 parameter2 = 0 STR_VAR insert = last resource = EVAL ~%DEST_RES%~ END - END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid714.itm~ - SAY 0x0c @4390 - SAY 0x54 @4391 - LPF cd_scroll INT_VAR unusable0 = (BIT12 + BIT21 + BIT30) target_hdr = 4 range = 35 opcode = 148 target_eff = 1 price = 700 STR_VAR spell = EVAL ~%current_spell_res%~ END // unusable by druid - - COPY ~iwdification/bam/cdid714a.bam~ ~override~ - ~iwdification/bam/cdid714b.bam~ ~override~ - ~iwdification/bam/cdid714c.bam~ ~override~ - ~iwdification/bam/cdid714d.bam~ ~override~ - ~iwdification/wav/cdiee04.wav~ ~override~ - ~iwdification/wav/cdiep02.wav~ ~override~ - -END - -///// \\\\\ -///// CLERIC_SYMBOL_OF_HOPELESSNESS \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_SYMBOL_OF_HOPELESSNESS~) OR override_divine) BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdi277.pro~ - - ADD_SPELL ~iwdification/spl/cdid716.spl~ 1 7 CLERIC_SYMBOL_OF_HOPELESSNESS - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4400 // name - SAY 0x50 @4401 // descript - SAY 0x1be @3003 - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi277 END - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 1280 parameter1 = string_stunned END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid716.itm~ - SAY 0x0c @4400 - SAY 0x54 @4401 - LPF cd_scroll INT_VAR unusable0 = (BIT12 + BIT21 + BIT30) target_hdr = 4 opcode = 148 target_eff = 1 price = 700 STR_VAR spell = EVAL ~%current_spell_res%~ END // cleric - - COPY ~iwdification/bam/cdid716a.bam~ ~override~ - ~iwdification/bam/cdid716b.bam~ ~override~ - ~iwdification/bam/cdid716c.bam~ ~override~ - ~iwdification/bam/cdiparal.bam~ ~override~ - ~iwdification/bam/cdishglp.bam~ ~override~ - ~iwdification/bam/cdisohx.bam~ ~override~ - ~iwdification/vvc/cdiparal.vvc~ ~override~ - ~iwdification/vvc/cdishglp.vvc~ ~override~ - ~iwdification/vvc/cdisohx.vvc~ ~override~ - ~iwdification/wav/cdiee04.wav~ ~override~ - ~iwdification/wav/cdiep02.wav~ ~override~ - -END - -///// \\\\\ -///// CLERIC_IMPERVIOUS_SANCTITY_OF_MIND \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_IMPERVIOUS_SANCTITY_OF_MIND~) OR override_divine) BEGIN - - LAF cd_new_portrait_icon INT_VAR string = RESOLVE_STR_REF(@4410) STR_VAR bam_file = cdid733d RET icon END - - ADD_SPELL ~iwdification/spl/cdid733.spl~ 1 7 CLERIC_IMPERVIOUS_SANCTITY_OF_MIND - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4410 // name - SAY 0x50 @4411 // descript - LPF ALTER_EFFECT INT_VAR match_opcode = 206 match_parameter1 = 4742 parameter1 = 0 END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 37613 parameter1 = string_sleep END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 37340 parameter1 = string_uncon END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 37605 parameter1 = string_berserk END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 35544 parameter1 = string_dominated END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 17392 parameter1 = string_dcharmed END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 37801 parameter1 = string_charmed END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 20568 parameter1 = string_mf_panic END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 35484 parameter1 = string_panic END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 37606 parameter1 = string_intoxicated END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 37604 parameter1 = string_confused END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 37603 parameter1 = string_rthinking END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 14102 parameter1 = string_held END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 35606 parameter1 = string_held END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 35542 parameter1 = string_paralyzed END - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 170 parameter2 = icon END - END ELSE BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 170 END - LPF DELETE_EFFECT INT_VAR match_opcode = 321 END - LPF ALTER_EFFECT INT_VAR match_opcode = 318 opcode = 206 parameter1 = 0 parameter2 = 0 END - END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid733.itm~ - SAY 0x0c @4410 - SAY 0x54 @4411 - LPF cd_scroll INT_VAR target_hdr = 5 price = 700 STR_VAR spell = EVAL ~%current_spell_res%~ END - - COPY ~iwdification/bam/cdid733a.bam~ ~override~ - ~iwdification/bam/cdid733b.bam~ ~override~ - ~iwdification/bam/cdid733c.bam~ ~override~ - ~iwdification/bam/cdid733d.bam~ ~override~ - ~iwdification/bam/cdiabjur.bam~ ~override~ - ~iwdification/vvc/cdiabjur.vvc~ ~override~ - ~iwdification/wav/cdiee03.wav~ ~override~ - ~iwdification/wav/cdiep01.wav~ ~override~ - -END - -///// \\\\\ -///// CLERIC_DESTRUCTION \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_DESTRUCTION~) OR override_divine) BEGIN - - ADD_SPELL ~iwdification/spl/cdid734.spl~ 1 7 CLERIC_DESTRUCTION - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4420 // name - SAY 0x50 @4421 // descript - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT STR_VAR match_resource = cdid734 resource = EVAL ~%DEST_RES%~ END - END ELSE BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 324 opcode = 177 parameter1 = 4 parameter2 = 3 STR_VAR resource = cdixd734 END // undead are immune - END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid734.itm~ - SAY 0x0c @4420 - SAY 0x54 @4421 - LPF cd_scroll INT_VAR unusable0 = (BIT2 + BIT3) range = 1 price = 700 STR_VAR spell = EVAL ~%current_spell_res%~ END // evil - - COPY ~iwdification/bam/cdid734a.bam~ ~override~ - ~iwdification/bam/cdid734b.bam~ ~override~ - ~iwdification/bam/cdid734c.bam~ ~override~ - ~iwdification/bam/cdidestr.bam~ ~override~ - ~iwdification/vvc/cdidestr.vvc~ ~override~ - ~iwdification/wav/cdiep113.wav~ ~override~ - - ACTION_IF !ee_game BEGIN - - COPY ~iwdification/eff/immunity.eff~ ~override/cdixd734.eff~ - WRITE_ASCIIE 0x30 ~%current_spell_res%~ #8 - - END - -END - -///// \\\\\ -///// CLERIC_GREATER_SHIELD_OF_LATHANDER \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_GREATER_SHIELD_OF_LATHANDER~) OR override_divine) BEGIN - - LAF cd_new_portrait_icon INT_VAR string = RESOLVE_STR_REF(@4430) STR_VAR bam_file = cdid735d RET icon END - - ADD_SPELL ~iwdification/spl/cdid735.spl~ 1 7 CLERIC_GREATER_SHIELD_OF_LATHANDER - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4430 // name - SAY 0x50 @4431 // descript - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT STR_VAR match_resource = cdid735 resource = EVAL ~%DEST_RES%~ END - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 165 parameter2 = icon END - END ELSE BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 165 END - LPF ALTER_EFFECT INT_VAR match_opcode = 324 opcode = 177 parameter1 = 3 parameter2 = 8 STR_VAR resource = cdixd735 END // evil are immune - END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid735.itm~ - SAY 0x0c @4430 - SAY 0x54 @4431 - LPF cd_scroll INT_VAR unusable0 = (BIT1 + BIT3 + BIT12 + BIT21 + BIT30) range = 1 price = 700 STR_VAR spell = EVAL ~%current_spell_res%~ END // good cleric - - COPY ~iwdification/bam/cdid735a.bam~ ~override~ - ~iwdification/bam/cdid735b.bam~ ~override~ - ~iwdification/bam/cdid735c.bam~ ~override~ - ~iwdification/bam/cdid735d.bam~ ~override~ - ~iwdification/bam/cdigsol1.bam~ ~override~ - ~iwdification/bam/cdigsol2.bam~ ~override~ - ~iwdification/vvc/cdilatg1.vvc~ ~override~ - ~iwdification/vvc/cdilatg2.vvc~ ~override~ - ~iwdification/wav/cdiafp26.wav~ ~override~ - - ACTION_IF !ee_game BEGIN - - COPY ~iwdification/eff/immunity.eff~ ~override/cdixd735.eff~ - WRITE_ASCIIE 0x30 ~%current_spell_res%~ #8 - - END - -END - -///// \\\\\ -///// CLERIC_MIST_OF_ELDATH \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_MIST_OF_ELDATH~) OR override_divine) BEGIN - - ACTION_IF ee_game BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdi307.pro~ - - END ELSE BEGIN - - ADD_PROJECTILE ~iwdification/pro/cdi307a.pro~ - - END - - ADD_SPELL ~iwdification/spl/cdid736.spl~ 1 7 CLERIC_MIST_OF_ELDATH - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4440 // name - SAY 0x50 @4441 // descript - PATCH_IF ee_game BEGIN - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi307 END - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 14022 parameter1 = string_healed END - END ELSE BEGIN - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi307a END - LPF DELETE_EFFECT END - LPF ADD_SPELL_EFFECT INT_VAR opcode = 177 target = 1 timing = 1 parameter2 = 2 STR_VAR resource = cdid736 END - END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid736.itm~ - SAY 0x0c @4440 - SAY 0x54 @4441 - LPF cd_scroll INT_VAR unusable0 = (BIT7 + BIT8 + BIT9 + BIT14 + BIT15 + BIT20 + BIT29) target_hdr = 4 range = 100 opcode = 148 target_eff = 1 price = 700 STR_VAR spell = EVAL ~%current_spell_res%~ END - - COPY ~iwdification/bam/cdid736a.bam~ ~override~ - ~iwdification/bam/cdid736b.bam~ ~override~ - ~iwdification/bam/cdid736c.bam~ ~override~ - ~iwdification/bam/cdimoeld.bam~ ~override~ - ~iwdification/wav/cdiep104.wav~ ~override~ - - ACTION_IF !ee_game BEGIN - - LAUNCH_ACTION_FUNCTION cd_create_cloud INT_VAR visloop = 7 cloud_dur = 6 zosa = 1 STR_VAR code = cdid736 anim = cdimoeld END - - COPY ~iwdification/spl/cdid736.spl~ ~override~ - WRITE_LONG 0x08 "-1" // name - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdi307a END - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 14022 parameter1 = string_healed END - LPF ADD_SPELL_EFFECT INT_VAR opcode = 206 target = 2 duration = 6 STR_VAR resource = cdid736 END - - END - -END - -///// \\\\\ -///// CLERIC_STALKER \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_STALKER~) OR override_divine) BEGIN - - ADD_SPELL ~iwdification/spl/cdid737.spl~ 1 7 CLERIC_STALKER - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4450 // name - SAY 0x50 @4451 // descript - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid737.itm~ - SAY 0x0c @4450 - SAY 0x54 @4451 - LPF cd_scroll INT_VAR unusable0 = (BIT7 + BIT8 + BIT9 + BIT14 + BIT15 + BIT20 + BIT29) target_hdr = 4 range = 100 opcode = 148 target_eff = 1 price = 700 STR_VAR spell = EVAL ~%current_spell_res%~ END - - COMPILE ~iwdification/baf/cdishamb.baf~ - - LAF cd_animation STR_VAR code = 7302 END // 29442 MEAE_SH shambling_mound - COPY ~iwdification/cre/cdishamb.cre~ ~override~ - SAY 0x08 @4452 - SAY 0x0c @4452 - - COPY ~iwdification/itm/cdishmbl.itm~ ~override~ - WRITE_LONG 0x08 string_attack - WRITE_LONG 0x0c string_attack - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT STR_VAR match_resource = shmblr resource = cdishmbl END - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 37709 parameter1 = string_entangled savingthrow = BIT1 END - LPF ALTER_EFFECT INT_VAR match_opcode = 12 savingthrow = BIT1 END - END ELSE BEGIN - LPF DELETE_EFFECT INT_VAR check_globals = 0 END - LPF ADD_ITEM_EFFECT INT_VAR type = 1 opcode = 177 target = 2 parameter1 = 4 parameter2 = 3 STR_VAR resource = cdixd737 END // general = undead - LPF ADD_ITEM_EFFECT INT_VAR type = 1 opcode = 177 target = 2 parameter1 = 144 parameter2 = 4 STR_VAR resource = cdixd737 END // race = golem - LPF ADD_ITEM_EFFECT INT_VAR type = 1 opcode = 177 target = 2 parameter1 = 145 parameter2 = 4 STR_VAR resource = cdixd737 END // race = elemental - LPF ADD_ITEM_EFFECT INT_VAR type = 1 opcode = 177 target = 2 parameter1 = 164 parameter2 = 4 STR_VAR resource = cdixd737 END // race = myconid - LPF ADD_ITEM_EFFECT INT_VAR type = 1 opcode = 146 target = 2 parameter2 = 1 STR_VAR resource = cdishmbl END - END - - COPY ~iwdification/bam/cdid737a.bam~ ~override~ - ~iwdification/bam/cdid737b.bam~ ~override~ - ~iwdification/bam/cdid737c.bam~ ~override~ - ~iwdification/bam/cdishmbl.bam~ ~override~ - - ACTION_IF !ee_game BEGIN - - COPY ~iwdification/spl/cdishmbl.spl~ ~override~ - LPF ALTER_EFFECT INT_VAR match_opcode = 139 match_parameter1 = 37709 parameter1 = string_entangled END - - COPY ~iwdification/eff/immunity.eff~ ~override/cdixd737.eff~ - WRITE_ASCII 0x30 ~cdishmbl~ #8 - - END - -END - -///// \\\\\ -///// CLERIC_ENERGY_DRAIN \\\\\ -///// \\\\\ - -ACTION_IF (!FILE_CONTAINS_EVALUATED(~spell.ids~ ~CLERIC_ENERGY_DRAIN~) OR override_divine) BEGIN - - ADD_SPELL ~iwdification/spl/cdid739.spl~ 1 7 CLERIC_ENERGY_DRAIN - SPRINT current_spell_res "%DEST_RES%" - SAY 0x08 @4460 // name - SAY 0x50 @4461 // descript - SAY 0x2ae @4462 - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT STR_VAR match_resource = cdid739 resource = EVAL ~%DEST_RES%~ END - END ELSE BEGIN - LPF CLONE_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 144 parameter2 = 4 STR_VAR resource = cdixd739 END // race = golem - LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 4 parameter2 = 3 STR_VAR resource = cdixd739 END // general = undead - LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 104 opcode = 177 parameter2 = 4 STR_VAR resource = cdixd739 END // race = parameter1 - END - - COPY ~iwdification/itm/blankpr.itm~ ~override/cdid739.itm~ - SAY 0x0c @4460 - SAY 0x54 @4461 - LPF cd_scroll INT_VAR unusable0 = (BIT2 + BIT3 + BIT12 + BIT21 + BIT30) range = 1 price = 700 STR_VAR spell = EVAL ~%current_spell_res%~ END - - COPY ~iwdification/bam/cdid739a.bam~ ~override~ - ~iwdification/bam/cdid739b.bam~ ~override~ - ~iwdification/bam/cdid739c.bam~ ~override~ - - ACTION_IF !ee_game BEGIN - - COPY ~iwdification/eff/immunity.eff~ ~override/cdixd739.eff~ - WRITE_ASCIIE 0x30 ~%current_spell_res%~ #8 - - END - -END - -///// \\\\\ -///// joinable spellbook adjustments \\\\\ -///// \\\\\ - -OUTER_SET NUM_d112 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_CURSE~)) - 1000) -OUTER_SET NUM_d114 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_CAUSE_LIGHT_WOUNDS~)) - 1000) -OUTER_SET NUM_d115 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_SUNSCORCH~)) - 1000) -OUTER_SET NUM_d217 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_CURE_MODERATE_WOUNDS~)) - 1000) -OUTER_SET NUM_d218 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_ALICORN_LANCE~)) - 1000) -OUTER_SET NUM_d219 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_BEAST_CLAW~)) - 1000) -OUTER_SET NUM_d220 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_CAUSE_MODERATE_WOUNDS~)) - 1000) -OUTER_SET NUM_d316 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_PRAYER~)) - 1000) -OUTER_SET NUM_d320 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_CAUSE_DISEASE~)) - 1000) -OUTER_SET NUM_d321 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_EXALTATION~)) - 1000) -OUTER_SET NUM_d322 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_MOONBLADE~)) - 1000) -OUTER_SET NUM_d323 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_CIRCLE_OF_BONES~)) - 1000) -OUTER_SET NUM_d324 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_SPIKE_GROWTH~)) - 1000) -OUTER_SET NUM_d325 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_CLOUDBURST~)) - 1000) -OUTER_SET NUM_d326 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_MOLD_TOUCH~)) - 1000) -OUTER_SET NUM_d327 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_STORM_SHELL~)) - 1000) -OUTER_SET NUM_d330 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_CAUSE_MEDIUM_WOUNDS~)) - 1000) -OUTER_SET NUM_d331 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_FAVOR_OF_ILMATER~)) - 1000) -OUTER_SET NUM_d418 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_GIANT_INSECT~)) - 1000) -OUTER_SET NUM_d419 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_PRODUCE_FIRE~)) - 1000) -OUTER_SET NUM_d420 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_STATIC_CHARGE~)) - 1000) -OUTER_SET NUM_d421 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_RECITATION~)) - 1000) -OUTER_SET NUM_d422 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_BLOOD_RAGE~)) - 1000) -OUTER_SET NUM_d423 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_CLOUD_OF_PESTILENCE~)) - 1000) -OUTER_SET NUM_d424 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_UNFAILING_ENDURANCE~)) - 1000) -OUTER_SET NUM_d425 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_STAR_METAL_CUDGEL~)) - 1000) -OUTER_SET NUM_d426 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_SMASHING_WAVE~)) - 1000) -OUTER_SET NUM_d427 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_THORN_SPRAY~)) - 1000) -OUTER_SET NUM_d428 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_WALL_OF_MOONLIGHT~)) - 1000) -OUTER_SET NUM_d518 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_RIGHTEOUS_WRATH_OF_THE_FAITHFUL~)) - 1000) -OUTER_SET NUM_d519 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_SPIKE_STONES~)) - 1000) -OUTER_SET NUM_d520 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_SHIELD_OF_LATHANDER~)) - 1000) -OUTER_SET NUM_d521 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_UNDEAD_WARD~)) - 1000) -OUTER_SET NUM_d522 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_ANIMAL_RAGE~)) - 1000) -OUTER_SET NUM_d523 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_MASS_CAUSE_LIGHT_WOUNDS~)) - 1000) -OUTER_SET NUM_d615 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_ENTROPY_SHIELD~)) - 1000) -OUTER_SET NUM_d617 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_WHIRLWIND~)) - 1000) -OUTER_SET NUM_d618 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_SPIRITUAL_WRATH~)) - 1000) -OUTER_SET NUM_d714 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_SYMBOL_OF_PAIN~)) - 1000) -OUTER_SET NUM_d716 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_SYMBOL_OF_HOPELESSNESS~)) - 1000) -OUTER_SET NUM_d733 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_IMPERVIOUS_SANCTITY_OF_MIND~)) - 1000) -OUTER_SET NUM_d734 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_DESTRUCTION~)) - 1000) -OUTER_SET NUM_d735 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_GREATER_SHIELD_OF_LATHANDER~)) - 1000) -OUTER_SET NUM_d736 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_MIST_OF_ELDATH~)) - 1000) -OUTER_SET NUM_d737 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_STALKER~)) - 1000) -OUTER_SET NUM_d739 = ((IDS_OF_SYMBOL (~spell~ ~CLERIC_ENERGY_DRAIN~)) - 1000) - -ACTION_FOR_EACH scroll IN - 112 114 115 217 218 219 220 316 320 321 322 323 324 325 326 327 330 331 418 419 420 421 422 423 424 425 426 427 428 518 519 520 521 522 523 615 617 618 714 716 734 735 736 737 738 -BEGIN - - ACTION_IF FILE_EXISTS_IN_GAME ~cdid%scroll%.itm~ BEGIN - - COPY ~iwdification/lib/divine_spellbooks.tpa~ ~iwdification/lib/divine_spellbooks.tpa~ - REPLACE_TEXTUALLY ~//NUM_d%scroll% ~ ~~ // could I be more lazy? maaaaaaybe. - - END - -END - -REINCLUDE ~iwdification/lib/divine_spellbooks.tpa~ - -COPY_EXISTING_REGEXP GLOB ~^.+\.cre$~ ~override~ - READ_LONG 0x1cc bio - PATCH_IF ((bio > 0) AND (bio < 999999)) BEGIN // joinable...ish - LPF CD_IWDIFICATION_SPELLBOOKS END - END - BUT_ONLY - -///// \\\\\ -///// divine spell crosspatching \\\\\ -///// \\\\\ - -ACTION_IF NUM_d422 > 0 BEGIN - - COPY_EXISTING ~sppr%NUM_d422%.spl~ ~override~ - PATCH_IF NUM_d714 > 0 BEGIN - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdid714 resource = EVAL ~sppr%NUM_d714%~ END - END - PATCH_IF NUM_d716 > 0 BEGIN - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdid716 resource = EVAL ~sppr%NUM_d716%~ END - END - BUT_ONLY - - ACTION_IF NUM_d321 > 0 BEGIN - - COPY_EXISTING ~sppr%NUM_d321%.spl~ ~override~ - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdid422 resource = EVAL ~sppr%NUM_a422%~ END - BUT_ONLY - - END - -END - -ACTION_IF NUM_d733 > 0 BEGIN - - COPY_EXISTING ~sppr%NUM_d733%.spl~ ~override~ - PATCH_IF NUM_d422 > 0 BEGIN - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdid422 resource = EVAL ~sppr%NUM_d422%~ END - END - PATCH_IF NUM_d716 > 0 BEGIN - LPF ALTER_EFFECT INT_VAR silent = 1 STR_VAR match_resource = cdid716 resource = EVAL ~sppr%NUM_d716%~ END - END - BUT_ONLY - -END - -ACTION_IF !ee_game BEGIN - - COPY_EXISTING ~cdibclaw.bam~ ~override~ - ~cdimoonb.bam~ ~override~ - ~cdismcud.bam~ ~override~ - READ_LONG 0x0c frame_off - WRITE_LONG frame_off + 0x04 0 - IF_EXISTS - -END - -///// \\\\\ -///// arcane-divine cross-patching \\\\\ -///// \\\\\ - -ACTION_IF MOD_IS_INSTALLED ~IWDIFICATION/SETUP-IWDIFICATION.TP2~ ~30~ THEN BEGIN - - INCLUDE ~iwdification/lib/cross_patch_both.tpa~ - -END - -/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ -/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ -///// \\\\\ -///// bard song \\\\\ -///// \\\\\ -/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ -/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ - -BEGIN @5000 DESIGNATED 50 - -APPEND ~clabba01.2da~ ~ABILITYX AP_CDIBAR0 **** GA_CDIBAR1 **** **** **** **** **** **** **** **** CDREPLACE -ABILITYY **** **** GA_CDIBAR2 **** GA_CDIBAR3 **** GA_CDIBAR4 **** GA_CDIBAR5 **** GA_CDIBAR6 CDREPLACE~ - -COPY_EXISTING ~clabba01.2da~ ~override~ - COUNT_2DA_COLS cols - FOR (index = 13 ; index < cols ; ++index) BEGIN - REPLACE_TEXTUALLY ~CDREPLACE~ ~**** CDREPLACE~ - END - REPLACE_TEXTUALLY ~CDREPLACE~ ~****~ - SET "ability" = 0 - REPLACE_EVALUATE ~^\(ABILITY[0-9A-Z]+\)[ %TAB%]~ BEGIN - SET "ability" = ("%ability%" + 1) - END - ~ABILITY%ability% ~ - PRETTY_PRINT_2DA - -ACTION_IF FILE_EXISTS_IN_GAME luba0.2da THEN BEGIN - - COPY_EXISTING ~luba0.2da~ ~override~ // remove enhanced bard song from HLAs - REPLACE_TEXTUALLY ~^\([0-9]+[ %TAB%]+AP_SPCL920[ %TAB%]+\*[ %TAB%]+\*[ %TAB%]+[0-9]+[ %TAB%]+[0-9]+[ %TAB%]+[0-9]+[ %TAB%]+\)\*\([ %TAB%]+\*[ %TAB%]+\*\)~ - ~\1SPCL920\2~ // create self-reference, never allowing it to be selected - PRETTY_PRINT_2DA - -END - -ADD_PROJECTILE ~iwdification/pro/cdivrnp.pro~ // visual range, non-party for siren's yearning - -LAF cd_new_portrait_icon INT_VAR string = RESOLVE_STR_REF(@5002) STR_VAR bam_file = cdibar0 RET cdibarap = icon END -LAF cd_new_portrait_icon INT_VAR string = RESOLVE_STR_REF(@5005) STR_VAR bam_file = cdibar0 RET cdibarbp = icon END -LAF cd_new_portrait_icon INT_VAR string = RESOLVE_STR_REF(@5008) STR_VAR bam_file = cdibar0 RET cdibarcp = icon END -LAF cd_new_portrait_icon INT_VAR string = RESOLVE_STR_REF(@5011) STR_VAR bam_file = cdibar0 RET cdibardp = icon END -LAF cd_new_portrait_icon INT_VAR string = RESOLVE_STR_REF(@5014) STR_VAR bam_file = cdibar0 RET cdibarep = icon END -LAF cd_new_portrait_icon INT_VAR string = RESOLVE_STR_REF(@5018) STR_VAR bam_file = cdibar0 RET cdibarfp = icon END - -COPY ~iwdification/bam/cdibar0.bam~ ~override~ - ~iwdification/bam/cdibara.bam~ ~override~ - ~iwdification/bam/cdibarb.bam~ ~override~ - ~iwdification/bam/cdibarc.bam~ ~override~ - ~iwdification/bam/cdibard.bam~ ~override~ - ~iwdification/bam/cdibare.bam~ ~override~ - ~iwdification/bam/cdibarf.bam~ ~override~ - ~iwdification/spl/cdibar0.spl~ ~override~ - -ACTION_IF ee_game BEGIN - - STRING_SET 9562 @5020 - - COPY ~iwdification/bam/cdibar0.bam~ ~override~ - ~iwdification/spl/cdibare0.spl~ ~override~ - -END ELSE BEGIN - - COPY ~iwdification/eff/immunity.eff~ ~override/cdibarex.eff~ - WRITE_ASCII 0x30 ~cdibare~ #8 - -END - -COPY ~iwdification/spl/cdibar1.spl~ ~override~ // The Ballad of Three Heroes - Combat Bonuses - SAY 0x08 @5001 - SAY 0x0c @5001 - SAY 0x50 @5003 - SAY 0x54 @5003 - -COPY ~iwdification/spl/cdibara.spl~ ~override~ - SAY 0x08 @5002 - SAY 0x0c @5002 - SAY 0x50 @5003 - SAY 0x54 @5003 - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 177 parameter2 = cdibarap END - END ELSE BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 321 END - LPF DELETE_EFFECT INT_VAR match_opcode = 324 END - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 177 parameter2 = 40 END - LPF ALTER_EFFECT INT_VAR match_duration = 7 timing = 10 duration = 100 END - END - -COPY ~iwdification/spl/cdibar2.spl~ ~override~ // The Tale of Curran Strongheart - Immunity Fear - SAY 0x08 @5004 - SAY 0x0c @5004 - SAY 0x50 @5006 - SAY 0x54 @5006 - -COPY ~iwdification/spl/cdibarb.spl~ ~override~ - SAY 0x08 @5005 - SAY 0x0c @5005 - SAY 0x50 @5006 - SAY 0x54 @5006 - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 111111 parameter1 = string_mf_panic END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 222222 parameter1 = string_panic END - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 178 parameter2 = cdibarbp END - END ELSE BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 321 END - LPF DELETE_EFFECT INT_VAR match_opcode = 324 END - LPF ALTER_EFFECT INT_VAR match_opcode = 318 opcode = 206 parameter1 = 0 parameter2 = 0 END - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 178 parameter2 = 40 END - LPF ALTER_EFFECT INT_VAR match_duration = 7 timing = 10 duration = 100 END - END - -COPY ~iwdification/spl/cdibar3.spl~ ~override~ // Tymora's Melody - Luck and Skill Bonuses - SAY 0x08 @5007 - SAY 0x0c @5007 - SAY 0x50 @5009 - SAY 0x54 @5009 - -COPY ~iwdification/spl/cdibarc.spl~ ~override~ - SAY 0x08 @5008 - SAY 0x0c @5008 - SAY 0x50 @5009 - SAY 0x54 @5009 - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 179 parameter2 = cdibarcp END - END ELSE BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 321 END - LPF DELETE_EFFECT INT_VAR match_opcode = 324 END - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 179 parameter2 = 40 END - LPF ALTER_EFFECT INT_VAR match_duration = 7 timing = 10 duration = 100 END - END - -COPY ~iwdification/spl/cdibar4.spl~ ~override~ // The Song of Kaudies - Resistant to Sound Attacks - SAY 0x08 @5010 - SAY 0x0c @5010 - SAY 0x50 @5012 - SAY 0x54 @5012 - -COPY ~iwdification/spl/cdibard.spl~ ~override~ - SAY 0x08 @5011 - SAY 0x0c @5011 - SAY 0x50 @5012 - SAY 0x54 @5012 - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 14002 parameter1 = string_silence END - LPF ALTER_EFFECT INT_VAR match_opcode = 267 match_parameter1 = 14676 parameter1 = string_silenced END - LPF ALTER_EFFECT INT_VAR match_opcode = 206 match_parameter1 = 4742 parameter1 = string_ineffective END - PATCH_FOR_EACH res IN - POWERWORD_KILL POWERWORD_STUN POWERWORD_BLIND PLAYER1_WORD_OF_POWER IRENICUS_WORD_OF_POWER DEMILICH_DEATH MOON_DOG_FEAR BANSHEE_WAIL ELVEN_GUARD_WAIL // bg2ee, bgee - WIZARD_SHOUT WIZARD_GREAT_SHOUT INNATE_MOURNFUL_WAIL INNATE_DEATH_KNELL INNATE_WAR_CRY INNATE_UNDYING_LAMENT INNATE_GREAT_ROAR INNATE_HARPY_WAIL_INTERNAL // iwdee, iwdification - BEGIN - SET num = IDS_OF_SYMBOL (~spell~ ~%res%~) - PATCH_IF num > 3999 BEGIN SET num -= 4000 SPRINT prefix spcl END - PATCH_IF num > 2999 BEGIN SET num -= 3000 SPRINT prefix spin END - PATCH_IF num > 1999 BEGIN SET num -= 2000 SPRINT prefix spwi END - PATCH_IF num > 999 BEGIN SET num -= 1000 SPRINT prefix sppr END - PATCH_IF num > 0 BEGIN - LPF ADD_SPELL_EFFECT INT_VAR opcode = 206 target = 3 parameter1 = string_ineffective duration = 7 probability1 = 50 STR_VAR resource = EVAL ~%prefix%%num%~ END - END - END - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 180 parameter2 = cdibardp END - END ELSE BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 321 END - LPF DELETE_EFFECT INT_VAR match_opcode = 324 END - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 180 parameter2 = 40 END - LPF ALTER_EFFECT INT_VAR match_duration = 7 timing = 10 duration = 100 END - END - -COPY ~iwdification/spl/cdibar5.spl~ ~override~ // The Siren's Yearning - Enthralls Creatures - SAY 0x08 @5013 - SAY 0x0c @5013 - SAY 0x50 @5015 - SAY 0x54 @5015 - -COPY ~iwdification/spl/cdibare.spl~ ~override~ - SAY 0x08 @5014 - SAY 0x0c @5014 - SAY 0x50 @5015 - SAY 0x54 @5015 - SAY 0x2ae @5016 - LPF ALTER_SPELL_HEADER INT_VAR projectile = cdivrnp END - LPF ALTER_EFFECT INT_VAR silent = 1 match_opcode = 267 match_parameter1 = 1280 parameter1 = string_stunned END - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 181 parameter2 = cdibarep END - END ELSE BEGIN - LPF CLONE_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 144 parameter2 = 4 STR_VAR resource = cdibarex END // race = golem - LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 55 opcode = 177 parameter1 = 4 parameter2 = 3 STR_VAR resource = cdibarex END // general = undead - LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 15 opcode = 177 parameter1 = 2 parameter2 = 4 STR_VAR resource = cdibarex END // race = elf - LPF ALTER_EFFECT INT_VAR match_opcode = 324 match_parameter2 = 19 opcode = 177 parameter1 = 3 parameter2 = 4 STR_VAR resource = cdibarex END // race = halfelf - LPF DELETE_EFFECT INT_VAR match_opcode = 321 END - LPF DELETE_EFFECT INT_VAR match_opcode = 324 END - LPF DELETE_EFFECT INT_VAR match_opcode = 232 END - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 181 parameter2 = 40 END - LPF ALTER_EFFECT INT_VAR match_duration = 7 timing = 10 duration = 100 END - END - -COPY ~iwdification/spl/cdibar6.spl~ ~override~ // War Chant of Sith - Armor Bonuses and Regeneration - SAY 0x08 @5017 - SAY 0x0c @5017 - SAY 0x50 @5019 - SAY 0x54 @5019 - -COPY ~iwdification/spl/cdibarf.spl~ ~override~ - SAY 0x08 @5018 - SAY 0x0c @5018 - SAY 0x50 @5019 - SAY 0x54 @5019 - PATCH_IF ee_game BEGIN - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 182 parameter2 = cdibarfp END - END ELSE BEGIN - LPF DELETE_EFFECT INT_VAR match_opcode = 321 END - LPF DELETE_EFFECT INT_VAR match_opcode = 324 END - LPF ALTER_EFFECT INT_VAR match_opcode = 142 match_parameter2 = 182 parameter2 = 40 END - LPF ALTER_EFFECT INT_VAR match_duration = 7 timing = 10 duration = 100 END - END - -/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ -/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ -///// \\\\\ -///// add two-handed axes \\\\\ -///// \\\\\ -/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ -/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\ - -BEGIN @6000 DESIGNATED 60 - -COPY ~iwdification/bam/cdax2h1i.bam~ ~override~ - ~iwdification/bam/cdax2h2i.bam~ ~override~ - ~iwdification/bam/cdax2h3i.bam~ ~override~ - ~iwdification/bam/cdax2h4i.bam~ ~override~ - ~iwdification/bam/cdax2h5i.bam~ ~override~ - ~iwdification/bam/cdax2h5i.bam~ ~override~ - ~iwdification/bam/cdax2h5i.bam~ ~override~ - ~iwdification/bam/cdax2h5s.bam~ ~override~ - ~iwdification/bam/cdax2h6i.bam~ ~override~ - ~iwdification/spl/cdax2h5b.spl~ ~override~ - -COPY ~iwdification/itm/cdax2h1.itm~ ~override~ // generic 2h axe - SAY 0x08 @6001 - SAY 0x0c @6001 - SAY 0x50 @6002 - SAY 0x54 @6002 - -COPY ~iwdification/itm/cdax2h2.itm~ ~override~ // +1 axe - SAY 0x08 @6001 - SAY 0x0c @6003 - SAY 0x50 @6002 - SAY 0x54 @6004 - -COPY ~iwdification/itm/cdax2h3.itm~ ~override~ // +2 axe - SAY 0x08 @6001 - SAY 0x0c @6005 - SAY 0x50 @6002 - SAY 0x54 @6006 - -COPY ~iwdification/itm/cdax2h4.itm~ ~override~ // +3 axe - SAY 0x08 @6001 - SAY 0x0c @6007 - SAY 0x50 @6002 - SAY 0x54 @6008 - -COPY ~iwdification/itm/cdax2h5.itm~ ~override~ // +4 axe - SAY 0x08 @6001 - SAY 0x0c @6009 - SAY 0x50 @6002 - SAY 0x54 @6010 - -COPY ~iwdification/itm/cdax2h6.itm~ ~override~ // +5 axe - SAY 0x08 @6001 - SAY 0x0c @6011 - SAY 0x50 @6002 - SAY 0x54 @6012 - -COPY ~iwdification/spl/cdax2h5g.spl~ ~override~ - SAY 0x08 @6013 - SAY 0x0c @6013 - SAY 0x50 @6013 - SAY 0x54 @6013 - READ_LONG 0x08 string1 - -COPY ~iwdification/spl/cdax2h6g.spl~ ~override~ - SAY 0x08 @6014 - SAY 0x0c @6014 - SAY 0x50 @6014 - SAY 0x54 @6014 - READ_LONG 0x08 string2 - -APPEND ~tooltip.2da~ ~cdax2h5 15529 %string1% -1 -cdax2h6 15529 %string2% -1~ - -COPY_EXISTING ~tooltip.2da~ ~override~ - PRETTY_PRINT_2DA - -///// \\\\\ -///// places axes in game \\\\\ -///// \\\\\ - -// add generic 2h axes to any store that sells generic 1h axes; same with +1 models -COPY_EXISTING_REGEXP GLOB ~^.+\.sto$~ ~override~ - READ_LONG 0x34 sale_off ELSE 0 - READ_LONG 0x38 sale_num ELSE 0 - SET ax_idx = 0 - SET ax1_idx = 0 - SET delta = 0 - FOR (index = 0 ; index < sale_num ; ++index) BEGIN - READ_ASCII (sale_off + (index * 0x1c)) item - PATCH_IF (("%item%" STRING_COMPARE_CASE "ax1h01" = 0) OR ("%item%" STRING_COMPARE_CASE "_ax1h01" = 0)) BEGIN // 1h axe - READ_ASCII (sale_off + (index * 0x1c)) clone (28) // read entry - SET ax_idx = (index + 1) // sets right after as insert point - END ELSE - PATCH_IF (("%item%" STRING_COMPARE_CASE "ax1h02" = 0) OR ("%item%" STRING_COMPARE_CASE "_ax1h02" = 0)) BEGIN // 1h axe +1 - READ_ASCII (sale_off + (index * 0x1c)) clone1 (28) // read entry - SET ax1_idx = (index + 1) // sets right after as insert point - END - END - PATCH_IF (ax1_idx > 0) BEGIN // if 1h axes present, add in 2h axes - INSERT_BYTES (sale_off + (ax1_idx * 0x1c)) 28 - WRITE_ASCIIE (sale_off + (ax1_idx * 0x1c)) ~%clone1%~ // clones 1h axe +1 entry - WRITE_ASCII (sale_off + (ax1_idx * 0x1c)) ~cdax2h2~ #8 // change to 2h axe +1 - SET delta += 1 - END - PATCH_IF (ax_idx > 0) BEGIN // if 1h axes present, add in 2h axes - INSERT_BYTES (sale_off + (ax_idx * 0x1c)) 28 - WRITE_ASCIIE (sale_off + (ax_idx * 0x1c)) ~%clone%~ // clones 1h axe entry - WRITE_ASCII (sale_off + (ax_idx * 0x1c)) ~cdax2h1~ #8 // change to 2h axe - SET delta += 1 - END - PATCH_IF (delta > 0) BEGIN - WRITE_LONG 0x38 (sale_num + delta) - PATCH_FOR_EACH offset IN 0x2c 0x4c 0x70 BEGIN - READ_LONG offset off - PATCH_IF (off > sale_off) BEGIN - WRITE_LONG offset (THIS + (delta * 0x1c)) - END +COPY_EXISTING_REGEXP GLOB ~^.+\.cre$~ ~override~ + SET add = 0 + READ_LONG 0x010 dual // block of flags including the dual-class bits + READ_BYTE 0x234 level1 // If dual-classed, this value is put in the next field, and this field is set to 1. + READ_BYTE 0x235 level2 // Highest attained level in secondary class (0-100) + READ_BYTE 0x236 level3 // Highest attained level in tertiary class (0-100) + READ_BYTE 0x273 class // V1.0 + PATCH_IF (((class = 4) AND (level1 > 6)) OR // single class thief, level > 6 + ((class = 10) AND (level3 > 6))) BEGIN // f/m/t, thief level > 6 + SET add = 1 + END ELSE + PATCH_IF ((class = 9) OR (class = 13) OR (class = 15)) BEGIN // ft, mt, or ct + PATCH_IF (((dual & BIT3) = BIT3) OR // f > t + ((dual & BIT4) = BIT4) OR // m > t dual + ((dual & BIT5) = BIT5)) BEGIN // c > t dual + PATCH_IF level1 > 6 BEGIN SET add = 1 END + END ELSE + PATCH_IF ((dual & BIT6) = BIT6) BEGIN // t > X dual + PATCH_IF ((level2 > 6) AND (level1 > level2)) BEGIN SET add = 1 END // only if thief lev > 6 and re-activated + END ELSE BEGIN // true multiclass + PATCH_IF level2 > 6 BEGIN SET add = 1 END END + END + PATCH_IF add BEGIN + LPF ADD_CRE_EFFECT INT_VAR opcode = 328 target = 1 parameter2 = 252 timing = 1 special = 1 STR_VAR effsource = cdievade END END - BUT_ONLY - -ACTION_IF ((FILE_EXISTS_IN_GAME ~garkla.cre~) OR (FILE_EXISTS_IN_GAME ~_garkla.cre~)) THEN BEGIN // bgt/bgee/tutu - - COPY_EXISTING_REGEXP GLOB ~_?garkla.cre~ ~override~ // garclax at the bandit camp - REPLACE_CRE_ITEM ~cdax2h3~ #0 #0 #0 ~NONE~ ~WEAPON1~ EQUIP TWOHANDED // add +2 axe to garclax in bandit camp - -END - -ACTION_IF ((FILE_EXISTS_IN_GAME ~ar0602.bcs~) AND (FILE_EXISTS_IN_GAME ~hlolaf.cre~)) THEN BEGIN // soa - - EXTEND_BOTTOM ~ar0602.bcs~ ~iwdification/baf/ar0602.baf~ // add generic 2H axe to CI - - COPY_EXISTING ~hlolaf.cre~ ~override~ - REPLACE_CRE_ITEM ~cdax2h3~ #0 #0 #0 ~NONE~ ~WEAPON1~ EQUIP TWOHANDED // add +2 axe to olaf at guarded compound - IF_EXISTS - -END - -ACTION_IF FILE_EXISTS_IN_GAME ~botsmith.bcs~ THEN BEGIN // tob - - EXTEND_BOTTOM ~ar3017.bcs~ ~iwdification/baf/ar3017.baf~ // add generic 2H axe to wk (pile of normal weapons for magic golems) - - EXTEND_BOTTOM ~botsmith.bcs~ ~iwdification/baf/botsmith.baf~ // cespy's upgrade of the +4 axe to +5 - COMPILE ~iwdification/dlg/botsmith.d~ - - // add +3 2h axes to any store that sells generic +3 1h axes (opening stores in ToB) - COPY_EXISTING ~amsmug01.sto~ ~override~ - ~amsmug02.sto~ ~override~ - ADD_STORE_ITEM ~cdax2h4~ AFTER ~ax1h17~ #0 #0 #0 ~IDENTIFIED~ #1 // +3 2h axe - - // add +3 2h axes to any store that sells generic +3 1h axes (opening stores in ToB) - COPY_EXISTING ~sarbar01.sto~ ~override~ - ADD_STORE_ITEM ~cdax2h4~ AFTER ~ax1h17~ #0 #0 #0 ~IDENTIFIED~ #3 // +3 2h axe - - COPY_EXISTING ~gromg04.cre~ ~override~ - REPLACE_CRE_ITEM ~cdax2h5~ #2 #2 #2 ~NONE~ ~WEAPON1~ EQUIP TWOHANDED // add +4 axe to one of gromnir's bodyguards - -END \ No newline at end of file + BUT_ONLY + \ No newline at end of file diff --git a/iwdification/sfo/doc/are library.docx b/iwdification/sfo/doc/are library.docx new file mode 100644 index 0000000..046404c Binary files /dev/null and b/iwdification/sfo/doc/are library.docx differ diff --git a/iwdification/sfo/doc/cre library.docx b/iwdification/sfo/doc/cre library.docx new file mode 100644 index 0000000..ccad074 Binary files /dev/null and b/iwdification/sfo/doc/cre library.docx differ diff --git a/iwdification/sfo/doc/kit library.docx b/iwdification/sfo/doc/kit library.docx new file mode 100644 index 0000000..ca5784b Binary files /dev/null and b/iwdification/sfo/doc/kit library.docx differ diff --git a/iwdification/sfo/doc/sfo.docx b/iwdification/sfo/doc/sfo.docx new file mode 100644 index 0000000..1329f5b Binary files /dev/null and b/iwdification/sfo/doc/sfo.docx differ diff --git a/iwdification/sfo/doc/table library.docx b/iwdification/sfo/doc/table library.docx new file mode 100644 index 0000000..9a413a8 Binary files /dev/null and b/iwdification/sfo/doc/table library.docx differ diff --git a/iwdification/sfo/doc/tools library.docx b/iwdification/sfo/doc/tools library.docx new file mode 100644 index 0000000..4dbe698 Binary files /dev/null and b/iwdification/sfo/doc/tools library.docx differ diff --git a/iwdification/sfo/doc/~$ble library.docx b/iwdification/sfo/doc/~$ble library.docx new file mode 100644 index 0000000..3a8861c Binary files /dev/null and b/iwdification/sfo/doc/~$ble library.docx differ diff --git a/iwdification/sfo/doc/~$sfo.docx b/iwdification/sfo/doc/~$sfo.docx new file mode 100644 index 0000000..b644ea3 Binary files /dev/null and b/iwdification/sfo/doc/~$sfo.docx differ diff --git a/iwdification/sfo/dw#kit.ids b/iwdification/sfo/dw#kit.ids new file mode 100644 index 0000000..566997a --- /dev/null +++ b/iwdification/sfo/dw#kit.ids @@ -0,0 +1,33 @@ +0x00000000 NONE +0x00004000 TRUECLASS +0x00000001 BERSERKER +0x00000002 WIZARDSLAYER +0x00000004 KENSAI +0x00000008 CAVALIER +0x00000010 INQUISITOR +0x00000020 UNDEADHUNTER +0x00000040 MAGESCHOOL_ABJURER +0x00000080 MAGESCHOOL_CONJURER +0x00000100 MAGESCHOOL_DIVINER +0x00000200 MAGESCHOOL_ENCHANTER +0x00000400 MAGESCHOOL_ILLUSIONIST +0x00000800 MAGESCHOOL_INVOKER +0x00001000 MAGESCHOOL_NECROMANCER +0x00002000 MAGESCHOOL_TRANSMUTER +0x00004000 MAGESCHOOL_GENERALIST +0x00008000 FERALAN +0x00010000 STALKER +0x00020000 BEASTMASTER +0x00040000 ASSASIN +0x00080000 BOUNTYHUNTER +0x00100000 SWASHBUCKLER +0x00200000 BLADE +0x00400000 JESTER +0x00800000 SKALD +0x01000000 GODTALOS +0x02000000 GODHELM +0x04000000 GODLATHANDER +0x08000000 TOTEMIC +0x10000000 SHAPESHIFTER +0x20000000 AVENGER +0x40000000 BARBARIAN diff --git a/iwdification/sfo/filetype/lib_are.tpa b/iwdification/sfo/filetype/lib_are.tpa new file mode 100644 index 0000000..ee2e59b --- /dev/null +++ b/iwdification/sfo/filetype/lib_are.tpa @@ -0,0 +1,1181 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// overarching clone +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION clone_area + INT_VAR allow_missing=0 silent=0 + STR_VAR + area="" + edits="" + editstring="" + BEGIN + LAUNCH_ACTION_FUNCTION clone_template + INT_VAR allow_missing silent + STR_VAR file_list= ~%area%~ + file_ext=~ARE~ + edits + editstring + + END +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// overarching edit +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION edit_area + INT_VAR allow_missing=0 silent=0 + STR_VAR + area="" + edits="" + editstring="" + BEGIN + LAUNCH_ACTION_FUNCTION edit_template + INT_VAR allow_missing silent + STR_VAR file_list= ~%area%~ + file_ext=~ARE~ + edits editstring + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// overarching install +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION install_area + INT_VAR allow_missing=0 silent=0 + STR_VAR + area="" + edits="" + editstring="" + location="" + locbase="" + locabs="" + BEGIN + LAUNCH_ACTION_FUNCTION install_template + INT_VAR allow_missing silent + STR_VAR file_list=~%area%~ + file_ext=~ARE~ + edits editstring location locbase locabs + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// overarching regexp +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION edit_all_areas + STR_VAR + edits="" + editstring="" + BEGIN + LAUNCH_ACTION_FUNCTION regexp_template + STR_VAR file_ext=~ARE~ + edits + editstring + END +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// offsets +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +<<<<<<<< area_offsets.2da +TYPE offset_loc offset_length entrynum_loc entrynum_length entry_length +actor 0x54 4 0x58 2 0x110 +trigger 0x5c 4 0x5a 2 0xc4 +spawn 0x60 4 0x64 4 0xc8 +entrance 0x68 4 0x6c 4 0x68 +container 0x70 4 0x74 2 0xc0 +item 0x78 4 0x76 2 0x14 +vertex 0x7c 4 0x80 2 0x4 +ambient 0x84 4 0x82 2 0xd4 +variable 0x88 4 0x8c 4 0x50 +explored 0xa0 4 0x9c 4 0 +door 0xa8 4 0xa4 4 0xc8 +animation 0xb0 4 0xac 4 0x4c +tiles 0xb8 4 0xb4 4 0 +songs 0xbc 4 0x0 0 0 +restspawn 0xc0 4 0x0 0 0 +mapnote 0xc4 4 0xc8 4 0x34 +projectile 0xcc 4 0xd0 4 0x1c +>>>>>>>> +OUTER_SPRINT has_secondaries_ARE_trigger "" +OUTER_SPRINT has_secondaries_ARE_container "" +OUTER_SPRINT has_secondaries_ARE_door "" + +OUTER_SPRINT ~offset_readin_lookup_2da~ ~area_offsets~ +OUTER_SPRINT ~offset_readin_file_ext~ ~ARE~ +LAUNCH_ACTION_MACRO read_in_offsets + +OUTER_SET $lookup_ARE_trigger_vertex_ind_loc(0)=0x2c +OUTER_SET $lookup_ARE_trigger_vertex_ind_length(0)=4 +OUTER_SET $lookup_ARE_trigger_vertex_num_loc(0)=0x2a +OUTER_SET $lookup_ARE_trigger_vertex_num_length(0)=2 + +OUTER_SET $lookup_ARE_container_vertex_ind_loc(0)=0x50 +OUTER_SET $lookup_ARE_container_vertex_ind_length(0)=4 +OUTER_SET $lookup_ARE_container_vertex_num_loc(0)=0x54 +OUTER_SET $lookup_ARE_container_vertex_num_length(0)=2 + +OUTER_SET $lookup_ARE_container_item_ind_loc(0)=0x40 +OUTER_SET $lookup_ARE_container_item_ind_length(0)=4 +OUTER_SET $lookup_ARE_container_item_num_loc(0)=0x44 +OUTER_SET $lookup_ARE_container_item_num_length(0)=4 + +OUTER_SET $lookup_ARE_door_vertex_ind_loc(0)=0x2c +OUTER_SET $lookup_ARE_door_vertex_ind_loc(1)=0x34 +OUTER_SET $lookup_ARE_door_vertex_ind_loc(2)=0x48 +OUTER_SET $lookup_ARE_door_vertex_ind_loc(3)=0x50 +OUTER_SET $lookup_ARE_door_vertex_num_loc(0)=0x30 +OUTER_SET $lookup_ARE_door_vertex_num_loc(1)=0x32 +OUTER_SET $lookup_ARE_door_vertex_num_loc(2)=0x4c +OUTER_SET $lookup_ARE_door_vertex_num_loc(3)=0x4e +OUTER_FOR (i=0;i<4;i+=1) BEGIN + OUTER_SET $lookup_ARE_door_vertex_ind_length("%i%")=4 + OUTER_SET $lookup_ARE_door_vertex_num_length("%i%")=2 +END + +OUTER_SPRINT $ARE_virtual_type_parent(item) container +OUTER_SPRINT $ARE_virtual_type_child(item) item +OUTER_SET $ARE_virtual_type_index(item)=0 + +OUTER_SPRINT $ARE_virtual_type_parent(trigger_vertex) trigger +OUTER_SPRINT $ARE_virtual_type_child(trigger_vertex) vertex +OUTER_SET $ARE_virtual_type_index(trigger_vertex)=0 + +OUTER_SPRINT $ARE_virtual_type_parent(container_vertex) container +OUTER_SPRINT $ARE_virtual_type_child(container_vertex) vertex +OUTER_SET $ARE_virtual_type_index(container_vertex)=0 + +OUTER_SPRINT $ARE_virtual_type_parent(door_vertex_open) door +OUTER_SPRINT $ARE_virtual_type_child(door_vertex_open) vertex +OUTER_SET $ARE_virtual_type_index(door_vertex_open)=0 + +OUTER_SPRINT $ARE_virtual_type_parent(door_vertex_closed) door +OUTER_SPRINT $ARE_virtual_type_child(door_vertex_closed) vertex +OUTER_SET $ARE_virtual_type_index(door_vertex_closed)=1 + +OUTER_SPRINT $ARE_virtual_type_parent(door_vertex_open_impeded) door +OUTER_SPRINT $ARE_virtual_type_child(door_vertex_open_impeded) vertex +OUTER_SET $ARE_virtual_type_index(door_vertex_open_impeded)=2 + +OUTER_SPRINT $ARE_virtual_type_parent(door_vertex_closed_impeded) door +OUTER_SPRINT $ARE_virtual_type_child(door_vertex_closed_impeded) vertex +OUTER_SET $ARE_virtual_type_index(door_vertex_closed_impeded)=3 + +OUTER_SPRINT $ARE_vertex_secondaries_follow(container) trigger +OUTER_SPRINT $ARE_vertex_secondaries_follow(door) container + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// simple data-field edits - absolute +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +ACTION_DEFINE_ASSOCIATIVE_ARRAY are_fields_absolute BEGIN + rain_probability=>~0x4a,SHORT~ + snow_probability=>~0x4c,SHORT~ + fog_probability=>~0x4e,SHORT~ + lightning_probability=>~0x50,SHORT~ + area_script=>~0x94,ASCII~ + wed=>~0x8,ASCII~ + to_north=>~0x18,ASCII~ + to_east=>~0x24,ASCII~ + to_west=>~0x3c,ASCII~ + to_south=>~0x30,ASCII~ + restmovie_day=>~0xd4,ASCII~ + restmove_night=>~0xdc,ASCII~ +END + +LAUNCH_ACTION_FUNCTION build_simple_data_field_editors STR_VAR lookup_table=are_fields_absolute function_prefix=ARE END + + +ACTION_DEFINE_ASSOCIATIVE_ARRAY are_bit_fields_absolute BEGIN + outdoor=>~0x48,0~ + day_night=>~0x48,1~ + weather=>~0x48,2~ + city=>~0x48,3~ + forest=>~0x48,4~ + dungeon=>~0x48,5~ + extended_night=>~0x48,6~ + rest_indoors=>~0x48,7~ +END + +LAF build_flag_data_field_editors STR_VAR lookup_table=are_bit_fields_absolute function_prefix=ARE END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// simple data-field edits - relative to offsets +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +ACTION_DEFINE_ASSOCIATIVE_ARRAY are_fields BEGIN + actorname => ~0x0,ASCII20~ + actor_name => ~0x0,ASCII20~ + script_override=>~0x50,ASCII~ + script_class => ~0x60,ASCII~ + script_race => ~0x68,ASCII~ + script_general => ~0x58,ASCII~ + script_default => ~0x70,ASCII~ + script_specifics => ~0x78,ASCII~ + crefile => ~0x80,ASCII~ + actor_resource => ~0x80,ASCII~ + actor_x_coord_start => ~0x20,SHORT~ + actor_y_coord_start => ~0x22,SHORT~ + actor_x_coord_dest => ~0x24,SHORT~ + actor_y_coord_dest => ~0x26,SHORT~ + actor_removal_timer => ~0x38,LONG~ + dialog => ~0x48,ASCII~ + door_name=>~0x0,ASCII20~ + door_id=>~0x20,ASCII~ + door_icon=>~0x7c,LONG~ + door_script=>~0x80,ASCII~ + door_dialog=>~0xb8,ASCII~ + door_lock_difficulty=>~0x8c,LONG~ + door_trap_detection_difficulty=>~0x6c,SHORT~ + door_trap_removal_difficulty=>~0x6e,SHORT~ + door_is_trapped=>~0x70,SHORT~ + door_open_bb_left=>~0x38,SHORT~ + door_open_bb_top=>~0x3a,SHORT~ + door_open_bb_right=>~0x3c,SHORT~ + door_open_bb_bottom=>~0x3e,SHORT~ + door_closed_bb_left=>~0x40,SHORT~ + door_closed_bb_top=>~0x42,SHORT~ + door_closed_bb_right=>~0x44,SHORT~ + door_closed_bb_bottom=>~0x46,SHORT~ + container_name=>~0x0,ASCII20~ + container_xloc=>~0x20,SHORT~ + container_yloc=>~0x22,SHORT~ + container_type=>~0x24,SHORT~ + container_lock_difficulty=>~0x26,SHORT~ + container_trap_detection_difficulty=>~0x2c, SHORT~ + container_trap_removal_difficulty=>~0x2e, SHORT~ + container_trapped=>~0x30,SHORT~ + container_trap_detected=>~0x32,SHORT~ + container_trap_xloc=>~0x34,SHORT~ + container_trap_yloc=>~0x36,SHORT~ + // inaccurate legacy names + container_top_left=>~0x38,SHORT~ + container_top_right=>~0x3a,SHORT~ + container_bottom_right=>~0x3c,SHORT~ + container_bottom_left=>~0x3e,SHORT~ + + container_bb_left=>~0x38,SHORT~ + container_bb_top=>~0x3a,SHORT~ + container_bb_right=>~0x3c,SHORT~ + container_bb_bottom=>~0x3e,SHORT~ + + container_script=>~0x48,ASCII~ + container_key=>~0x78,ASCII~ + container_lockpick_strref=>~0x84,LONG~ + entrance_name=>~0x0,ASCII20~ + entrance_xloc=>~0x20,SHORT~ + entrance_yloc=>~0x22,SHORT~ + entrance_orientation=>~0x24,SHORT~ + trigger_name=>~0x0,ASCII20~ + destination=>~0x38,ASCII~ + trigger_type =>~0x20,SHORT~ + trigger_cursor=>~0x34,LONG~ + trigger_info=>~0x64,LONG~ + trigger_script=>~0x7c,ASCII~ + trigger_dest=>~0x38,ASCII~ + trigger_entrance=>~0x40,ASCII20~ + trigger_bbleft=>~0x22,SHORT~ + trigger_bbtop=>~0x24,SHORT~ + trigger_bbright=>~0x26,SHORT~ + trigger_bbbottom=>~0x28,SHORT~ + trigger_flags=>~0x60,LONG~ + is_trapped=>~0x6c,SHORT~ + trap_detected=>~0x6e,SHORT~ + trap_detection_difficulty=>~0x68,SHORT~ + trap_removal_difficulty=>~0x6a,SHORT~ + trigger_trap_xloc=>~0x70,SHORT~ + trigger_trap_yloc=>~0x72,SHORT~ + trigger_alt_xloc=>~0x84,SHORT~ + trigger_alt_yloc=>~0x86,SHORT~ + spawn_name=>~0x0,ASCII20~ + spawn_xloc=>~0x20,SHORT~ + spawn_yloc=>~0x22,SHORT~ + spawn_creature1=>~0x24,ASCII~ + spawn_creature2=>~0x2c,ASCII~ + spawn_creature3=>~0x34,ASCII~ + spawn_creature4=>~0x3c,ASCII~ + spawn_creature5=>~0x44,ASCII~ + spawn_creature6=>~0x4c,ASCII~ + spawn_creature7=>~0x54,ASCII~ + spawn_creature8=>~0x5c,ASCII~ + spawn_creature9=>~0x64,ASCII~ + spawn_creature10=>~0x6c,ASCII~ + spawn_count=>~0x74,SHORT~ + spawn_base_number=>~0x76,SHORT~ + spawn_frequency=>~0x78,SHORT~ + spawn_method=>~0x7a,SHORT~ + spawn_maximum=>~0x84,SHORT~ + spawn_probability_day=>~0x8c,SHORT~ + spawn_probability_night=>~0x8e,SHORT~ + spawn_ee_weight1=>~0x98,BYTE~ + spawn_ee_weight2=>~0x99,BYTE~ + spawn_ee_weight3=>~0x9a,BYTE~ + spawn_ee_weight4=>~0x9b,BYTE~ + spawn_ee_weight5=>~0x9c,BYTE~ + spawn_ee_weight6=>~0x9d,BYTE~ + spawn_ee_weight7=>~0x9e,BYTE~ + spawn_ee_weight8=>~0x9f,BYTE~ + spawn_ee_weight9=>~0xa0,BYTE~ + spawn_ee_weight10=>~0xa1,BYTE~ + restspawn_strref1=>~0x20,LONG~ + restspawn_strref2=>~0x24,LONG~ + restspawn_strref3=>~0x28,LONG~ + restspawn_strref4=>~0x2c,LONG~ + restspawn_strref5=>~0x30,LONG~ + restspawn_strref6=>~0x34,LONG~ + restspawn_strref7=>~0x38,LONG~ + restspawn_strref8=>~0x3c,LONG~ + restspawn_strref9=>~0x40,LONG~ + restspawn_strref10=>~0x44,LONG~ + restspawn_count=>~0x98,SHORT~ + restspawn_creature1=>~0x48,ASCII~ + restspawn_creature2=>~0x50,ASCII~ + restspawn_creature3=>~0x58,ASCII~ + restspawn_creature4=>~0x60,ASCII~ + restspawn_creature5=>~0x68,ASCII~ + restspawn_creature6=>~0x70,ASCII~ + restspawn_creature7=>~0x78,ASCII~ + restspawn_creature8=>~0x80,ASCII~ + restspawn_creature9=>~0x88,ASCII~ + restspawn_creature10=>~0x90,ASCII~ + restspawn_probability_day=>~0xa8,SHORT~ + restspawn_probability_night=>~0xaa,SHORT~ + restspawn_max_number=>~0xa4,SHORT~ + restspawn_enabled=>~0xa6,SHORT~ + restspawn_removal=>~0x9c,LONG~ + restspawn_maximum=>~0xa4,SHORT~ + restspawn_difficulty=>~0x9a,SHORT~ + restspawn_wander=>~0xa0,SHORT~ + restspawn_follow=>~0xa2,SHORT~ + animation_name=> ~0x0,ASCII20~ + animation_resource=> ~0x28,ASCII~ + animation_height=> ~0x38,SHORT~ + animation_xloc=>"0x20,SHORT" + animation_yloc=>"0x22,SHORT" + animation_active=>"0x24,LONG" + ambient_name=> ~0x0,ASCII20~ + ambient_xloc=>"0x20,SHORT" + ambient_yloc=>"0x22,SHORT" + ambient_radius=>"0x24,SHORT" + ambient_base_time=>"0x84,LONG" + ambient_time_deviation=>"0x88,LONG" + ambient_volume=>"0x2e,SHORT" + ambient_sound1=>"0x30,ASCII" + ambient_sound2=>"0x38,ASCII" + ambient_sound3=>"0x40,ASCII" + ambient_sound4=>"0x48,ASCII" + ambient_sound5=>"0x50,ASCII" + ambient_sound6=>"0x58,ASCII" + ambient_sound7=>"0x60,ASCII" + ambient_sound8=>"0x68,ASCII" + ambient_sound9=>"0x70,ASCII" + ambient_sound10=>"0x78,ASCII" + ambient_sound_number=>"0x80,SHORT" + ambient_active=>"0x8c,LONG" + mapnote_xloc=>"0x0,SHORT" + mapnote_yloc=>"0x2,SHORT" + mapnote_text=>"0x4,LONG" + mapnote_text_loc=>"0x8,SHORT" + mapnote_color=>"0xa,SHORT" +END +LAUNCH_ACTION_FUNCTION build_simple_data_field_editors STR_VAR lookup_table=are_fields offset_base=yes function_prefix=ARE END + +ACTION_DEFINE_ASSOCIATIVE_ARRAY are_child_fields BEGIN + item_resource => ~0x0,ASCII~ + item_charges_1 => ~0xa,SHORT~ + item_charges_2 => ~0xc,SHORT~ + item_charges_3 => ~0xe,SHORT~ + vertex_xloc=>"0x0,SHORT" + vertex_yloc=>"0x2,SHORT" +END +LAF build_simple_data_field_editors STR_VAR lookup_table=are_child_fields offset_base=yes function_prefix=ARE secondary="yes" END + + +ACTION_DEFINE_ASSOCIATIVE_ARRAY are_bit_fields BEGIN + + + // exits / triggers + trap_undetectable => ~0x60,0~ + reset_trap => ~0x60,1~ + party_required => ~0x60,2~ + trap_detectable => ~0x60,3~ + trap_set_off_by_NPC => ~0x60,6~ + trigger_deactivated => ~0x61,0~ + impassable_by_NPC => ~0x61,1~ + use_activation_point => ~0x61,2~ + // ambients + ambient_enabled=>~0x90,0~ + ambient_looping=>~0x90,1~ + ambient_ignore_radius=>~0x90,2~ + ambient_random_order=>~0x90,3~ + // animations + animation_enabled =>~0x34,0~ + animation_transparent_black=>~0x34,1~ + animation_non_self_illumination=>~0x34,2~ + animation_partial=>~0x34,3~ + animation_synchronised=>~0x34,4~ + animation_wall_does_not_hide=>~0x34,6~ + animation_invisible_in_dark=>~0x34,7~ + animation_not_cover=>~0x35,0~ + animation_play_all_frames=>~0x35,1~ + animation_palette=>~0x35,2~ + animation_mirrored=>~0x35,3~ + animation_show_in_combat=>~0x35,4~ + // actors + actor_present_0=>~0x40,0~ + actor_present_1=>~0x40,1~ + actor_present_2=>~0x40,2~ + actor_present_3=>~0x40,3~ + actor_present_4=>~0x40,4~ + actor_present_5=>~0x40,5~ + actor_present_6=>~0x40,6~ + actor_present_7=>~0x40,7~ + actor_present_8=>~0x41,0~ + actor_present_9=>~0x41,1~ + actor_present_10=>~0x41,2~ + actor_present_11=>~0x41,3~ + actor_present_12=>~0x41,4~ + actor_present_13=>~0x41,5~ + actor_present_14=>~0x41,6~ + actor_present_15=>~0x41,7~ + actor_present_16=>~0x42,0~ + actor_present_17=>~0x42,1~ + actor_present_18=>~0x42,2~ + actor_present_19=>~0x42,3~ + actor_present_20=>~0x42,4~ + actor_present_21=>~0x42,5~ + actor_present_22=>~0x42,6~ + actor_present_23=>~0x42,7~ + // baseline + save_not_allowed=>~0x14,0~ + player1_can_die=>~0x14,4~ + // containers + container_disabled=>~0x28,5~ + container_locked=>~0x28,0~ + // doors + door_open=>~0x28,0~ + door_locked=>~0x28,1~ + override_script_name=>~0x28,3~ // also for actors + invulnerable=>~0x28,2~ + dont_block_line_of_sight=>~0x29,2~ + +END + +LAF build_flag_data_field_editors STR_VAR lookup_table=are_bit_fields offset_base=yes function_prefix=ARE END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// IDS-based data-field edits +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +ACTION_DEFINE_ASSOCIATIVE_ARRAY ~are_ids_fields~ BEGIN + actor_animation=>~0x30,LONG,ANIMATE~ +END + +LAUNCH_ACTION_FUNCTION build_IDS_data_field_editors STR_VAR lookup_table=are_ids_fields function_prefix=ARE END + + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// composite data-field edits +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION ARE_actor_orientation + STR_VAR arguments="" +BEGIN + PATCH_IF IS_AN_INT arguments BEGIN + WRITE_SHORT (0x34 + offset_base) arguments + END ELSE BEGIN + WRITE_SHORT (0x34 + offset_base) IDS_OF_SYMBOL (dir "%arguments%") + END +END + +DEFINE_PATCH_FUNCTION ARE_reset_edge_flags + STR_VAR arguments="" +BEGIN + WRITE_LONG 0x20 0 + WRITE_LONG 0x2c 0 + WRITE_LONG 0x38 0 + WRITE_LONG 0x44 0 +END + +DEFINE_PATCH_FUNCTION ARE_wipe_rest_block + STR_VAR arguments="" +BEGIN + READ_LONG 0xc0 offset + WRITE_ASCII offset "" (0xe4) +END + + + +DEFINE_PATCH_FUNCTION ARE_actor_defaults + STR_VAR arguments="" +BEGIN + LPF ARE_read_actor_resource RET actorname=value END + PATCH_IF FILE_EXISTS_IN_GAME "%actorname%.cre" BEGIN + INNER_ACTION BEGIN + COPY_EXISTING "%actorname%.cre" override + READ_LONG 0x28 animation + BUT_ONLY + END + WRITE_LONG (0x30+offset_base) animation + END + LPF ARE_actor_present_always END + WRITE_LONG (offset_base+0x38) "-1" +END + +DEFINE_PATCH_FUNCTION ARE_actor_x_coord + STR_VAR arguments="" +BEGIN + LAUNCH_PATCH_FUNCTION ARE_actor_x_coord_start STR_VAR arguments END + LAUNCH_PATCH_FUNCTION ARE_actor_x_coord_dest STR_VAR arguments END +END + +DEFINE_PATCH_FUNCTION ARE_actor_y_coord + STR_VAR arguments="" +BEGIN + LAUNCH_PATCH_FUNCTION ARE_actor_y_coord_start STR_VAR arguments END + LAUNCH_PATCH_FUNCTION ARE_actor_y_coord_dest STR_VAR arguments END +END +DEFINE_PATCH_FUNCTION ARE_wipe_spawns +BEGIN + WRITE_ASCII 0x24+offset_base ~~ (0x50) +END + +DEFINE_PATCH_FUNCTION ARE_actor_present_always + STR_VAR arguments="" +BEGIN + WRITE_BYTE (offset_base + 0x40) "-1" + WRITE_BYTE (offset_base + 0x41) "-1" + WRITE_BYTE (offset_base + 0x42) "-1" +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// baseline data - for adding actors +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION ARE_actor_baseline +BEGIN + WRITE_LONG offset_base + 0x28 9 // CRE loaded=unknown [seems to be default] + WRITE_LONG offset_base + 0x40 0xffffffff // present at all times + WRITE_LONG offset_base + 0x38 "-1" // never remove actor + WRITE_LONG offset_base + 0x30 "57376" // default animation + +END +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// looks for a script anywhere and returns 1 if true +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION ARE_match_script + STR_VAR + arguments="" + RET + value +BEGIN + SET value=0 + PATCH_FOR_EACH script IN override class race general default specifics BEGIN + LPF ~ARE_read_script_%script%~ RET scriptvalue=value END + PATCH_IF ~%scriptvalue%~ STRING_EQUAL_CASE ~%arguments%~ BEGIN + SET value=1 + END + END +END +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// swaps a script +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +DEFINE_PATCH_FUNCTION ARE_swap_scripts + STR_VAR + arguments="" +BEGIN + LPF return_first_pair STR_VAR list= ~%arguments%~ RET oldscript=key newscript=value END + PATCH_IF "%newscript%" STRING_EQUAL_CASE null BEGIN + SPRINT newscript "" + END + PATCH_FOR_EACH script IN override class race general default specifics BEGIN + LPF ~ARE_read_script_%script%~ RET scriptvalue=value END + PATCH_IF ~%scriptvalue%~ STRING_EQUAL_CASE ~%oldscript%~ BEGIN + LPF ~ARE_script_%script%~ STR_VAR arguments= ~%newscript%~ END + END + END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("ARE_swap_scripts") "" + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// reorders scripts so that identified script (which should be in the allocated scripts) is at the bottom +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION ARE_move_script_to_bottom + STR_VAR arguments="" +BEGIN + CLEAR_ARRAY temp_array + WHILE "%arguments%" STRING_COMPARE_CASE "" BEGIN + LPF return_first_entry STR_VAR list="%arguments%" RET entry arguments=list END + TO_LOWER entry + SPRINT $temp_array("%entry%") "" + END + READ_ASCII offset_base actorname (0x20) + READ_ASCII (offset_base+0x80) actorresource + SET found_script=0 + SET lowest_slot=0 + SET last_slot=0 + FOR (slot=0;slot<6;slot+=1) BEGIN + READ_ASCII (offset_base + 0x50 + 8*slot) script + TO_LOWER script + PATCH_IF "%script%" STRING_COMPARE_CASE "" BEGIN + PATCH_IF found_script BEGIN + WRITE_ASCIIE (offset_base + 0x50 + 8*last_slot) "%script%" (8) + WRITE_ASCIIE (offset_base + 0x50 + 8*slot) "%lower_script%" (8) + SET last_slot=slot + END ELSE BEGIN + PATCH_IF VARIABLE_IS_SET $temp_array("%script%") BEGIN + SET found_script=1 + SET last_slot=slot + SPRINT lower_script "%script%" + END + END + END + END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("ARE_move_script_to_bottom") "" + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// gets the area script (and allocates one if needed) +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +DEFINE_ACTION_FUNCTION get_area_script + STR_VAR area="" + RET script +BEGIN + COPY_EXISTING ~%area%.are~ ~override~ + LPF ARE_read_area_script RET script=value END + PATCH_IF (~%script%~ STRING_EQUAL_CASE ~none~ || ~%script%~ STRING_EQUAL_CASE ~~) BEGIN + INNER_PATCH_SAVE ~script~ ~%area%~ BEGIN + READ_ASCII 0x0 fwcheck (2) + PATCH_IF ~%fwcheck%~ STRING_EQUAL_CASE ~FW~ BEGIN + INSERT_BYTES 0x0 1 + WRITE_ASCII 0x0 ~_AR~ + END + END + LPF ARE_area_script STR_VAR arguments= ~%script%~ END + END + BUT_ONLY + ACTION_IF !FILE_EXISTS_IN_GAME ~%script%.bcs~ BEGIN + <<<<<<<< %script%.baf + >>>>>>>> + COMPILE ~%script%.baf~ + END + +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// extends the area script +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION extend_area_script + STR_VAR area="" + top="" + bottom="" + location="" + variables="" + inline="no" + ssl="no" +BEGIN + ACTION_IF ~%area%~ STRING_COMPARE ~~ BEGIN + ACTION_IF "%top%%bottom%" STRING_EQUAL "" BEGIN + LAF warning STR_VAR warning="extend_area_script called on area %area% with empty argument" END + END + LAF return_first_entry STR_VAR list= ~%area%~ RET entry=entry area=list END + LAF get_area_script STR_VAR area= ~%entry%~ RET file=script END + LAF extend STR_VAR file top bottom location inline ssl variables END + LAF extend_area_script STR_VAR area top bottom location inline ssl variables END + END +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// swap an item +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION ARE_swap_items + STR_VAR arguments="" +BEGIN + PATCH_IF ~%arguments%~ STRING_COMPARE_CASE ~~ BEGIN + LPF return_first_pair STR_VAR list= ~%arguments%~ RET old=key new=value arguments=list END + REPLACE_TEXTUALLY CASE_INSENSITIVE ~%old%~ ~%new%~ (8) + LPF ARE_swap_items STR_VAR arguments END + END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("ARE_swap_items") "" + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// set trigger info +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION ARE_say_trigger_info + STR_VAR arguments="" +BEGIN + WRITE_LONG (offset_base+0x64) RESOLVE_STR_REF ((AT arguments)) +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// swap scripts of area creatures (we do this quite a lot, so hardcode it) +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION swap_are_cre_script + STR_VAR area="" + creature="" + script="" +BEGIN + LAF return_first_pair STR_VAR list="%script%" RET script_old=key script_new=value END + COPY_EXISTING "%area%.are" override + GET_OFFSET_ARRAY offset_arr ARE_V10_ACTORS + PHP_EACH offset_arr AS ind=>offset BEGIN + READ_ASCII (offset+0x80) cre_here + PATCH_IF "%cre_here%" STRING_EQUAL_CASE "%creature%" BEGIN + FOR (offset_here=offset+0x50;offset_here0 || y>0) && x>=0 && y>=0 BEGIN + LPF point_in_bounds INT_VAR x xmin xmax y ymin ymax RET in_bounds_3=in_bounds END + END ELSE BEGIN + in_bounds_3=1 + END + READ_SSHORT (0x84 + offset_base) x + READ_SSHORT (0x86 + offset_base) y + PATCH_IF (x>0 || y>0) && x>=0 && y>=0 BEGIN // almost always 0,0 + + LPF point_in_bounds INT_VAR x xmin xmax y ymin ymax RET in_bounds_4=in_bounds END + END ELSE BEGIN + in_bounds_4=1 + END + value = ! (in_bounds_1 * in_bounds_2 * in_bounds_3 * in_bounds_4 ) + READ_ASCII offset_base name (0x20) +END + +DEFINE_PATCH_FUNCTION ARE_slide_trigger +BEGIN + PATCH_FOR_EACH offset IN 0x22 0x26 0x70 BEGIN + SET x=SSHORT_AT (offset + offset_base) + SET y=SSHORT_AT (offset + offset_base +2) + PATCH_IF (x>=0 || y>=0) BEGIN + WRITE_SHORT (offset + offset_base) (x - xmin) + WRITE_SHORT (offset + offset_base +2) (y - ymin) + END + END +END + +DEFINE_PATCH_FUNCTION ARE_container_out_of_bounds +RET value +BEGIN + READ_SSHORT (0x38 + offset_base) x + READ_SSHORT (0x3a + offset_base) y + LPF point_in_bounds INT_VAR x xmin xmax y ymin ymax RET in_bounds_1=in_bounds END + READ_SSHORT (0x3c + offset_base) x + READ_SSHORT (0x3e + offset_base) y + LPF point_in_bounds INT_VAR x xmin xmax y ymin ymax RET in_bounds_2=in_bounds END + value = !in_bounds_1 || !in_bounds_2 +END + +DEFINE_PATCH_FUNCTION ARE_door_out_of_bounds +RET value +BEGIN + READ_SSHORT (0x38 + offset_base) x + READ_SSHORT (0x3a + offset_base) y + LPF point_in_bounds INT_VAR x xmin xmax y ymin ymax RET in_bounds_1=in_bounds END + READ_SSHORT (0x3c + offset_base) x + READ_SSHORT (0x3e + offset_base) y + LPF point_in_bounds INT_VAR x xmin xmax y ymin ymax RET in_bounds_2=in_bounds END + READ_SSHORT (0x40 + offset_base) x + READ_SSHORT (0x42 + offset_base) y + LPF point_in_bounds INT_VAR x xmin xmax y ymin ymax RET in_bounds_3=in_bounds END + READ_SSHORT (0x44 + offset_base) x + READ_SSHORT (0x46 + offset_base) y + LPF point_in_bounds INT_VAR x xmin xmax y ymin ymax RET in_bounds_4=in_bounds END + READ_SSHORT (0x74 + offset_base) x + READ_SSHORT (0x76 + offset_base) y + LPF point_in_bounds INT_VAR x xmin xmax y ymin ymax RET in_bounds_5=in_bounds END + value = ! (in_bounds_1 * in_bounds_2 * in_bounds_3 * in_bounds_4 * in_bounds_5) +END + +DEFINE_PATCH_FUNCTION ARE_slide_door +BEGIN + PATCH_FOR_EACH offset IN 0x38 0x3c 0x40 0x44 0x74 0x90 0x94 BEGIN + SET x=SHORT_AT (offset + offset_base) + PATCH_IF x>=0 BEGIN + WRITE_SHORT (offset + offset_base) (x - xmin) + END + SET y=SHORT_AT (offset + offset_base +2) + PATCH_IF y>=0 BEGIN + WRITE_SHORT (offset + offset_base +2) (y - ymin) + END + END +END + +DEFINE_PATCH_FUNCTION ARE_mapnote_out_of_bounds +RET value +BEGIN + READ_SSHORT (offset_base) x + READ_SSHORT (0x2 + offset_base) y + LPF point_in_bounds INT_VAR x xmin xmax y ymin ymax RET in_bounds_1=in_bounds END + value = !in_bounds_1 +END + +DEFINE_PATCH_FUNCTION slide_x + STR_VAR arguments=0 +RET value +BEGIN + PATCH_IF arguments<0 BEGIN + value=arguments + END ELSE BEGIN + value=arguments - xmin + END +END + +DEFINE_PATCH_FUNCTION searchmap_slide_x + STR_VAR arguments=0 +RET value +BEGIN + PATCH_IF arguments<0 BEGIN + value=arguments + END ELSE BEGIN + value=arguments - (xmin * 4) / 64 + END +END + + +DEFINE_PATCH_FUNCTION slide_y + STR_VAR arguments=0 +RET value +BEGIN + PATCH_IF arguments<0 BEGIN + value=arguments + END ELSE BEGIN + value=arguments - ymin + END +END + +DEFINE_PATCH_FUNCTION searchmap_slide_y + STR_VAR arguments=0 +RET value +BEGIN + PATCH_IF arguments<0 BEGIN + value=arguments + END ELSE BEGIN + value=arguments - (ymin * 5) / 64 + END +END + + + + +DEFINE_PATCH_FUNCTION ARE_edit_restspawn + STR_VAR arguments="" +BEGIN + READ_LONG 0xc0 offset_base + WHILE "%arguments%" STRING_COMPARE "" BEGIN + LPF return_first_pair STR_VAR list="%arguments%" RET key value arguments=list END + LPF "ARE_%key%" STR_VAR arguments="%value%" END + + END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("ARE_edit_restspawn") "" + +DEFINE_PATCH_FUNCTION ARE_adjust_actor_xloc + STR_VAR arguments="" +BEGIN + adjust=arguments + LPF ARE_read_actor_x_coord_start RET value END + arguments=value+adjust + LPF ARE_actor_x_coord_start STR_VAR arguments END + LPF ARE_read_actor_x_coord_dest RET value END + arguments=value+adjust + LPF ARE_actor_x_coord_dest STR_VAR arguments END +END +DEFINE_PATCH_FUNCTION ARE_adjust_actor_yloc + STR_VAR arguments="" +BEGIN + adjust=arguments + LPF ARE_read_actor_y_coord_start RET value END + arguments=value+adjust + LPF ARE_actor_y_coord_start STR_VAR arguments END + LPF ARE_read_actor_y_coord_dest RET value END + arguments=value+adjust + LPF ARE_actor_y_coord_dest STR_VAR arguments END +END + +DEFINE_PATCH_FUNCTION ARE_add_pile + STR_VAR arguments="" +BEGIN + LPF return_first_entry STR_VAR list="%arguments%" separator="," RET fj_name=entry list END + LPF return_first_entry STR_VAR list separator="," RET fj_loc_x=entry fj_loc_y=list END + LPF fj_are_structure + INT_VAR fj_type=4 + fj_loc_x + fj_loc_y + fj_box_left = fj_loc_x - 8 + fj_box_right = fj_loc_x + 8 + fj_box_top = fj_loc_y - 6 + fj_box_bottom = fj_loc_y + 6 + STR_VAR fj_structure_type=container + fj_name + END + LPF fix_are_container_index END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("ARE_add_pile") "" + + +///////////////////////////////////////////////////////////////////// +/// FJ_ARE_STRUCTURE hook to add a trigger or container +///////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION get_data_fj + STR_VAR vertices="" + RET bb_top bb_bottom bb_left bb_right x_est y_est vertex_string +BEGIN + ind=0 + bb_top=10000 + bb_bottom=0 + bb_left=10000 + bb_right=0 + SPRINT vertex_string "" + WHILE "%vertices%" STRING_COMPARE "" BEGIN + LPF return_first_entry STR_VAR list="%vertices%" RET vertex=entry vertices=list END + LPF return_first_entry STR_VAR list="%vertex%" separator="," RET x=entry y=list END + PATCH_IF (!IS_AN_INT x) || (!IS_AN_INT y) BEGIN + PATCH_FAIL "ARE_add_trigger_fj/add_container_fj error: vertex list is not in format 'x1,y1 x2,y2 x3,y3 ...' " + END + SPRINT vertex_string "%vertex_string% fj_vertex_%ind%=%x% + (%y% << 16)" + ind+=1 + bb_top = (bb_top < y)? bb_top:y + bb_bottom = (bb_bottom>y)?bb_bottom:y + bb_left = (bb_left x)?bb_right:x + END + // estimate values for activation and launch, if not set + x_est = ( bb_left + bb_right ) / 2 + y_est = ( bb_top + bb_bottom ) / 2 +END + +DEFINE_PATCH_FUNCTION ARE_add_trigger_fj + INT_VAR activation_x="-1" + activation_y="-1" + launch_x="-1" + launch_y="-1" + STR_VAR type="" + name="" + script="" + vertices="" +BEGIN + // get the vertices and bounds + LPF get_data_fj STR_VAR vertices RET bb_top bb_bottom bb_left bb_right x_est y_est vertex_string END + activation_x = (activation_x <0 )? x_est : activation_x + activation_y = (activation_y <0 )? y_est : activation_y + launch_x = (launch_x<0)? x_est : launch_x + launch_y = (launch_y<0)? y_est : launch_y + // get trigger type + PATCH_MATCH "%type%" WITH + info information 1 BEGIN + type_num=1 + END + trap proximity 0 BEGIN + type_num=0 + END + travel 2 BEGIN + type_num=2 + END + DEFAULT + PATCH_FAIL "ARE_add_trigger_fj error: trigger type %type% unrecognised" + END + // make string + SPRINT input "LPF fj_are_structure INT_VAR fj_type=%type_num% fj_box_left=%bb_left% fj_box_right=%bb_right% fj_box_top=%bb_top% fj_box_bottom=%bb_bottom% fj_loc_x=%launch_x% fj_loc_y=%launch_y% fj_alt_x=%activation_x% fj_alt_y=%activation_y% %vertex_string% STR_VAR fj_name=~%name%~ fj_reg_script=~%script%~ fj_structure_type=region END" + LPF reinclude_this STR_VAR input END + +END + +DEFINE_PATCH_FUNCTION ARE_add_container_fj + INT_VAR loc_x="-1" + loc_y="-1" + launch_x="-1" + launch_y="-1" + STR_VAR type="" + name="" + vertices="" +BEGIN + // get the vertices and bounds + LPF get_data_fj STR_VAR vertices RET bb_top bb_bottom bb_left bb_right x_est y_est vertex_string END + loc_x = (loc_x <0 )? x_est : loc_x + loc_y = (loc_y <0 )? y_est : loc_y + launch_x = (launch_x<0)? x_est : launch_x + launch_y = (launch_y<0)? y_est : launch_y + // get trigger type + PATCH_MATCH "%type%" WITH + bag 1 BEGIN + type_num=1 + END + chest 2 BEGIN + type_num=2 + END + drawer 3 BEGIN + type_num=3 + END + pile 4 BEGIN + type_num=4 + END + table 5 BEGIN + type_num=5 + END + shelf 6 BEGIN + type_num=6 + END + altar 7 BEGIN + type_num=7 + END + nonvisible invisible 8 BEGIN + type_num=8 + END + book spellbook 9 BEGIN + type_num=9 + END + body corpse 10 BEGIN + type_num=10 + END + barrel 11 BEGIN + type_num=11 + END + crate 12 BEGIN + type_num=12 + END + DEFAULT + PATCH_FAIL "ARE_add_container_fj error: container type %type% unrecognised" + END + // make string + SPRINT input "LPF fj_are_structure INT_VAR fj_type=%type_num% fj_box_left=%bb_left% fj_box_right=%bb_right% fj_box_top=%bb_top% fj_box_bottom=%bb_bottom% fj_loc_x=%loc_x% fj_loc_y=%loc_y% fj_trap_loc_x=%launch_x% fj_trap_loc_y=%launch_y% %vertex_string% STR_VAR fj_name=~%name%~ fj_structure_type=container END" + LPF reinclude_this STR_VAR input END + +END + +///////////////////////////////////// +// Set trigger text of the current trigger to a TRA entry +///////////////////////////////////////// + +DEFINE_PATCH_FUNCTION ARE_trigger_says + STR_VAR arguments="" +BEGIN + strref=RESOLVE_STR_REF ( (AT %arguments%) ) + LPF ARE_trigger_info STR_VAR arguments="%strref%" END + + +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// say mapnote text +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION ARE_say_mapnote_text + STR_VAR arguments="" +BEGIN + WRITE_LONG (offset_base+0x04) RESOLVE_STR_REF ((AT arguments)) +END + + diff --git a/iwdification/sfo/filetype/lib_bam.tpa b/iwdification/sfo/filetype/lib_bam.tpa new file mode 100644 index 0000000..86e164f --- /dev/null +++ b/iwdification/sfo/filetype/lib_bam.tpa @@ -0,0 +1,324 @@ + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// palette editor for BAMs +///////////// +///////////// +///////////// "condition" should either be blank, or a function that takes as INT_VAR inputs "green", "red" and "blue" and returns +///////////// "value", which should be 1 (if the color should be patched) or 0 (if not) +///////////// "action" should be a function which takes "green", "red", "blue" as inputs and then outputs "green", "red" and "blue" +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION patch_colors + INT_VAR suppress_warning=0 + STR_VAR condition="" + action="" + bam="" +BEGIN + ACTION_IF "%bam%" STRING_COMPARE "" BEGIN + LAF return_first_entry STR_VAR list="%bam%" RET entry bam=list END + ACTION_IF FILE_EXISTS_IN_GAME "%entry%.bam" BEGIN + COPY_EXISTING "%entry%.bam" override + LPF patch_colors STR_VAR condition action END + BUT_ONLY + END ELSE BEGIN + ACTION_IF !suppress_warning BEGIN + LAF warning STR_VAR warning="tried to patch the palette of %entry%.bam but it doesn't exist" END + END + END + LAF patch_colors INT_VAR suppress_warning STR_VAR condition action bam END + END + +END + +DEFINE_PATCH_FUNCTION patch_colors + STR_VAR condition="" + action="" +BEGIN + LPF decompress_bam RET was_compressed dl END + READ_LONG 0x10 pal_off + FOR (i=1;i<256;i+=1) BEGIN // skip top left + SET offset= pal_off + i*4 + LPF read_color INT_VAR offset RET red blue green END + PATCH_IF "%condition%" STRING_COMPARE "" BEGIN + LPF "%condition%" INT_VAR red green blue RET value END + END ELSE BEGIN + SET value=1 + END + PATCH_IF value BEGIN + LPF "%action%" INT_VAR red blue green RET red blue green END + LPF write_color INT_VAR offset red blue green END + END + END + LPF compress_bam INT_VAR was_compressed dl END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION read_color + INT_VAR offset=0 + RET red green blue +BEGIN + READ_BYTE offset blue + READ_BYTE (offset+1) green + READ_BYTE (offset+2) red +END + +DEFINE_PATCH_FUNCTION write_color + INT_VAR red=0 green=0 blue=0 offset=0 +BEGIN + LPF legal_byte INT_VAR input=green RET green=output END + LPF legal_byte INT_VAR input=blue RET blue=output END + LPF legal_byte INT_VAR input=red RET red=output END + WRITE_BYTE offset blue + WRITE_BYTE (offset+1) green + WRITE_BYTE (offset+2) red +END + +DEFINE_PATCH_FUNCTION legal_byte INT_VAR input=0 RET output BEGIN + output = input>0x100 ? 0x100 : input + output = output<0 ? 0 : output +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION decompress_bam RET was_compressed dl BEGIN + SET was_compressed=0 + SET dl=0 + READ_ASCII 0x0 sg (4) //Signature + PATCH_IF ~%sg%~ STRING_EQUAL_CASE ~BAMC~ BEGIN + SET was_compressed=1 + READ_LONG 0x8 dl //Uncompressed data length + DECOMPRESS_REPLACE_FILE 0xc (SOURCE_SIZE - 0xc) dl + END +END + +DEFINE_PATCH_FUNCTION compress_bam INT_VAR dl=0 was_compressed=0 BEGIN + PATCH_IF was_compressed BEGIN + COMPRESS_REPLACE_FILE 0 dl 9 + INSERT_BYTES 0x0 0xc + WRITE_ASCII 0x0 ~BAMCV1 ~ + WRITE_LONG 0x8 dl + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +DEFINE_PATCH_FUNCTION length_of_frame_lookup_table +RET lookup_num +BEGIN + READ_SHORT 0x8 frame_num + READ_BYTE 0xa cycle_num + READ_LONG 0xc frame_off + READ_LONG 0x10 palette_off + READ_LONG 0x14 frame_lookup_off + SET cycle_off=frame_off + 0xc * frame_num + SET lookup_num=0 + FOR (ind=0;ind max_here)? lookup_num : max_here + END + + +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION delete_cycle_data +INT_VAR dl=0 +RET dl +BEGIN + // get offsets + READ_SHORT 0x8 frame_num + READ_BYTE 0xa cycle_num + READ_LONG 0xc frame_off + READ_LONG 0x10 palette_off + READ_LONG 0x14 lookup_off + SET cycle_off=frame_off + 0xc * frame_num + LPF length_of_frame_lookup_table RET lookup_num END + // initialise + SET palette_delta = 0 + SET lookup_delta = 0 + SET data_delta = 0 + // determine length of excisions and work out deltas + SET cycle_length = cycle_num * 4 + SET lookup_length = lookup_num * 2 + SET palette_delta = 0 - cycle_length + SET lookup_delta = 0 - cycle_length + SET data_delta = 0 - cycle_length - lookup_length + // carry out excisions + DELETE_BYTES lookup_off lookup_length + DELETE_BYTES cycle_off cycle_length + // update indices + WRITE_BYTE 0xa 0 + SET palette_off += palette_delta + WRITE_LONG 0x10 palette_off + SET lookup_off += lookup_delta + WRITE_LONG 0x14 lookup_off + FOR (ind=0;indoffset BEGIN + READ_LONG offset ref + SPRINT $pvrz_ind_list("%ref%") "" + END + // end of COPY + // go through and sort out the PVRZs' new indices + OUTER_SET current=lowest_mos_index + ACTION_PHP_EACH pvrz_ind_list AS ind=>discard BEGIN + LAF get_available_mos_index INT_VAR current RET new_index=value END + LAF pad_to_four INT_VAR arguments=ind RET padded_old=value END + LAF pad_to_four INT_VAR arguments=new_index RET padded_new=value END + COPY "%pvrz_loc%/mos%padded_old%.pvrz" "override/mos%padded_new%.pvrz" + + OUTER_SET $pvrz_ind_list("%ind%")=new_index + OUTER_SET current=new_index+1 + END + // update the bam file + COPY_EXISTING "%bam_name%.bam" override + GET_OFFSET_ARRAY bam_array 0x1c 4 0x10 4 0 0 0x1c + PHP_EACH bam_array AS ind=>offset BEGIN + READ_LONG offset ref + SET ref_new=$pvrz_ind_list("%ref%") + WRITE_LONG offset ref_new + END + + + +END + +DEFINE_ACTION_FUNCTION pad_to_four + INT_VAR arguments=0 + RET value +BEGIN + ACTION_IF arguments>9999 BEGIN + FAIL "pad_to_four requires an argument <=9999" + END + ACTION_IF arguments<10 BEGIN + OUTER_SPRINT value "000%arguments%" + END ELSE + ACTION_IF arguments<100 BEGIN + OUTER_SPRINT value "00%arguments%" + END ELSE + ACTION_IF arguments<1000 BEGIN + OUTER_SPRINT value "0%arguments%" + END ELSE BEGIN + OUTER_SPRINT value "%arguments%" + END +END + +DEFINE_ACTION_FUNCTION get_available_mos_index + INT_VAR current=0 + RET value +BEGIN + LAF pad_to_four INT_VAR arguments=current RET padded=value END + ACTION_IF FILE_EXISTS_IN_GAME "mos%padded%.pvrz" BEGIN + OUTER_SET current +=1 + LAF get_available_mos_index INT_VAR current RET value END + END ELSE BEGIN + OUTER_SET value=current + END +END + + diff --git a/iwdification/sfo/filetype/lib_bcs.tpa b/iwdification/sfo/filetype/lib_bcs.tpa new file mode 100644 index 0000000..0024392 --- /dev/null +++ b/iwdification/sfo/filetype/lib_bcs.tpa @@ -0,0 +1,264 @@ +//////////////////////////////////////////////////////////////////////////////////////// +//// This whole library is basically obsolete now, replaced by alter_script.tpa +//////////////////////////////////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////////////////////////////////// +//// Overall edit wraps +//// +//////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION edit_script + STR_VAR script="" + editstring="" +BEGIN + WARN "You are using the obsolete SFO bcs library. Use the alter_script library instead." + PRINT "Applying patches to script(s) %script%" + OUTER_WHILE "%script%" STRING_COMPARE "" BEGIN + LAF return_first_entry STR_VAR list= "%script%" RET filename=entry script=list END + COPY_EXISTING "%filename%.bcs" override + DECOMPILE_AND_PATCH BEGIN + LPF process_baf STR_VAR editstring filename END + END + BUT_ONLY + END +END + +DEFINE_ACTION_FUNCTION edit_all_scripts + STR_VAR editstring="" +BEGIN + COPY_EXISTING_REGEXP GLOB ".*\.bcs" override + SPRINT filename "%SOURCE_RES%" + DECOMPILE_AND_PATCH BEGIN + LPF process_baf STR_VAR editstring filename END + END + BUT_ONLY +END + +//////////////////////////////////////////////////////////////////////////////////////// +//// Core BAF editor. Takes as input a list of task=>arg +//// +//// Tasks are : leave_alone (arg ignored, block is reinserted) +//// patch (arg is a list of functions separated by |, functions act on +//// trigger and action string, result is outputted as a block in same +//// place as old block. Output empty trigger/action to avoid adding block) +//// insert_top (as patch, but block placed at start of script) +//// insert_bottom (as patch, but block placed at end of script) +///////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION process_baf + INT_VAR no_repeats=0 + STR_VAR editstring="" + filename="" + until="" + after="" +BEGIN + // initialise + SET step=0 + PATCH_FOR_EACH type IN top main bottom BEGIN + SET $count("%type%")=0 + END + PATCH_IF "%after%" STRING_COMPARE_CASE "" BEGIN + SET active=0 + END ELSE BEGIN + SET active=1 + END + SET blocknum=0 + SPRINT trig "" + SPRINT act "" + /// work around the space in RESPONSE # + REPLACE_TEXTUALLY "RESPONSE #" "RESPONSE-#" + /// read in the BAF file + READ_2DA_ENTRIES_NOW baf_rows 1 + /// parse the BAF file + FOR (i=0;i=0;i = i - 1) BEGIN + SPRINT trig_in $trig_top("%i%") + SPRINT act_in $act_top("%i%") + LPF process_baf_block_inserter INT_VAR rowcount STR_VAR act_in trig_in RET rowcount=rowcount END + END + // do main and bottom in normal order + FOR (i=0;i>>>>>>> + +// leaving effects for now, it depends on cretype +OUTER_SPRINT ~offset_readin_lookup_2da~ ~cre_offsets~ +OUTER_SPRINT ~offset_readin_file_ext~ ~CRE~ +LAUNCH_ACTION_MACRO read_in_offsets + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// simple data-field edits +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +ACTION_DEFINE_ASSOCIATIVE_ARRAY cre_fields BEGIN + name1_string=> ~0x8,LONG~ + name2_string=> ~0xc,LONG~ + xp_value=> ~0x14,LONG~ + xp_total=> ~0x18,LONG~ + gold=> ~0x1c,LONG~ + color_metal => ~0x2c,BYTE~ + color_minor => ~0x2d,BYTE~ + color_major => ~0x2e,BYTE~ + color_skin => ~0x2f,BYTE~ + color_leather => ~0x30,BYTE~ + color_armor => ~0x31,BYTE~ + color_hair => ~0x32,BYTE~ + portrait_small => ~0x34,ASCII~ + portrait_large => ~0x3c,ASCII~ + hide_in_shadows => ~0x45,BYTE~ + detect_illusions => ~0x64,BYTE~ + set_traps => ~0x65,BYTE~ + lore =>~0x66,BYTE~ + open_locks=>~0x67,BYTE~ + move_silently=>~0x68,BYTE~ + find_traps=>~0x69,BYTE~ + pick_pockets=>~0x6a,BYTE~ + resist_fire =>~0x59,SBYTE~ + resist_cold =>~0x5a,SBYTE~ + resist_electricity =>~0x5b,SBYTE~ + resist_acid =>~0x5c,SBYTE~ + resist_magic =>~0x5d,SBYTE~ + resist_magic_fire =>~0x5e,SBYTE~ + resist_magic_cold =>~0x5f,SBYTE~ + resist_slashing =>~0x60,SBYTE~ + resist_crushing =>~0x61,SBYTE~ + resist_piercing =>~0x62,SBYTE~ + resist_missile =>~0x63,SBYTE~ + level => ~0x234,BYTE~ + level1 => ~0x234,BYTE~ + level2 => ~0x235,BYTE~ + level3 => ~0x236,BYTE~ + str => ~0x238,BYTE~ + str_ex => ~0x239,BYTE~ + int => ~0x23a,BYTE~ + wis => ~0x23b,BYTE~ + dex => ~0x23c,BYTE~ + con => ~0x23d,BYTE~ + cha => ~0x23e,BYTE~ + strength => ~0x238,BYTE~ + strength_ex => ~0x239,BYTE~ + intelligence => ~0x23a,BYTE~ + wisdom => ~0x23b,BYTE~ + dexterity => ~0x23c,BYTE~ + constitution => ~0x23d,BYTE~ + charisma => ~0x23e,BYTE~ + sex => ~0x237,BYTE~ + script_override => ~0x248,ASCII~ + script_class => ~0x250,ASCII~ + script_race => ~0x258,ASCII~ + script_general => ~0x260,ASCII~ + script_default => ~0x268,ASCII~ + specifics => ~0x274,BYTE~ + save_vs_death => ~0x54,SBYTE~ + save_vs_wand => ~0x55,SBYTE~ + save_vs_wands => ~0x55,SBYTE~ + save_vs_poly => ~0x56,SBYTE~ + save_vs_polymorph => ~0x56,SBYTE~ + save_vs_breath => ~0x57,SBYTE~ + save_vs_spell => ~0x58,SBYTE~ + save_vs_spells => ~0x58,SBYTE~ + thac0 => ~0x52,SBYTE~ + attacks => ~0x53,BYTE~ + hp_max => ~0x26,SHORT~ + hp_current => ~0x24,SHORT~ + dv => ~0x280,ASCII20~ + dialog => ~0x2cc,ASCII~ + animation_code => ~0x28,SHORT~ + effect_type => ~0x33,BYTE~ + ac_natural => ~0x46,SSHORT~ + ac_effective => ~0x48,SSHORT~ + ac_vs_crushing => ~0x4a,SSHORT~ + ac_vs_missiles => ~0x4c,SSHORT~ + ac_vs_piercing => ~0x4e,SSHORT~ + ac_vs_slashing => ~0x50,SSHORT~ + morale => ~0x23f,BYTE~ + morale_break => ~0x240,BYTE~ + nightmare_mode => ~0x7d,BYTE~ +END + +LAUNCH_ACTION_FUNCTION build_simple_data_field_editors STR_VAR lookup_table=cre_fields function_prefix=CRE END + +ACTION_DEFINE_ASSOCIATIVE_ARRAY cre_rel_fields BEGIN + item_resource => ~0x0,ASCII~ + item_charges_1 => ~0xa,SHORT~ + item_charges_2 => ~0xc,SHORT~ + item_charges_3 => ~0xe,SHORT~ + spell_resource => ~0x0,ASCII~ + opcode => ~0x8,LONG~ + resource=>~0x28,ASCII~ + target=>~0xc,LONG~ + effect_resource=>~0x28,ASCII~ + timing=>~0x1c,LONG~ + probability1=>~0x24,SHORT~ + probability2=>~0x26,SHORT~ + duration=>~0x20,LONG~ + parameter1 => ~0x14,LONG~ + parameter2 => ~0x18,LONG~ + item_slot => ~0x0,SHORT~ + memorized_spell => ~0x0,ASCII~ + resist_dispel=>~0x54,LONG~ + memorization_level => ~0x0,SHORT~ + number_can_memorize => ~0x2,SHORT~ + number_has_memorized => ~0x4,SHORT~ + memorization_type => ~0x6,SHORT~ + parent_resource_type=>~0x88,LONG~ + parent_resource=>~0x8c,ASCII~ + parent_item_slot=>~0x9c,LONG~ + mode=>~0x40,LONG~ + power => ~0x18,LONG~ +END + +LAUNCH_ACTION_FUNCTION build_simple_data_field_editors STR_VAR lookup_table=cre_rel_fields offset_base=yes function_prefix=CRE END + + + + +ACTION_DEFINE_ASSOCIATIVE_ARRAY cre_bit_fields BEGIN + no_corpse => ~0x10,1~ + permanent_corpse => ~0x10,2~ + original_class_fighter=>"0x10,3" + original_class_mage=>"0x10,4" + original_class_cleric=>"0x10,5" + original_class_thief=>"0x10,6" + original_class_druid=>"0x10,7" + original_class_ranger=>"0x11,0" + ignore_nightmare_mode=>"0x12,6" + state_sleeping => ~0x20,0~ + state_berserk => ~0x20,1~ + state_panic => ~0x20,2~ + state_stunned => ~0x20,3~ + state_invisible => ~0x20,4~ + state_helpless => ~0x20,5~ + state_frozen_death => ~0x20,6~ + state_stone_death => ~0x20,7~ + state_exploding_death => ~0x21,0~ + state_flame_death =>~0x21,1~ + state_acid_death=>~0x21,2~ + state_dead=>~0x21,3~ + state_silenced=>~0x21,4~ + state_charmed=>~0x21,5~ + state_poisoned=>~0x21,6~ + state_hasted=>~0x21,7~ + state_slowed=>~0x22,0~ + state_infravision=>~0x22,1~ + state_blind=>~0x22,2~ + state_diseased=>~0x22,3~ + state_feebleminded=>~0x22,4~ + state_nondetection=>~0x22,5~ + state_improved_invisibility=>~0x22,6~ + state_bless=>~0x22,7~ + state_chant=>~0x23,0~ + state_drawuponholymight=>~0x23,1~ + state_luck=>~0x23,2~ + state_aid=>~0x23,3~ + state_chantbad=>~0x23,4~ + state_blur=>~0x23,5~ + state_mirrorimage=>~0x23,6~ + state_confused=>~0x23,7~ + state_hidden => ~0x22,3~ +END + +LAF build_flag_data_field_editors STR_VAR lookup_table=cre_bit_fields function_prefix=CRE END + + +ACTION_DEFINE_ASSOCIATIVE_ARRAY cre_rel_bit_fields BEGIN + unstealable => ~0x10,1~ + undroppable => ~0x10,3~ +END + + +LAF build_flag_data_field_editors STR_VAR lookup_table=cre_rel_bit_fields offset_base=yes function_prefix=CRE END + + + + + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// composite data-field edits +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// current and max hp + +DEFINE_PATCH_FUNCTION CRE_hitpoints STR_VAR arguments="" BEGIN + LAUNCH_PATCH_FUNCTION CRE_hp_max STR_VAR arguments= ~%arguments%~ END + LAUNCH_PATCH_FUNCTION CRE_hp_current STR_VAR arguments= ~%arguments%~ END +END + + +DEFINE_PATCH_FUNCTION CRE_hitpointsGT STR_VAR arguments="" BEGIN + LAUNCH_PATCH_FUNCTION CRE_hp_maxGT STR_VAR arguments= ~%arguments%~ END + LAUNCH_PATCH_FUNCTION CRE_hp_currentGT STR_VAR arguments= ~%arguments%~ END +END +// all three levels + +DEFINE_PATCH_FUNCTION CRE_level_all STR_VAR arguments="" BEGIN + LPF CRE_level STR_VAR arguments END + LPF CRE_level2 STR_VAR arguments END + LPF CRE_level3 STR_VAR arguments END +END + +// both ACs + +DEFINE_PATCH_FUNCTION CRE_ac STR_VAR arguments="" BEGIN + LPF CRE_ac_natural STR_VAR arguments END + LPF CRE_ac_effective STR_VAR arguments END +END + +// all saving throws + +DEFINE_PATCH_FUNCTION CRE_saves STR_VAR arguments="" BEGIN + INNER_ACTION BEGIN + LAUNCH_ACTION_FUNCTION decompose_CSV + STR_VAR input= ~%arguments%~ + RET save_vs_death=argument_0 + save_vs_wands=argument_1 + save_vs_poly=argument_2 + save_vs_breath=argument_3 + save_vs_spell=argument_4 + END + END + PATCH_FOR_EACH save IN death wands poly breath spell BEGIN + SPRINT ~string~ ~LAUNCH_PATCH_FUNCTION CRE_save_vs_%save% STR_VAR arguments= "%percentage%save_vs_%save%%percentage%" END~ + LAUNCH_PATCH_FUNCTION patch_reinclude_this STR_VAR input= ~%string%~ END + END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("CRE_saves") "" + +// original class + +DEFINE_PATCH_FUNCTION CRE_original_class STR_VAR arguments="" BEGIN + PATCH_MATCH "%arguments%" WITH + NO_CHANGE BEGIN END + FIGHTER MAGE CLERIC THIEF DRUID RANGER NONE BEGIN + TO_LOWER arguments + PATCH_FOR_EACH class IN + fighter mage cleric thief druid ranger BEGIN + PATCH_IF "%class%" STRING_EQUAL "%arguments%" BEGIN + LPF "CRE_original_class_%class%" STR_VAR arguments=1 END + END ELSE BEGIN + LPF "CRE_original_class_%class%" STR_VAR arguments=0 END + END + END + END + DEFAULT + PATCH_FAIL "%arguments% cannot be a character's original class, because you can't dual from that class" + END +END + +DEFINE_PATCH_FUNCTION CRE_read_original_class RET value BEGIN + SPRINT value none + PATCH_FOR_EACH class IN + fighter mage cleric thief druid ranger BEGIN + LPF "CRE_read_original_class_%class%" RET this_value=value END + PATCH_IF this_value=1 BEGIN + SPRINT value "%class%" + END + END + +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// data-field edits involving lookup +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +ACTION_DEFINE_ASSOCIATIVE_ARRAY ~cre_ids_fields~ BEGIN + animation => ~0x28,SHORT,ANIMATE~ + allegiance => ~0x270,BYTE,EA~ + general => ~0x271,BYTE,general~ + race => ~0x272,BYTE,race~ + class => ~0x273,BYTE,class~ + gender => ~0x275,BYTE,gender~ + alignment => ~0x27b,BYTE,align~ + kit_vanilla => ~0x244,LONG_REVERSED,kit~ + kit => ~0x244,LONG_REVERSED,dw#kit~ +END + +LAUNCH_ACTION_FUNCTION build_IDS_data_field_editors STR_VAR lookup_table=cre_ids_fields function_prefix=CRE END + +// we'll overwrite gender by hand to also set the Sex field + +DEFINE_PATCH_FUNCTION ~CRE_gender~ + STR_VAR arguments="" +BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + SET value = IDS_OF_SYMBOL (gender "%arguments%") + PATCH_IF value>0 BEGIN + WRITE_BYTE 0x275 value + PATCH_MATCH "%arguments%" WITH + male BEGIN + WRITE_BYTE 0x237 1 + END + female BEGIN + WRITE_BYTE 0x237 2 + END + DEFAULT + END + END ELSE BEGIN + LPF warning STR_VAR warning= "tried to set nonexistent %idsfile% entry %arguments%" END + END + END +END + + +// kit needs special treatment + +COPY_EXISTING kit.ids "override/dw#kit.ids" + COUNT_2DA_ROWS 2 rowcount + SET thisrow=0 + WHILE thisrow176 target=>1 timing=>9 parameter2=>1 parameter1=>%move%~ END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// strip scripts +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_strip_script /// takes as argument list of scripts + STR_VAR arguments="" +BEGIN + PATCH_IF ~%arguments%~ STRING_EQUAL_CASE all BEGIN + WRITE_ASCII 0x248 ~~ (0x28) + END ELSE BEGIN + + PATCH_IF ~%arguments%~ STRING_COMPARE_CASE ~~ BEGIN + LPF return_first_entry STR_VAR list= ~%arguments%~ RET arguments=list script=entry END + FOR (i=0x248;i<0x270;i=i+8) BEGIN + READ_ASCII i ~current_script~ + PATCH_IF ~%current_script%~ STRING_EQUAL_CASE ~%script%~ BEGIN + WRITE_ASCII i ~~ (8) + END + END + LPF CRE_strip_script STR_VAR arguments= ~%arguments%~ END + END + END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("CRE_strip_script") "" + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// swap scripts +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_swap_script /// takes as argument hash of maps + STR_VAR arguments="" +BEGIN + PATCH_IF ~%arguments%~ STRING_COMPARE_CASE ~~ BEGIN + LPF return_first_pair STR_VAR list=~%arguments%~ RET arguments=list oldscript=key newscript=value END + FOR (i=0x248;i<0x270;i=i+8) BEGIN + READ_ASCII i ~current_script~ + PATCH_IF ~%current_script%~ STRING_EQUAL_CASE ~%oldscript%~ BEGIN + WRITE_ASCIIE i ~%newscript%~ (8) + END + END + LPF CRE_swap_script STR_VAR arguments END + END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("CRE_swap_script") "" + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// invert scripts +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_invert_scripts /// takes as argument hash of maps + STR_VAR arguments="" +BEGIN + PATCH_IF ~%arguments%~ STRING_COMPARE_CASE ~~ BEGIN + LPF return_first_pair STR_VAR list= ~%arguments%~ RET arguments=list oldscript=key newscript=value END + FOR (i=0x248;i<0x270;i=i+8) BEGIN + READ_ASCII i ~current_script~ + PATCH_IF ~%current_script%~ STRING_EQUAL_CASE ~%oldscript%~ BEGIN + WRITE_ASCIIE i ~%newscript%~ (8) + END + PATCH_IF ~%current_script%~ STRING_EQUAL_CASE ~%newscript%~ BEGIN + WRITE_ASCIIE i ~%oldscript%~ (8) + END + END + LPF CRE_invert_scripts STR_VAR arguments END + END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("CRE_invert_scripts") "" + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// enforce script order (argument is "X above Y" or "X below Y") +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_enforce_script_order + STR_VAR arguments="" +BEGIN + LPF return_first_entry STR_VAR list= ~%arguments%~ RET script1=entry list=list END + LPF return_first_entry STR_VAR list RET list=list abovebelow=entry END + PATCH_IF (~%abovebelow%~ STRING_COMPARE_CASE ~above~ && ~%abovebelow%~ STRING_COMPARE_CASE ~below~) BEGIN + LPF warning STR_VAR warning=~Warning: malformed argument in CRE_enforce_script_order~ END + END + LPF return_first_entry STR_VAR list RET list=list script2=entry END + PATCH_IF (~%abovebelow%~ STRING_EQUAL_CASE above) BEGIN + SPRINT top ~%script1%~ + SPRINT bottom ~%script2%~ + END ELSE BEGIN + SPRINT top ~%script2%~ + SPRINT bottom ~%script1%~ + TO_LOWER top + TO_LOWER bottom + END + SET top_loc=~-1~ + SET bottom_loc=~-1~ + FOR (i=0x248;i<0x268;i+=8) BEGIN + READ_ASCII i script + TO_LOWER script + PATCH_MATCH ~%script%~ WITH + ~%top%~ BEGIN + SET top_loc=i + END + ~%bottom%~ BEGIN + SET bottom_loc=i + END + DEFAULT END + END + PATCH_IF ((top_loc>bottom_loc) && (bottom_loc>0)) BEGIN + WRITE_ASCIIE top_loc ~%bottom%~ (8) + WRITE_ASCIIE bottom_loc ~%top%~ (8) + END + + +END +OUTER_SPRINT $SFO_do_not_parse_arguments("CRE_enforce_script_order") "" + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// slot in this script where you can find space, from bottom up +///////////// if the argument has the form "script1 above script2", insert the script script1 immediately +///////////// above script2. Return the location of the new script. +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_insert_script + STR_VAR + arguments="" + RET new_loc +BEGIN SET success=0 + new_loc=~-1~ + // parse the argument + LPF return_first_entry STR_VAR list= ~%arguments%~ RET script_new=entry list=list END + PATCH_IF ~%list%~ STRING_COMPARE_CASE ~~ BEGIN // it's a relative insertion + LPF return_first_entry STR_VAR list RET loc_instruction=entry list=list END + LPF strip_spaces_from_string STR_VAR string= ~%list%~ RET script_old=string END + // find the old script + LPF CRE_locate_script STR_VAR script= ~%script_old%~ RET loc=value END + PATCH_IF loc>=0 BEGIN + LPF CRE_bump_down INT_VAR loc RET value=value END + PATCH_IF value=1 BEGIN + SET high=loc + SET low=loc+8 + SET success=1 + END ELSE BEGIN + LPF CRE_bump_up INT_VAR loc RET value=value END + PATCH_IF value=1 BEGIN + SET high=loc - 8 + SET low=loc + SET success=1 + END + END + PATCH_IF success=1 BEGIN + TO_UPPER ~loc_instruction~ + PATCH_MATCH ~%loc_instruction%~ WITH + above before BEGIN + WRITE_ASCIIE high ~%script_new%~ (8) + WRITE_ASCIIE low ~%script_old%~ (8) + SET new_loc=high + END + below after BEGIN + WRITE_ASCIIE high ~%script_old%~ (8) + WRITE_ASCIIE low ~%script_new%~ (8) + SET new_loc=low + END + DEFAULT + LPF warning STR_VAR warning= ~Unrecognised command %arguments% in insert_script~ END + END + END + END + END ELSE BEGIN // it's straightforward + FOR (i=0x268;i>0x240;i=i - 8) BEGIN + READ_ASCII i ~test~ + PATCH_IF ~%test%~ STRING_EQUAL_CASE ~~ OR ~%test%~ STRING_EQUAL_CASE ~none~ BEGIN + SET success=1 + SET new_loc=i + WRITE_ASCIIE i ~%script_new%~ (8) + SET i=0 + END + END + END + PATCH_IF success=0 BEGIN + LAUNCH_PATCH_FUNCTION warning STR_VAR warning= "Failed to insert script %arguments% in file %filename%" END + END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("CRE_insert_script") "" + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_locate_script // find the location of this script + STR_VAR script="" + RET value +BEGIN + SET value= ~-1~ + FOR (i=0x248;i<0x270;i+=8) BEGIN + READ_ASCII i test + PATCH_IF ~%test%~ STRING_EQUAL_CASE ~%script%~ BEGIN + SET value=i + SET i=0x270 + END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_first_gap_below // find the first gap below location loc + INT_VAR loc=0x248 + RET value +BEGIN + SET value= ~-1~ + FOR (i=loc;i<0x270;i+=8) BEGIN + READ_ASCII i test + PATCH_IF ~%test%~ STRING_EQUAL_CASE ~~ OR ~%test%~ STRING_EQUAL_CASE ~none~ BEGIN + SET value=i + SET i=0x270 + END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_first_gap_above // find the first gap above location loc + INT_VAR loc=0x248 + RET value +BEGIN + SET value= ~-1~ + FOR (i=loc;i>0x240;i=i - 8) BEGIN + READ_ASCII i test + PATCH_IF ~%test%~ STRING_EQUAL_CASE ~~ OR ~%test%~ STRING_EQUAL_CASE ~none~ BEGIN + SET value=i + SET i=0x240 + END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_bump_down // try to create a space below script at loc by bumping scripts down; return 1 if successful + INT_VAR loc=0x248 + RET value +BEGIN + SET value= 0 + LPF CRE_first_gap_below INT_VAR loc RET gap=value END + PATCH_IF gap>=0 BEGIN + FOR (i=gap - 8;i>loc;i=i - 8) BEGIN + READ_ASCII i temp + WRITE_ASCIIE (i+8) ~%temp%~ (8) + END + WRITE_ASCII (loc+8) ~~ (8) + SET value=1 + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_bump_up // try to create a space above script at loc by bumping scripts up; return 1 if successful + INT_VAR loc=0x248 + RET value +BEGIN + SET value= 0 + LPF CRE_first_gap_above INT_VAR loc RET gap=value END + PATCH_IF gap>=0 BEGIN + FOR (i=gap+8;i0x240;i=i - 8) BEGIN + READ_ASCII i ~test~ + SET blank=0 + PATCH_IF ~%test%~ STRING_EQUAL_CASE ~~ OR ~%test%~ STRING_EQUAL_CASE ~none~ BEGIN + SET blank=i + SET i=0 + END + END + PATCH_IF blank=0 BEGIN // merge the last two scripts, but check both exist first! + READ_ASCII 0x260 top + READ_ASCII 0x268 bottom + INNER_ACTION BEGIN + ACTION_IF FILE_EXISTS_IN_GAME "%top%.bcs" BEGIN + OUTER_SET top_exists=1 + END ELSE BEGIN + OUTER_SET top_exists=0 + END + ACTION_IF FILE_EXISTS_IN_GAME "%bottom%.bcs" BEGIN + OUTER_SET bottom_exists=1 + END ELSE BEGIN + OUTER_SET bottom_exists=0 + END + ACTION_IF top_exists && bottom_exists BEGIN + LAF find_unique_filename STR_VAR extension=bcs RET script=filename END + LAF merge_scripts STR_VAR top bottom script END + END + END + PATCH_IF top_exists && bottom_exists BEGIN + WRITE_ASCIIE 0x260 "%script%" (8) + LPF warning STR_VAR warning="found space for script %arguments% in file %filename% by merging %top%.bcs and %bottom%.bcs into %script%.bcs" END + END ELSE BEGIN + PATCH_IF bottom_exists BEGIN // in which case, top doesn't exist + WRITE_ASCIIE 0x260 "%bottom%" (8) + END // if it doesn't exist, we just overwrite bottom + END + WRITE_ASCIIE 0x268 "%arguments%" (8) + END ELSE BEGIN + FOR (i=blank;i<0x268;i=i+8) BEGIN + READ_ASCII i+8 ~move~ + WRITE_ASCIIE i ~%move%~ (8) + END + WRITE_ASCIIE 0x268 ~%arguments%~ (8) + END +END + +DEFINE_PATCH_FUNCTION CRE_insert_script_high + STR_VAR + arguments="" +BEGIN + FOR (i=0x248;i<0x270;i=i + 8) BEGIN + READ_ASCII i ~test~ + SET blank=0 + PATCH_IF ~%test%~ STRING_EQUAL_CASE ~~ OR ~%test%~ STRING_EQUAL_CASE ~none~ BEGIN + SET blank=i + SET i=0x270 + END + END + PATCH_IF blank=0 BEGIN // merge the first two scripts, but check both exist first! + READ_ASCII 0x248 top + READ_ASCII 0x250 bottom + INNER_ACTION BEGIN + ACTION_IF FILE_EXISTS_IN_GAME "%top%.bcs" BEGIN + OUTER_SET top_exists=1 + END ELSE BEGIN + OUTER_SET top_exists=0 + END + ACTION_IF FILE_EXISTS_IN_GAME "%bottom%.bcs" BEGIN + OUTER_SET bottom_exists=1 + END ELSE BEGIN + OUTER_SET bottom_exists=0 + END + ACTION_IF top_exists && bottom_exists BEGIN + LAF find_unique_filename STR_VAR extension=bcs RET script=filename END + LAF merge_scripts STR_VAR top bottom script END + END + END + PATCH_IF top_exists && bottom_exists BEGIN + WRITE_ASCIIE 0x250 "%script%" (8) + LPF warning STR_VAR warning="found space for script %arguments% in file %filename% by merging %top%.bcs and %bottom%.bcs into %script%.bcs" END + END ELSE BEGIN + PATCH_IF top_exists BEGIN // in which case, bottom doesn't exist + WRITE_ASCIIE 0x250 "%top%" (8) + END // if it doesn't exist, we just overwrite top + END + WRITE_ASCIIE 0x248 "%arguments%" (8) + END ELSE BEGIN + FOR (i=blank;i>0x248;i=i - 8) BEGIN + READ_ASCII i - 8 ~move~ + WRITE_ASCIIE i ~%move%~ (8) + END + WRITE_ASCIIE 0x248 ~%arguments%~ (8) + END +END + +DEFINE_PATCH_FUNCTION CRE_insert_script_second + STR_VAR + arguments="" +BEGIN + FOR (i=0x250;i<0x270;i=i + 8) BEGIN + READ_ASCII i ~test~ + SET blank=0 + PATCH_IF ~%test%~ STRING_EQUAL_CASE ~~ OR ~%test%~ STRING_EQUAL_CASE ~none~ BEGIN + SET blank=i + SET i=0x270 + END + END + PATCH_IF blank=0 BEGIN // merge the first two scripts, but check both exist first! + READ_ASCII 0x250 top + READ_ASCII 0x258 bottom + INNER_ACTION BEGIN + ACTION_IF FILE_EXISTS_IN_GAME "%top%.bcs" BEGIN + OUTER_SET top_exists=1 + END ELSE BEGIN + OUTER_SET top_exists=0 + END + ACTION_IF FILE_EXISTS_IN_GAME "%bottom%.bcs" BEGIN + OUTER_SET bottom_exists=1 + END ELSE BEGIN + OUTER_SET bottom_exists=0 + END + ACTION_IF top_exists && bottom_exists BEGIN + LAF find_unique_filename STR_VAR extension=bcs RET script=filename END + LAF merge_scripts STR_VAR top bottom script END + END + END + PATCH_IF top_exists && bottom_exists BEGIN + WRITE_ASCIIE 0x258 "%script%" (8) + LPF warning STR_VAR warning="found space for script %arguments% in file %filename% by merging %top%.bcs and %bottom%.bcs into %script%.bcs" END + END ELSE BEGIN + PATCH_IF top_exists BEGIN // in which case, bottom doesn't exist + WRITE_ASCIIE 0x258 "%top%" (8) + END // if it doesn't exist, we just overwrite top + END + WRITE_ASCIIE 0x250 "%arguments%" (8) + END ELSE BEGIN + FOR (i=blank;i>0x250;i=i - 8) BEGIN + READ_ASCII i - 8 ~move~ + WRITE_ASCIIE i ~%move%~ (8) + END + WRITE_ASCIIE 0x250 ~%arguments%~ (8) + END +END + +DEFINE_PATCH_FUNCTION CRE_insert_script_above // legacy syntax + STR_VAR + arguments="" +BEGIN + LPF CRE_insert_script_high STR_VAR arguments END +END + +DEFINE_PATCH_FUNCTION CRE_insert_script_below // legacy syntax + STR_VAR + arguments="" +BEGIN + LPF CRE_insert_script_low STR_VAR arguments END +END + + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// looks for a script anywhere and returns 1 if true +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_match_script + STR_VAR + arguments="" + RET + value +BEGIN + SET value=0 + FOR (i=0x248;i<0x270;i=i+8) BEGIN + READ_ASCII i ~script~ + PATCH_IF ~%script%~ STRING_EQUAL_CASE ~%arguments%~ BEGIN + SET value=1 + SET i=0x270 + END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// add a spell by name alone (if spell has form SPELL(x), add it x times) +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION ~QUICK_ADD_SPELL~ + INT_VAR as_known=0 + STR_VAR ~spellname~="" +BEGIN + LPF return_function_and_argument STR_VAR input= ~%spellname%~ RET spellname=function number=argument END + + PATCH_IF ~%number%~ STRING_EQUAL_CASE ~~ BEGIN + SET number=1 + END + LPF deabbreviate_spellname STR_VAR input= ~%spellname%~ RET spellname=spellname END + LPF get_spellcode STR_VAR input= ~%spellname%~ RET spell=value END + INNER_PATCH_SAVE spell ~%spell%~ BEGIN + REPLACE_TEXTUALLY ~%percentage%~ ~~ + END + TO_UPPER spell + PATCH_IF VARIABLE_IS_SET ~%spellname%_LEVEL~ BEGIN + SET ~spell_level~= ~%%spellname%_LEVEL%~ + SPRINT ~spell_type~ EVALUATE_BUFFER ~%%spellname%_TYPE%~ + END ELSE + PATCH_IF VARIABLE_IS_SET ~RESREF_%spell%_LEVEL~ BEGIN + SET ~spell_level~= ~%RESREF_%spell%_LEVEL%~ + SPRINT ~spell_type~ EVALUATE_BUFFER ~%RESREF_%spell%_TYPE%~ + END ELSE BEGIN + // hardcode spells in SCS's trigger space as innate + PATCH_MATCH "%spell%" WITH + "DW#MS.*" "DW#SQ.*" "DW#TG.*" BEGIN + SPRINT spell_type innate + END + DEFAULT + INNER_ACTION BEGIN + COPY_EXISTING ~%spell%.spl~ ~override~ + LPF SPL_read_spell_type RET spell_type=value END + LPF SPL_read_level RET spell_level=value END + SET spell_level -= 1 + BUT_ONLY + END + END + END + PATCH_IF "%spell_type%" STRING_EQUAL_CASE innate BEGIN + SET spell_level=0 + END + // yes, this is hideous, but if there's a way to send level to ADD_MEMORIZED_SPELL as a variable, I don't know it + PATCH_IF as_known BEGIN + PATCH_MATCH "%spell_level%" WITH + 0 BEGIN + ADD_KNOWN_SPELL "%spell%" #0 "%spell_type%" + END + 1 BEGIN + ADD_KNOWN_SPELL "%spell%" #1 "%spell_type%" + END + 2 BEGIN + ADD_KNOWN_SPELL "%spell%" #2 "%spell_type%" + END + 3 BEGIN + ADD_KNOWN_SPELL "%spell%" #3 "%spell_type%" + END + 4 BEGIN + ADD_KNOWN_SPELL "%spell%" #4 "%spell_type%" + END + 5 BEGIN + ADD_KNOWN_SPELL "%spell%" #5 "%spell_type%" + END + 6 BEGIN + ADD_KNOWN_SPELL "%spell%" #6 "%spell_type%" + END + 7 BEGIN + ADD_KNOWN_SPELL "%spell%" #7 "%spell_type%" + END + 8 BEGIN + ADD_KNOWN_SPELL "%spell%" #8 "%spell_type%" + END + DEFAULT // assume level 0 + ADD_KNOWN_SPELL "%spell%" #0 "%spell_type%" + END + END ELSE BEGIN + PATCH_MATCH "%spell_level%" WITH + 0 BEGIN + ADD_MEMORIZED_SPELL "%spell%" #0 "%spell_type%" (number) + END + 1 BEGIN + ADD_MEMORIZED_SPELL "%spell%" #1 "%spell_type%" (number) + END + 2 BEGIN + ADD_MEMORIZED_SPELL "%spell%" #2 "%spell_type%" (number) + END + 3 BEGIN + ADD_MEMORIZED_SPELL "%spell%" #3 "%spell_type%" (number) + END + 4 BEGIN + ADD_MEMORIZED_SPELL "%spell%" #4 "%spell_type%" (number) + END + 5 BEGIN + ADD_MEMORIZED_SPELL "%spell%" #5 "%spell_type%" (number) + END + 6 BEGIN + ADD_MEMORIZED_SPELL "%spell%" #6 "%spell_type%" (number) + END + 7 BEGIN + ADD_MEMORIZED_SPELL "%spell%" #7 "%spell_type%" (number) + END + 8 BEGIN + ADD_MEMORIZED_SPELL "%spell%" #8 "%spell_type%" (number) + END + DEFAULT // assume level 0 + ADD_MEMORIZED_SPELL "%spell%" #0 "%spell_type%" (number) + END + + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// helper function to add all SPPR spells permitted by class/level/alignment to the creature as known +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_add_all_priest_spells +BEGIN + INNER_ACTION BEGIN + LAM read_in_hidespl // (do it now because remove_spell_of_type needs it anyway) + END + // wipe extant spells + LPF CRE_remove_spell_of_type INT_VAR skip_hidden=1 known_only=1 STR_VAR arguments=SPPR END + // data collection + LPF CRE_read_class RET class=value END + LPF CRE_read_level1 RET level1=value END + LPF CRE_read_level2 RET level2=value END + LPF CRE_read_level3 RET level3=value END + PATCH_MATCH "%class%" WITH + CLERIC CLERIC_MAGE CLERIC_THIEF BEGIN + SET type=1 // cleric + SPRINT list mxsplprs + SET level=level1 + END + FIGHTER_CLERIC BEGIN + SET type=1 // cleric + SPRINT list mxsplprs + SET level=level2 + END + FIGHTER_MAGE_CLERIC BEGIN + SET type=1 // cleric + SPRINT list mxsplprs + SET level=level3 + END + PALADIN BEGIN + SET type=1 // cleric + SPRINT list mxsplpal + SET level=level1 + END + DRUID BEGIN + SET type=2 // druid + SPRINT list mxspldru + SET level=level1 + END + RANGER BEGIN + SET type=2 // druid + SPRINT list mxsplran + SET level=level1 + END + FIGHTER_DRUID BEGIN + SET type=2 // druid + SPRINT list mxspldru + SET level=level2 + END + CLERIC_RANGER BEGIN + SET type=3 // both + SPRINT list mxsplprs + SET level=level1 + END + DEFAULT // no spells + SET level=0 + END + PATCH_IF level>0 BEGIN + // find highest level known + INNER_ACTION BEGIN + COPY_EXISTING "%list%.2da" "%workspace%" + COUNT_2DA_COLS colcount // also gives # spell levels+1 + COUNT_2DA_ROWS colcount rowcount + SET highest=0 + FOR (i=0;ispl_off BEGIN + READ_ASCII spl_off check (length) + READ_ASCII spl_off temp + PATCH_IF ~%check%~ STRING_EQUAL_CASE ~%arguments%~ BEGIN + PATCH_IF skip_hidden BEGIN + TO_LOWER temp + PATCH_IF !VARIABLE_IS_SET $spell_is_hidden("%temp%") BEGIN + SPRINT list "%list% %temp%" + END + END ELSE BEGIN + SPRINT ~list~ ~%list% %temp%~ + END + END + END + END + WHILE ~%list%~ STRING_COMPARE_CASE ~~ BEGIN + LPF return_first_entry STR_VAR list RET spell=entry list=list END + PATCH_IF !known_only BEGIN + REMOVE_MEMORIZED_SPELL ~%spell%~ + END + REMOVE_KNOWN_SPELL ~%spell%~ + END +END + +DEFINE_PATCH_FUNCTION CRE_remove_spell + STR_VAR arguments = "" +BEGIN + LPF get_spellcode STR_VAR input="%arguments%" RET spellcode=value END + REMOVE_MEMORIZED_SPELL ~%spellcode%~ + REMOVE_KNOWN_SPELL ~%spellcode%~ +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// give immunity to a spell (opcode 206) +///////////// +///////////// if we use "arguments" assume it's a string of entries +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_immunity_to_spell + STR_VAR spellname="" + spellcode="" + arguments="" +BEGIN + PATCH_IF ~%spellname%~ STRING_COMPARE_CASE ~~ BEGIN + LPF deabbreviate_spellname STR_VAR input= ~%spellname%~ RET spellname END + PATCH_IF VARIABLE_IS_SET "%spellname%" BEGIN + SPRINT spellcode EVALUATE_BUFFER ~%%spellname%%~ + END ELSE BEGIN + SPRINT spellcode "%spellname%" + LPF warning STR_VAR warning="Spell %spellname% does not appear to exist" END + END + END + PATCH_IF ~%spellcode%~ STRING_COMPARE_CASE ~~ BEGIN + LPF add_entry_inline STR_VAR arguments =~opcode=>206 timing=>9 resource=>%spellcode%~ type=effect file_ext=CRE END + END + PATCH_IF ~%arguments%~ STRING_COMPARE_CASE ~~ BEGIN + LPF return_first_entry STR_VAR list= ~%arguments%~ RET spell=entry arguments=list END + INNER_ACTION BEGIN + ACTION_IF FILE_EXISTS_IN_GAME ~%spell%.spl~ BEGIN + OUTER_SPRINT spellcode ~%spell%~ + OUTER_SPRINT spellname ~~ + END ELSE BEGIN + OUTER_SPRINT spellname ~%spell%~ + OUTER_SPRINT spellcode ~~ + END + END + LPF CRE_immunity_to_spell STR_VAR arguments spellname spellcode END + END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("CRE_immunity_to_spell") "" + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// give immunity to an animation (opcode 296) +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_immunity_to_animation + STR_VAR arguments="" +BEGIN + PATCH_IF ~%arguments%~ STRING_COMPARE_CASE ~~ BEGIN + LPF return_first_entry STR_VAR list= ~%arguments%~ RET entry=entry arguments=list END + LPF add_entry_inline STR_VAR arguments =~opcode=>296 timing=>9 resource=>%entry%~ type=effect file_ext=CRE END + LPF CRE_immunity_to_string STR_VAR arguments END + END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("CRE_immunity_to_animation") "" + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// give immunity to a string (opcode 267) +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_immunity_to_string + STR_VAR arguments="" +BEGIN + PATCH_IF ~%arguments%~ STRING_COMPARE_CASE ~~ BEGIN + LPF return_first_entry STR_VAR list= ~%arguments%~ RET entry=entry arguments=list END + LPF add_entry_inline STR_VAR arguments =~opcode=>267 timing=>9 parameter1=>%entry%~ type=effect file_ext=CRE END + LPF CRE_immunity_to_string STR_VAR arguments END + END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("CRE_immunity_to_string") "" + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// give immunity to an opcode (opcode 101) +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_immunity_to_opcode + STR_VAR arguments="" +BEGIN + PATCH_IF ~%arguments%~ STRING_COMPARE_CASE ~~ BEGIN + LPF return_first_entry STR_VAR list=~%arguments%~ RET entry=entry arguments=list END + LPF delete_entry STR_VAR type=effect arguments=~opcode=101 and parameter2=%entry%~ file_ext=CRE END + LPF add_entry_inline STR_VAR arguments =~opcode=>101 timing=>9 parameter2=>%entry%~ type=effect file_ext=CRE END + LPF CRE_immunity_to_opcode STR_VAR arguments END + END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("CRE_immunity_to_opcode") "" + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// give immunity to an icon (opcode 169) +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_immunity_to_icon + STR_VAR arguments="" +BEGIN + PATCH_IF ~%arguments%~ STRING_COMPARE_CASE ~~ BEGIN + LPF return_first_entry STR_VAR list= ~%arguments%~ RET entry=entry arguments=list END + LPF add_entry_inline STR_VAR arguments =~opcode=>169 timing=>9 parameter2=>%entry%~ type=effect file_ext=CRE END + LPF CRE_immunity_to_icon STR_VAR arguments END + END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("CRE_immunity_to_icon") "" + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// enforce saving throws by class and level +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_enforce_saves + STR_VAR arguments="" +BEGIN + INNER_ACTION BEGIN + LAM read_in_saving_throws + END + // initialise the enforced values + PATCH_FOR_EACH save IN death wand polymorph breath spell BEGIN + SET ~enforced_%save%~ = 20 + END + // read in class and decompose + LPF CRE_read_class RET classlist=value END + // go through each class, get its saves for the CRE's level, and update the record of the correct saves + SET levelnum=1 + WHILE ~%classlist%~ STRING_COMPARE ~~ BEGIN + LPF return_first_entry STR_VAR list= ~%classlist%~ separator ="_" RET classlist=list class=entry END + TO_UPPER class + PATCH_IF !VARIABLE_IS_SET $class_file_save_map( ~%class%~) BEGIN + SPRINT core_type WAR + END ELSE BEGIN + SPRINT core_type $class_file_save_map( ~%class%~) + END + LPF ~CRE_read_level%levelnum%~ RET level=value END + SET level=level<1?1:level + SET level=level>maximum_character_level?maximum_character_level:level + PATCH_FOR_EACH save IN death wand polymorph breath spell BEGIN + SET possible = $saving_throw_value_base(~%core_type%~ ~%level%~ ~%save%~) + SET ~enforced_%save%~ = ~enforced_%save%~ >possible ? possible : ~enforced_%save%~ + END + SET levelnum=levelnum+1 + END + // do the comparison + PATCH_FOR_EACH save IN death wand polymorph breath spell BEGIN + LPF ~CRE_read_save_vs_%save%~ RET currentsave = value END + SET possiblesave = ~enforced_%save%~ + PATCH_MATCH ~%arguments%~ WITH + at_worst + BEGIN + SET newsave=currentsavepossiblesave ? currentsave : possiblesave + END + within_tolerance + BEGIN + LPF check_ini STR_VAR ini=save_tolerance RET tolerance=value END + SET new=(ABS(possible - current))21 BEGIN + SET level=21 + END + PATCH_IF VARIABLE_IS_SET $thac0_table_row("%class%") BEGIN + SET row=$thac0_table_row("%class%") + READ_2DA_ENTRY_FORMER thac0_table_read row level thac0_here + SET possible = (thac0_here < possible) ? thac0_here : possible + END + END + PATCH_IF possible=99 BEGIN // must be a monster + LPF CRE_read_level1 RET level1=value END + SET possible = level1 > 20 ? 0 : (20 - level1) + END + + LPF CRE_read_thac0 RET current=value END + PATCH_MATCH ~%arguments%~ WITH + at_worst + BEGIN + SET new=currentpossible ? current : possible + END + only_if_new + BEGIN + SET new=current=100 ? possible : current + END + within_tolerance + BEGIN + LPF check_ini STR_VAR ini=thac0_tolerance RET tolerance=value END + SET new=(ABS(possible - current))possible ? current : possible + END + at_best + BEGIN + SET new=current0xa4 + morale=>0xa8 + happy=>0xac + battle_cry1=>0xc8 + battle_cry2=>0xcc + attack1=>0xdc + attack2=>0xe0 + damage=>0xec + dying=>0xf0 + select_common1=>0x10c + select_common2=>0x110 + select_common3=>0x114 + select_common4=>0x118 + select_common5=>0x11c + select_common6=>0x120 + picked_pocket=>0x1b8 + + END + SET loc=$sound_map("%key%") + SET val=RESOLVE_STR_REF ( ( AT "%value%")) + WRITE_LONG loc val + LPF CRE_say_sounds STR_VAR arguments END + END +END + +OUTER_SPRINT $SFO_do_not_parse_arguments("CRE_say_sounds") "" + +DEFINE_PATCH_FUNCTION CRE_say_sounds_literal + STR_VAR arguments="" +BEGIN + PATCH_IF "%arguments%" STRING_COMPARE "" BEGIN + LPF return_first_pair STR_VAR list="%arguments%" RET key=key value=value arguments=list END + DEFINE_ASSOCIATIVE_ARRAY sound_map BEGIN + initial_meeting=>0xa4 + morale=>0xa8 + happy=>0xac + unhappy_breaking_point=>0xb8 + battle_cry1=>0xc8 + battle_cry2=>0xcc + attack1=>0xdc + attack2=>0xe0 + damage=>0xec + dying=>0xf0 + select_common1=>0x10c + select_common2=>0x110 + select_common3=>0x114 + select_common4=>0x118 + select_common5=>0x11c + select_common6=>0x120 + picked_pocket=>0x1b8 + + END + SET loc=$sound_map("%key%") + WRITE_LONG loc value + LPF CRE_say_sounds_literal STR_VAR arguments END + END +END + +DEFINE_PATCH_FUNCTION wipe_soundset + STR_VAR arguments="" +BEGIN + FOR (i=0xa4;i<0x234;i+=4) BEGIN + WRITE_LONG i "-1" + END +END + +OUTER_SPRINT $SFO_do_not_parse_arguments("CRE_say_sounds_literal") "" + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// steal soundset +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_steal_sounds_from + STR_VAR arguments="" +BEGIN + SET found=0 + INNER_ACTION BEGIN + ACTION_IF FILE_EXISTS_IN_GAME ~%arguments%.cre~ BEGIN + OUTER_SET found=1 + COPY_EXISTING ~%arguments%.cre~ ~override~ + READ_ASCII 0xa4 sounddata (0x190) + BUT_ONLY + END + END + PATCH_IF found BEGIN + WRITE_ASCIIE 0xa4 ~%sounddata%~ (0x190) + END ELSE BEGIN + LPF warning STR_VAR warning=~Tried to steal soundset from %arguments%.cre, but it doesn't exist~ END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// add a list of items +///////////// +///////////// syntax is add_items => ~string~ +///////////// string is list in format ITEMNAME or ITEMNAME(arguments) +///////////// arguments is either (arg) or (arg,arg) +///////////// arg is either a slot name (case-insensitive), NOTEQUIP, or xNUM +///////////// NUM is either a number or n.m.o - in the latter case it's the number to go into each item-num slot +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_add_items + INT_VAR replace=0 + STR_VAR arguments="" +BEGIN + SET equip=1 + INNER_ACTION BEGIN + LAUNCH_ACTION_MACRO read_in_item_types + END + WHILE ~%arguments%~ STRING_COMPARE ~~ BEGIN + SPRINT ~slot~ ~NONE~ + SET num1=0 + SET num2=0 + SET num3=0 + SET twohanded=0 + LPF return_first_entry STR_VAR list= ~%arguments%~ RET entry=entry arguments=list END + LPF return_function_and_argument STR_VAR input= ~%entry%~ RET item=function properties=argument END + WHILE ~%properties%~ STRING_COMPARE ~~ BEGIN + LPF return_first_entry STR_VAR list= ~%properties%~ separator = "," RET arg_entry=entry properties=list END + LPF return_first_letter STR_VAR input= ~%arg_entry%~ RET firstletter=firstletter rest=rest END + PATCH_IF ~%firstletter%~ STRING_EQUAL_CASE "X" BEGIN // it's numeric + SET entrynumber=1 + WHILE ~%rest%~ STRING_COMPARE_CASE ~~ BEGIN + LPF return_first_entry STR_VAR list= ~%rest%~ separator = "\." RET entry=entry rest=list END + SET ~num%entrynumber%~= ~%entry%~ + SET entrynumber=entrynumber+1 + END + END ELSE BEGIN + PATCH_IF "%arg_entry%" STRING_EQUAL_CASE notequip BEGIN + SET equip=0 + END ELSE BEGIN + // it's a slot + TO_UPPER ~arg_entry~ + SPRINT ~slot~ ~%arg_entry%~ + END + END + END + PATCH_IF ~%slot%~ STRING_EQUAL_CASE ~NONE~ BEGIN + INNER_ACTION BEGIN + ACTION_IF FILE_EXISTS_IN_GAME ~%item%.itm~ BEGIN + COPY_EXISTING ~%item%.itm~ ~override~ + SPRINT ~ITM_file~ ~%SOURCE_RES%~ + TO_LOWER ~ITM_file~ + READ_SHORT 0x1c item_type_code + PATCH_IF VARIABLE_IS_SET $item_location_map(~%item_type_code%~) BEGIN + SPRINT ~slot~ $item_location_map(~%item_type_code%~) + TO_UPPER ~slot~ + END ELSE BEGIN + SPRINT ~slot~ INV + END + BUT_ONLY + END ELSE BEGIN + LAF warning STR_VAR warning= "Warning: tried to add item %item%, but it doesn't (yet) exist and you haven't told me its slot" END + END + END + END + PATCH_IF ~%slot%~ STRING_COMPARE_CASE ~NONE~ BEGIN + PATCH_IF ~%slot%~ STRING_EQUAL_CASE ~two-handed~ BEGIN + SPRINT ~slot~ ~WEAPON~ + SET twohanded=1 + END + PATCH_IF replace BEGIN + SPRINT string ~REPLACE_CRE_ITEM~ + END ELSE BEGIN + SPRINT string ~ADD_CRE_ITEM~ + END + SPRINT ~string~ ~%string% %item% #%num1% #%num2% #%num3% NONE %slot%~ + PATCH_IF ~%slot%~ STRING_EQUAL_CASE ~WEAPON~ BEGIN + PATCH_IF equip BEGIN + SPRINT ~string~ ~%string% EQUIP~ + END + PATCH_IF twohanded=1 BEGIN + SPRINT ~string~ ~%string% TWOHANDED~ + END + END + LPF patch_reinclude_this STR_VAR input= ~%string%~ END + END + + END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("CRE_add_items") "" + + +DEFINE_PATCH_FUNCTION CRE_replace_items + STR_VAR arguments="" +BEGIN + LPF CRE_add_items INT_VAR replace=1 STR_VAR arguments END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("CRE_replace_items") "" + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// remove items - just a hook for extant code +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_remove_items + STR_VAR arguments="" +BEGIN + PATCH_IF ~%arguments%~ STRING_EQUAL_CASE ~all~ BEGIN + SPRINT ~temp~ ~REMOVE_CRE_ITEMS~ + END ELSE BEGIN + SPRINT ~temp~ ~REMOVE_CRE_ITEM %arguments%~ + END + LPF patch_reinclude_this STR_VAR input= ~%temp%~ END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("CRE_remove_items") "" + + + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// build a basic creature +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_build +BEGIN + ///// basic structure + DELETE_BYTES 0x0 BUFFER_LENGTH + INSERT_BYTES 0x0 0x434 + + // sig + WRITE_ASCII 0x0 ~CRE V1.0~ + // name + WRITE_LONG 0x8 ~-1~ + WRITE_LONG 0xc ~-1~ + // hit points + WRITE_SHORT 0x24 0xff + WRITE_SHORT 0x24 0xff + // animation + WRITE_SHORT 0x28 0xffff + // effect flag + WRITE_BYTE 0x33 1 + // portrait + WRITE_ASCII 0x34 None + WRITE_ASCII 0x3c None + // AC + WRITE_SHORT 0x46 10 + WRITE_SHORT 0x48 10 + // THAC0 + WRITE_BYTE 0x52 100 + // #at + WRITE_BYTE 0x53 1 + // saves + WRITE_BYTE 0x54 100 + WRITE_BYTE 0x55 100 + WRITE_BYTE 0x56 100 + WRITE_BYTE 0x57 100 + WRITE_BYTE 0x58 100 + SET sound_loc=0xa4 + WHILE sound_loc < 0x234 BEGIN + WRITE_LONG sound_loc ~-1~ + SET sound_loc = sound_loc +4 + END + // level + WRITE_BYTE 0x234 1 + WRITE_BYTE 0x235 1 + WRITE_BYTE 0x236 1 + // sex + WRITE_BYTE 0x237 1 + // abilities + WRITE_BYTE 0x238 9 + WRITE_BYTE 0x23a 9 + WRITE_BYTE 0x23b 9 + WRITE_BYTE 0x23c 9 + WRITE_BYTE 0x23d 9 + WRITE_BYTE 0x23e 9 + // morale [NEEDS RESEARCH] + WRITE_BYTE 0x23f 10 + WRITE_BYTE 0x240 5 + WRITE_BYTE 0x242 60 + // racial enemy + WRITE_BYTE 0x241 0xff + // EA + WRITE_BYTE 0x270 128 + // general + WRITE_BYTE 0x271 1 + // race + WRITE_BYTE 0x272 1 + // class + WRITE_BYTE 0x273 0xff + // gender + WRITE_BYTE 0x275 1 + // alignment + WRITE_BYTE 0x27b 34 + // probably needs this value + WRITE_SHORT 0x27c 0xffff + WRITE_SHORT 0x27e 0xffff + //// + //offsets + WRITE_LONG 0x2a0 0x2d4 + WRITE_LONG 0x2a8 0x2d4 + WRITE_LONG 0x2ac 17 + WRITE_LONG 0x2b0 0x3e4 + WRITE_LONG 0x2b8 0x3e4 + WRITE_LONG 0x2bc 0x3e4 + WRITE_LONG 0x2c4 0x3e4 + //memorization data + //priest + FOR(level=0;level<7;level=level+1) BEGIN + WRITE_SHORT level* 0x10 + 0x2d4 ~level~ + END + // wizard + FOR(level=0;level<9;level=level+1) BEGIN + WRITE_SHORT level* 0x10 + 0x344 ~level~ + WRITE_SHORT 0x6 + level* 0x10 + 0x344 1 + END + // innate + WRITE_SHORT 0x3da 2 + // item slot wipe + FOR (i=0x3e4;i<0x430;i=i+2) BEGIN + WRITE_SHORT i ~-1~ + END + +END + +DEFINE_PATCH_FUNCTION CRE_postbuild +BEGIN + LPF CRE_enforce_saves STR_VAR arguments=only_if_new END + LPF CRE_enforce_thac0 STR_VAR arguments=only_if_new END + LPF CRE_enforce_animation STR_VAR arguments=only_if_new END + + +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// find the current value of a proficiency +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_read_proficiency + STR_VAR arguments="" + RET value +BEGIN + SET value=0 + TO_UPPER arguments + SPRINT prof ~PROFICIENCY%arguments%~ + SET prof_int_target=IDS_OF_SYMBOL (~stats~ ~%prof%~) + SPRINT entry_type effect + SPRINT file_ext CRE + LAUNCH_PATCH_MACRO get_offset_array + SET prof=0 + PHP_EACH offset_array AS int =>offset_base BEGIN + LPF CRE_read_opcode RET opcode=value END + PATCH_IF opcode=233 BEGIN + LPF CRE_read_parameter2 RET prof_int=value END + PATCH_IF prof_int=prof_int_target BEGIN + LPF CRE_read_parameter1 RET value=value END + END + END + END + +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// add a proficiency (by name) +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_add_proficiencies + STR_VAR arguments="" +BEGIN + PATCH_IF ~%arguments%~ STRING_COMPARE_CASE ~~ BEGIN + LPF return_first_pair STR_VAR list= ~%arguments%~ RET prof=key add=value arguments=list END + LPF CRE_read_proficiency STR_VAR arguments= ~%prof%~ RET old_value=value END + TO_UPPER prof + SET_BG2_PROFICIENCY ~PROFICIENCY%prof%~ old_value+add + LPF CRE_add_proficiencies STR_VAR arguments= ~%arguments%~ END + END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("CRE_add_proficiencies") "" + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// set a proficiency +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_set_proficiencies + STR_VAR arguments="" +BEGIN + PATCH_IF ~%arguments%~ STRING_COMPARE_CASE ~~ BEGIN + LPF return_first_pair STR_VAR list= ~%arguments%~ RET prof=key set=value arguments=list END + TO_UPPER prof + SET_BG2_PROFICIENCY ~PROFICIENCY%prof%~ set + LPF CRE_set_proficiencies STR_VAR arguments= ~%arguments%~ END + END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("CRE_set_proficiencies") "" + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// wipe existing proficiencies (BG1 and BG2) +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_wipe_proficiencies + STR_VAR arguments="" +BEGIN + WRITE_ASCII 0x6e ~~ (8) + LPF CRE_delete_opcodes STR_VAR arguments=233 END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// swap an item +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_swap_items + STR_VAR arguments="" +BEGIN + PATCH_IF ~%arguments%~ STRING_COMPARE_CASE ~~ BEGIN + LPF return_first_pair STR_VAR list= ~%arguments%~ RET old=key new=value arguments=list END + REPLACE_TEXTUALLY CASE_INSENSITIVE ~%old%~ ~%new%~ (8) + LPF CRE_swap_items STR_VAR arguments= ~%arguments%~ END + END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("CRE_swap_items") "" + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// delete specified effects +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_delete_opcodes + STR_VAR arguments="" +BEGIN + PATCH_IF ~%arguments%~ STRING_COMPARE_CASE ~~ BEGIN + LPF return_first_entry STR_VAR list= ~%arguments%~ RET opcode_to_delete=entry arguments=list END + LPF DELETE_CRE_EFFECT INT_VAR opcode_to_delete END + LPF CRE_delete_opcodes STR_VAR arguments END + END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("CRE_delete_opcodes") "" + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// PC detector (assumes a PC grid already read in) +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_is_PC + RET value +BEGIN + LPF CRE_read_dv RET dv=value END + TO_LOWER dv + PATCH_IF VARIABLE_IS_SET $script_name_pdialog( ~%dv%~) BEGIN + PATCH_MATCH "%filename%" WITH + sarev1 sarevo sarevo2 // BG1 sarevok in EET, shares DV with joinable sarevok + "%tutu_var%arkani3" "%tutu_var%deder3" // false positives - all copies of the illusionary Candlekeep NPCs who exist in RL as INNOCENTs + finimoen // false positive, Imoen in Ascension + BEGIN + SET value=0 + END + DEFAULT + SET value=1 + END + END ELSE BEGIN + PATCH_IF ~%filename%~ STRING_EQUAL_CASE ~charbase~ BEGIN + SET value=1 + END ELSE BEGIN + SET value=0 + END + END + +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// warrior detector +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_is_warrior + STR_VAR class=UNKNOWN + RET value +BEGIN + PATCH_IF ~%class%~ STRING_EQUAL_CASE UNKNOWN BEGIN + LPF CRE_read_class RET class=value END + END + PATCH_MATCH ~%class%~ WITH + FIGHTER PALADIN RANGER FIGHTER_MAGE FIGHTER_CLERIC FIGHTER_THIEF FIGHTER_DRUID FIGHTER_MAGE_CLERIC FIGHTER_MAGE_THIEF + BEGIN + SET value=1 + END + DEFAULT + SET value=0 + END +END +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// thief detector +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_is_thief + RET value +BEGIN + LPF CRE_read_class RET class=value END + PATCH_MATCH ~%class%~ WITH + THIEF CLERIC_THIEF MAGE_THIEF FIGHTER_THIEF FIGHTER_MAGE_THIEF + BEGIN + SET value=1 + END + DEFAULT + SET value=0 + END +END +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// innocence detector +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_is_innocent + RET value +BEGIN + LPF CRE_read_class RET class=value END + PATCH_MATCH ~%class%~ WITH + INNOCENT + BEGIN + SET value=1 + END + DEFAULT + SET value=0 + END +END + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// alignment detectors +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_is_evil + RET value +BEGIN + LPF CRE_read_alignment RET alignment=value END + PATCH_MATCH ~%alignment%~ WITH + LAWFUL_EVIL CHAOTIC_EVIL NEUTRAL_EVIL + BEGIN + SET value=1 + END + DEFAULT + SET value=0 + END +END + +DEFINE_PATCH_FUNCTION CRE_is_good + RET value +BEGIN + LPF CRE_read_alignment RET alignment=value END + PATCH_MATCH ~%alignment%~ WITH + LAWFUL_GOOD CHAOTIC_GOOD NEUTRAL_GOOD + BEGIN + SET value=1 + END + DEFAULT + SET value=0 + END +END +DEFINE_PATCH_FUNCTION CRE_is_lawful + RET value +BEGIN + LPF CRE_read_alignment RET alignment=value END + PATCH_MATCH ~%alignment%~ WITH + LAWFUL_GOOD LAWFUL_NEUTRAL LAWFUL_EVIL + BEGIN + SET value=1 + END + DEFAULT + SET value=0 + END +END +DEFINE_PATCH_FUNCTION CRE_is_chaotic + RET value +BEGIN + LPF CRE_read_alignment RET alignment=value END + PATCH_MATCH ~%alignment%~ WITH + CHAOTIC_GOOD CHAOTIC_NEUTRAL CHAOTIC_EVIL + BEGIN + SET value=1 + END + DEFAULT + SET value=0 + END +END +DEFINE_PATCH_FUNCTION CRE_is_geneutral + RET value +BEGIN + LPF CRE_read_alignment RET alignment=value END + PATCH_MATCH ~%alignment%~ WITH + NEUTRAL LAWFUL_NEUTRAL CHAOTIC_NEUTRAL NONE + BEGIN + SET value=1 + END + DEFAULT + SET value=0 + END +END + +DEFINE_PATCH_FUNCTION CRE_is_lcneutral + RET value +BEGIN + LPF CRE_read_alignment RET alignment=value END + PATCH_MATCH ~%alignment%~ WITH + NEUTRAL NEUTRAL_GOOD NEUTRAL_EVIL NONE + BEGIN + SET value=1 + END + DEFAULT + SET value=0 + END +END + + +DEFINE_PATCH_FUNCTION CRE_make_lawful + RET value +BEGIN + LPF CRE_read_alignment RET alignment=value END + PATCH_MATCH ~%alignment%~ WITH + NEUTRAL CHAOTIC_NEUTRAL NONE + BEGIN + LPF CRE_alignment STR_VAR arguments=LAWFUL_NEUTRAL END + END + NEUTRAL_GOOD CHAOTIC_GOOD + BEGIN + LPF CRE_alignment STR_VAR arguments=LAWFUL_GOOD END + END + NEUTRAL_EVIL CHAOTIC_EVIL + BEGIN + LPF CRE_alignment STR_VAR arguments=LAWFUL_EVIL END + END + DEFAULT + END +END + + +DEFINE_PATCH_FUNCTION CRE_make_chaotic + RET value +BEGIN + LPF CRE_read_alignment RET alignment=value END + PATCH_MATCH ~%alignment%~ WITH + NEUTRAL LAWFUL_NEUTRAL NONE + BEGIN + LPF CRE_alignment STR_VAR arguments=CHAOTIC_NEUTRAL END + END + NEUTRAL_GOOD LAWFUL_GOOD + BEGIN + LPF CRE_alignment STR_VAR arguments=CHAOTIC_GOOD END + END + NEUTRAL_EVIL LAWFUL_EVIL + BEGIN + LPF CRE_alignment STR_VAR arguments=CHAOTIC_EVIL END + END + DEFAULT + END +END + +DEFINE_PATCH_FUNCTION CRE_make_lcneutral + RET value +BEGIN + LPF CRE_read_alignment RET alignment=value END + PATCH_MATCH ~%alignment%~ WITH + CHAOTIC_NEUTRAL LAWFUL_NEUTRAL NONE + BEGIN + LPF CRE_alignment STR_VAR arguments=NEUTRAL END + END + CHAOTIC_GOOD LAWFUL_GOOD + BEGIN + LPF CRE_alignment STR_VAR arguments=NEUTRAL_GOOD END + END + CHAOTIC_EVIL LAWFUL_EVIL + BEGIN + LPF CRE_alignment STR_VAR arguments=NEUTRAL_EVIL END + END + DEFAULT + END +END + +DEFINE_PATCH_FUNCTION CRE_make_good + RET value +BEGIN + LPF CRE_read_alignment RET alignment=value END + PATCH_MATCH ~%alignment%~ WITH + NEUTRAL NEUTRAL_EVIL NONE + BEGIN + LPF CRE_alignment STR_VAR arguments=NEUTRAL_GOOD END + END + CHAOTIC_NEUTRAL CHAOTIC_EVIL + BEGIN + LPF CRE_alignment STR_VAR arguments=CHAOTIC_GOOD END + END + LAWFUL_NEUTRAL LAWFUL_EVIL + BEGIN + LPF CRE_alignment STR_VAR arguments=LAWFUL_GOOD END + END + DEFAULT + END +END + +DEFINE_PATCH_FUNCTION CRE_make_evil + RET value +BEGIN + LPF CRE_read_alignment RET alignment=value END + PATCH_MATCH ~%alignment%~ WITH + NEUTRAL NEUTRAL_GOOD NONE + BEGIN + LPF CRE_alignment STR_VAR arguments=NEUTRAL_EVIL END + END + CHAOTIC_NEUTRAL CHAOTIC_GOOD + BEGIN + LPF CRE_alignment STR_VAR arguments=CHAOTIC_EVIL END + END + LAWFUL_NEUTRAL LAWFUL_GOOD + BEGIN + LPF CRE_alignment STR_VAR arguments=LAWFUL_EVIL END + END + DEFAULT + END +END +DEFINE_PATCH_FUNCTION CRE_make_geneutral + RET value +BEGIN + LPF CRE_read_alignment RET alignment=value END + PATCH_MATCH ~%alignment%~ WITH + NEUTRAL_EVIL NEUTRAL_GOOD NONE + BEGIN + LPF CRE_alignment STR_VAR arguments=NEUTRAL END + END + CHAOTIC_EVIL CHAOTIC_GOOD + BEGIN + LPF CRE_alignment STR_VAR arguments=CHAOTIC_NEUTRAL END + END + LAWFUL_EVIL LAWFUL_GOOD + BEGIN + LPF CRE_alignment STR_VAR arguments=LAWFUL_NEUTRAL END + END + DEFAULT + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// return item in a given slot +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_read_item_in_slot + STR_VAR arguments="" + RET value +BEGIN + PATCH_IF !VARIABLE_IS_SET $item_slot_map(0) BEGIN + INNER_ACTION BEGIN + LAUNCH_ACTION_MACRO read_in_item_slots + END + END + TO_UPPER arguments + SET slot_loc=$item_slot_map(~%arguments%~) + SET offset_slot=2*slot_loc+LONG_AT $CREoffset_loc(~item_slots~) + READ_SSHORT offset_slot item_num + PATCH_IF item_num= ~-1~ BEGIN + SPRINT value ~~ + END ELSE BEGIN + SET offset_base=LONG_AT $CREoffset_loc(~item~) + item_num * $CREentry_length(~item~) + LPF CRE_read_item_resource RET value=value END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// check if creature has a given spell +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_has_spell + STR_VAR arguments="" + RET value +BEGIN + SET value=0 + LPF get_spellcode STR_VAR input= ~%arguments%~ RET spell=value END + SPRINT entry_type memorized_spell + SPRINT file_ext CRE + LAUNCH_PATCH_MACRO get_offset_array + PHP_EACH offset_array AS int=>offset_base BEGIN + LPF CRE_read_memorized_spell RET spell_here=value END + PATCH_IF ~%spell_here%~ STRING_EQUAL_CASE ~%spell%~ BEGIN + SET value=1 + END + END +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// check if creature is dead +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_is_dead +RET value +BEGIN + LPF CRE_read_state_dead RET value1=value END + LPF CRE_read_state_stone_death RET value2=value END + value= (value1 || value2) +END + + +///////////////////////////////////////////////////////////////////////////////////////////// +/// Returns 1 if creature is unintelligent +///////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_check_if_moron // non-morons, by definition, are non-zombies, non-golems, non-gibberlings, and in one of the following categories: (i) general=HUMANOID,GIANTHUMANOID, or UNDEAD; (ii) race=DEMONIC, BEHOLDER or LYCANTHROPE; (iii) class=WOLF_VAMPIRIC, DOPPLEGANGER, or DRAGON + RET value +BEGIN + LPF CRE_read_race RET race=value END + TO_UPPER race + PATCH_MATCH ~%race%~ WITH + ZOMBIE GIBBERLING BEGIN + SET value=1 + END + DEMONIC DOPPLEGANGER LYCANTHROPE BEHOLDER BEGIN + SET value=0 + END + DEFAULT + LPF CRE_read_general RET general=value END + TO_UPPER general + PATCH_MATCH ~%general%~ WITH + HUMANOID GIANTHUMANOID BEGIN + PATCH_MATCH ~%class%~ WITH + GOLEM_STONE GOLEM_FLESH GOLEM_CLAY GOLEM_IRON BEGIN + SET value=1 + END + DEFAULT + SET value=0 + END + END + UNDEAD BEGIN + PATCH_IF (~%class%~ STRING_EQUAL SKELETON) BEGIN + SET value=1 + END ELSE BEGIN + SET value=0 + END + END + DEFAULT + LPF CRE_read_class RET class=value END + TO_UPPER class + PATCH_MATCH ~%class%~ WITH + DRAGON DOPPLEGANGER WOLF_VAMPIRIC BEGIN + SET value=0 + END + DEFAULT + SET value=1 + END + END + END +END + + +///////////////////////////////////////////////////////////////////////////////////////////// +/// logs the name of the creature +///////////////////////////////////////////////////////////////////////////////////////////// + + +DEFINE_PATCH_FUNCTION CRE_log_me STR_VAR arguments="" BEGIN + LPF log_this STR_VAR file= ~%arguments%~ input= ~%filename%~ repeat=no END +END + +//////////////////////////////////////////////////////////////////////////////////////////// +/// find the highest spell level memorised +///////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_find_highest_spell_level +STR_VAR arguments=mage +RET value +BEGIN + SET value=0 + SPRINT file_ext CRE + SPRINT entry_type memorization_info + LAUNCH_PATCH_MACRO get_offset_array + PHP_EACH offset_array AS int=>offset_base BEGIN + READ_SHORT offset_base level + READ_SHORT offset_base+0xc number + READ_SHORT offset_base+0x6 type + PATCH_IF number>0 BEGIN + SET true_level=level+1 + PATCH_IF true_level>value BEGIN + PATCH_IF ((~%arguments%~ STRING_EQUAL_CASE mage && type=1) || (~%arguments%~ STRING_EQUAL_CASE priest && type=0)) BEGIN + SET value=true_level + END + END + END + END + +END +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// set the name +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_set_name + STR_VAR arguments="" +BEGIN + LPF patch_text_entry INT_VAR loc=0xc STR_VAR function=set_string arguments= ~%arguments%~ END +END + +DEFINE_PATCH_FUNCTION CRE_set_unidentified_name + STR_VAR arguments="" +BEGIN + LPF patch_text_entry INT_VAR loc=0x8 STR_VAR function=set_string arguments= ~%arguments%~ END +END +DEFINE_PATCH_FUNCTION CRE_say_name + STR_VAR arguments="" +BEGIN + WRITE_LONG 0x8 RESOLVE_STR_REF ((AT arguments)) +END +DEFINE_PATCH_FUNCTION CRE_say_unidentified_name + STR_VAR arguments="" +BEGIN + WRITE_LONG 0xc RESOLVE_STR_REF ((AT arguments)) +END + +DEFINE_PATCH_FUNCTION CRE_set_both_names + STR_VAR arguments="" +BEGIN + LPF CRE_set_name STR_VAR arguments END + LPF CRE_set_unidentified_name STR_VAR arguments END +END + +DEFINE_PATCH_FUNCTION CRE_say_both_names + STR_VAR arguments="" +BEGIN + LPF CRE_say_name STR_VAR arguments END + LPF CRE_say_unidentified_name STR_VAR arguments END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////// +/// make casting innate +///////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_make_casting_innate +STR_VAR arguments="" +BEGIN + PATCH_MATCH "%arguments%" WITH + null BEGIN + SET value=1 + END + never BEGIN + SET value=0 + END + DEFAULT + LPF check_label STR_VAR label="%arguments%" RET value=value END + END + PATCH_IF value BEGIN + SPRINT file_ext CRE + LPF CRE_immunity_to_opcode STR_VAR arguments="38 60 80" END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////// +/// make casting instant +///////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_make_casting_instant +STR_VAR arguments="" +BEGIN + PATCH_MATCH "%arguments%" WITH + null BEGIN + SET value=1 + END + never BEGIN + SET value=0 + END + DEFAULT + LPF check_label STR_VAR label="%arguments%" RET value=value END + END + PATCH_IF value BEGIN + SPRINT file_ext CRE + LPF CRE_delete_opcodes STR_VAR arguments=189 END + LPF add_entry_inline STR_VAR file_ext=CRE type=effect arguments=~opcode=>189 parameter1=>10~ END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////// +/// immunity to various elemental and other effects +///////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_immunity +STR_VAR arguments="" +BEGIN + PATCH_MATCH ~%arguments%~ WITH + FIRE fire BEGIN + LPF CRE_immunity_to_spell STR_VAR arguments=~%WIZARD_METEOR_SWARM% %WIZARD_INCENDIARY_CLOUD% %CLERIC_FIRE_STORM% %WIZARD_FIREBALL% %WIZARD_DELAYED_BLAST_FIREBALL% %DEATHKNIGHT_FIREBALL% %WIZARD_SUN_FIRE%~ END + PATCH_IF is_bg2 BEGIN + LPF CRE_immunity_to_spell STR_VAR arguments="%RED_DRAGON_HIT%" END + END + LPF CRE_resist_fire STR_VAR arguments=100 END + END + COLD cold BEGIN + LPF CRE_immunity_to_spell STR_VAR arguments=~%WIZARD_ICE_STORM% %WIZARD_CONE_OF_COLD%~ END + PATCH_IF iwd_arcane BEGIN + LPF CRE_immunity_to_spell STR_VAR arguments="%WIZARD_SNILLOCS_SNOWBALL_SWARM% %WIZARD_ICELANCE% %WIZARD_OTILUKES_FREEZING_SPHERE%" END + END + PATCH_IF is_iwd BEGIN + LPF CRE_immunity_to_spell STR_VAR arguments="%INNATE_DRAGON_BREATH%" END + END + PATCH_IF is_bg2 BEGIN + LPF CRE_immunity_to_spell STR_VAR arguments="%SILVER_DRAGON_BREATH_COLD%" END + END + LPF CRE_resist_cold STR_VAR arguments=100 END + END + ACID acid BEGIN + LPF CRE_immunity_to_spell STR_VAR arguments=~%WIZARD_DEATH_FOG%~ END + LPF CRE_resist_acid STR_VAR arguments=100 END + END + ELECTRICITY LIGHTNING electricity lightning BEGIN + LPF CRE_immunity_to_spell STR_VAR arguments=~%WIZARD_LIGHTNING_BOLT% %WIZARD_CHAIN_LIGHTNING% %CLERIC_CALL_LIGHTNING%~ END + PATCH_IF is_bg2 BEGIN + LPF CRE_immunity_to_spell STR_VAR arguments="%BLUE_DRAGON_BREATH%" END + END + LPF CRE_resist_electricity STR_VAR arguments=100 END + END + INSECTS insects INSECT insect BEGIN + LPF CRE_immunity_to_spell STR_VAR arguments=~%CLERIC_SUMMON_INSECTS% %CLERIC_INSECT_PLAGUE% %CLERIC_CREEPING_DOOM%~ END + PATCH_IF is_bg2 BEGIN + LPF CRE_immunity_to_spell STR_VAR arguments="%BLACK_DRAGON_INSECT%" END + END + END + POISON poison BEGIN + LPF CRE_immunity_to_spell STR_VAR arguments=~%CLERIC_POISON% %WIZARD_CLOUDKILL%~ END + LPF CRE_immunity_to_opcode STR_VAR arguments=25 END + PATCH_IF is_bg2 BEGIN + LPF CRE_immunity_to_spell STR_VAR arguments="%GREEN_DRAGON_BREATH%" END + END + + LPF add_entry_inline STR_VAR arguments=~opcode=>173 parameter1=>100~ type=effect file_ext=CRE END + END + leveldrain level_drain energydrain energy_drain BEGIN + LPF CRE_immunity_to_opcode STR_VAR arguments=216 END + LPF CRE_immunity_to_icon STR_VAR arguments=59 END + LPF CRE_immunity_to_string STR_VAR arguments="41495 40968 40969 40979 41616" END + END + fear FEAR BEGIN + LPF CRE_immunity_to_opcode STR_VAR arguments="23 24 106" END + LPF CRE_immunity_to_string STR_VAR arguments="14007 17427" END + LPF CRE_immunity_to_animation STR_VAR arguments="cdhorror" END + END + DEFAULT + LPF warning STR_VAR warning=~Unrecognised immunity type %arguments% IN CRE_immunity~ END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////// +/// set level to a particular class only (entry format: "mage=>16 cleric=>14" +/// treat sorcerer as a sort of mage, use priest as shorthand for cleric or druid +///////////////////////////////////////////////////////////////////////////////////////////// + + +DEFINE_PATCH_FUNCTION CRE_level_by_class + STR_VAR arguments="" +BEGIN + PATCH_IF "%arguments%" STRING_COMPARE_CASE "" BEGIN + LPF return_first_pair STR_VAR list="%arguments%" RET target_class=key level=value list END + LPF CRE_read_class RET class=value END + PATCH_MATCH "%target_class%" WITH + mage BEGIN + LPF substitute_string STR_VAR input="%class%" arguments="sorcerer=>mage" RET class=output END + END + priest BEGIN + LPF substitute_string STR_VAR input="%class%" arguments="cleric=>priest druid=>priest" RET class=output END + END + DEFAULT + END + SET slot=0 + WHILE "%class%" STRING_COMPARE_CASE "" BEGIN + SET slot+=1 + LPF return_first_entry STR_VAR list="%class%" separator="_" RET class=list entry END + PATCH_IF "%entry%" STRING_EQUAL_CASE "%target_class%" BEGIN + LPF "CRE_level%slot%" STR_VAR arguments="%level%" END + END + END + LPF CRE_level_by_class STR_VAR arguments="%list%" END + END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("CRE_level_by_class") "" + + + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////// +/// code to enforce a creature's class features +/// +///////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_enforce_class + STR_VAR arguments="" +BEGIN + // argument parsing + SET even_if_monk=0 + SET joinable=0 + SET read_clab_at_install=0 + WHILE "%arguments%" STRING_COMPARE "" BEGIN + LPF return_first_entry STR_VAR list="%arguments%" RET entry arguments=list END + SET "%entry%"=1 + END + // sanity check - is this an actual class? (or if not, do we have a kit other than MAGESCHOOL_GENERALIST?) Do we have at least one level? If not, skip. + PATCH_IF (((BYTE_AT 0x273) <30 || ((LONG_AT 0x244) >0 && !(LONG_AT 0x244 = 1073741824))) && (BYTE_AT 0x234)>0 )BEGIN + // work out the various classes + LPF CRE_read_class RET classfull=value END + FOR (i=1;i<=3;i+=1) BEGIN + SPRINT $class("%i%") "null" + END + SET classnum=0 + SPRINT list "%classfull%" + WHILE "%list%" STRING_COMPARE "" BEGIN + LPF return_first_entry STR_VAR list separator="_" RET this_class=entry list END + SET classnum +=1 + PATCH_IF "%this_class%" STRING_EQUAL_CASE monk BEGIN + PATCH_IF !even_if_monk BEGIN + SPRINT this_class null + END + END + SPRINT $class("%classnum%") "%this_class%" + LPF "CRE_read_level%classnum%" RET level=value END + PATCH_IF level=0 BEGIN + LPF "CRE_level%classnum%" STR_VAR arguments=1 END + LPF warning STR_VAR warning="%filename% has a level value of zero for class %this_class%; setting to 1" END + END + SET $classlevel("%classnum%")=level + END + // check for an original class (only if creature has more than 1 class) + SPRINT original_class none + PATCH_IF classnum>1 BEGIN + LPF CRE_read_original_class RET original_class=value END + // check if the original class is active + PATCH_IF "%original_class%" STRING_COMPARE_CASE none BEGIN + PATCH_IF $class(1) STRING_EQUAL_CASE "%original_class%" BEGIN + SET original=1 + SET new=2 + END ELSE BEGIN + SET original=2 + SET new=1 + END + SET original_level=$classlevel("%original%") + SET new_level=$classlevel("%new%") + SPRINT new_class $class("%new%") + PATCH_IF (original_level >= new_level && "%new_class%" STRING_COMPARE none) BEGIN // class is inactive; from the point of view of this function, anull it + SPRINT $class("%original%") null + SPRINT original_class none + LPF warning STR_VAR warning="%filename%.cre has an inactive class" END + END + END + END + // sort out memorized spells + PATCH_IF joinable BEGIN + FOR (i=1;i<=classnum;i+=1) BEGIN + SPRINT this_class $class("%i%") + SET this_level=$classlevel("%i%") + PATCH_MATCH "%this_class%" WITH + BARD BEGIN + SPRINT file mxsplbrd + SET type=1 + END + MAGE BEGIN + SPRINT file mxsplwiz + SET type=1 + END + SORCERER SORCEROR BEGIN + LPF CRE_read_kit RET value END + PATCH_IF "%value%" STRING_EQUAL_CASE "dragon_disciple" BEGIN + SPRINT file mxsplsrc + SET type=1 + END ELSE BEGIN + SPRINT file mxspldd + SET type=1 + END + END + CLERIC BEGIN + SPRINT file mxsplprs + SET type=0 + END + DRUID BEGIN + SPRINT file mxspldru + SET type=0 + END + PALADIN BEGIN + SPRINT file mxsplpal + SET type=0 + END + RANGER BEGIN + PATCH_IF "%clasfull%" STRING_COMPARE_CASE "cleric_ranger" BEGIN + SPRINT file mxsplran + SET type=0 + SET ind=0 + END ELSE BEGIN + SPRINT file null + END + END + DEFAULT + SPRINT file null + END + PATCH_IF "%file%" STRING_COMPARE_CASE null BEGIN + INNER_ACTION BEGIN + COPY_EXISTING "%file%.2da" "%workspace%" + COUNT_2DA_COLS colcount + COUNT_2DA_ROWS colcount rowcount + SET row=this_level>rowcount? rowcount - 1 : this_level - 1 + CLEAR_ARRAY spells_per_level + FOR (j=0;j+1offset BEGIN + READ_SHORT offset+0x6 this_type + PATCH_IF type=this_type BEGIN + READ_SHORT offset lvl + PATCH_IF VARIABLE_IS_SET $spells_per_level("%lvl%") BEGIN + SET temp=$spells_per_level("%lvl%") + WRITE_SHORT (0x2 + offset) temp + END + END + END + END + END + END + // if there is an original class, or if there is only one class, check for a kit + PATCH_IF "%original_class%" STRING_COMPARE_CASE none || classnum=1 BEGIN + LPF CRE_read_kit RET kit=value END + PATCH_MATCH "%kit%" WITH 0 NONE NO_KIT TRUECLASS BEGIN + END + DEFAULT + // find the kit's parent class + PATCH_IF "%original_class%" STRING_COMPARE_CASE none BEGIN + FOR (i=1;i<=3;i+=1) BEGIN + PATCH_IF $class("%i%") STRING_EQUAL_CASE "%original_class%" BEGIN + SPRINT $class("%i%") "%kit%" + SPRINT original_class "%kit%" + END + END + END ELSE BEGIN // not dual classed, so only class=kit + PATCH_IF "%class_1%" STRING_COMPARE null BEGIN + SPRINT $class(1) "%kit%" + END + END + END + END + + // some hardcoded kit-based item restrictions + PATCH_MATCH "%kit%" WITH + kensai BEGIN + PATCH_FOR_EACH arguments IN gloves armor BEGIN + LPF CRE_read_item_in_slot STR_VAR arguments RET item=value END + PATCH_IF ~%item%~ STRING_COMPARE_CASE ~~ BEGIN + LPF CRE_remove_items STR_VAR arguments= ~%item%~ END + LPF log_this STR_VAR file=illegal_kensai_gear.txt input= ~%filename% %item%~ END + END + END + END + BARBARIAN BEGIN + LPF CRE_read_item_in_slot STR_VAR arguments=armor RET armor=value END + INNER_PATCH ~%armor%~ BEGIN + READ_ASCII 0x0 platecheck ELSE ~~(4) + END + LPF log_this STR_VAR file=illegal_barbarian_gear.txt input= ~%filename% %armor%~ END + END + STALKER BEGIN + + LPF CRE_read_item_in_slot STR_VAR arguments=armor RET armor=value END + INNER_PATCH ~%armor%~ BEGIN + READ_ASCII 0x0 check ELSE ~~ (4) + END + PATCH_IF (~%check%~ STRING_EQUAL_CASE CHAN || ~%check%~ STRING_EQUAL_CASE PLAT) BEGIN + LPF log_this STR_VAR file=illegal_stalker_gear.txt input= ~%filename% %armor%~ END + END + + END + ARCHER BEGIN + LPF CRE_read_item_in_slot STR_VAR arguments=armor RET armor=value END + INNER_PATCH ~%armor%~ BEGIN + READ_ASCII 0x0 check ELSE ~~ (4) + END + PATCH_IF (~%check%~ STRING_EQUAL_CASE CHAN || ~%check%~ STRING_EQUAL_CASE PLAT) BEGIN + LPF log_this STR_VAR file=illegal_archer_gear.txt input= ~%filename% %armor%~ END + END + END + DEFAULT + END + + SPRINT deletestring "" + SPRINT addstring "" + SPRINT spells "" + SPRINT spells_known "" + + + // enforce the kit + + PATCH_IF (!read_clab_at_install && !joinable) BEGIN + LPF kit_hardcode INT_VAR level=classlevel_1 STR_VAR kit END + END ELSE BEGIN + LPM kit_softcode + END // end of softcoding + + END // end of sanity check +END + + +///////////////////////////////////////// +///// Not encapsulated at all, just extracted from enforce_class for readability +///////////////////////////////////////// + +DEFINE_PATCH_MACRO kit_softcode BEGIN + FOR (i=1;i<=classnum;i+=1) BEGIN + PATCH_IF $class("%i%") STRING_COMPARE "null" BEGIN + SPRINT kit $class("%i%") + SET level=$classlevel("%i%") + INNER_ACTION BEGIN + // find the CLAB file + LAF find_clab STR_VAR kit RET clab END + ACTION_IF FILE_EXISTS_IN_GAME "%clab%.2da" BEGIN + COPY_EXISTING "%clab%.2da" "%workspace%" + COUNT_2DA_COLS colcount + COUNT_2DA_ROWS colcount rowcount + FOR (this_level=1;this_leveloffset_secondary BEGIN + READ_BYTE offset_secondary+0xc timing + PATCH_IF timing=9 BEGIN // we only care about instant/permanent effects + READ_SHORT offset_secondary opcode + READ_LONG offset_secondary+0x4 parameter1 + READ_LONG offset_secondary+0x8 parameter2 + READ_ASCII offset_secondary+0x14 resource + PATCH_IF "%resource%" STRING_COMPARE "" BEGIN + SPRINT resource_drop "%resource_drop% %resource%" + SPRINT tempadd "%tempadd% add_effect_inline=>~parameter1=>%parameter1% parameter2=>%parameter2% resource=>%resource% opcode=>%opcode% timing=>9 target=>2~" + END ELSE BEGIN + PATCH_MATCH "%opcode%" WITH + 101 142 169 267 BEGIN + SPRINT temp EVALUATE_BUFFER "%%opcode%_sec%" + SPRINT "%opcode%_sec" "%temp% %parameter2%" + SPRINT tempadd "%tempadd% add_effect_inline=>~parameter1=>%parameter1% parameter2=>%parameter2% resource=>null opcode=>%opcode% timing=>9 target=>2~" + END + DEFAULT + SPRINT tempadd "%tempadd% add_effect_inline=>~parameter1=>%parameter1% parameter2=>%parameter2% resource=>null opcode=>%opcode% timing=>9 target=>2~" + SPRINT opcode_drop "%opcode_drop% %opcode%" + END + END + END + END + BUT_ONLY + END // end of ACTION_IF + END // end of INNER_ACTION + PATCH_IF "%opcode_drop%" STRING_COMPARE_CASE "" BEGIN + SPRINT tempremove "delete_effect=>~opcode is_in [%opcode_drop%]~" + END + PATCH_FOR_EACH opcode IN 101 142 169 267 BEGIN + SPRINT list EVALUATE_BUFFER "%%opcode%_sec%" + PATCH_IF "%list%" STRING_COMPARE_CASE "" BEGIN + SPRINT tempremove "%tempremove% delete_effect=>~opcode=%opcode% and parameter2 is_in [%list%]~" + END + END + PATCH_IF "%resource_drop%" STRING_COMPARE_CASE "" BEGIN + SPRINT tempremove "%tempremove% delete_effect=>~resource is_in [%resource_drop%]~" + END + SPRINT "RESREF_%spell%_KIT_EFFECTS_ADD" "%tempadd%" + SPRINT "RESREF_%spell%_KIT_EFFECTS_REMOVE" "%tempremove%" + END // end of PATCH_IF + SPRINT tempremove EVALUATE_BUFFER "%RESREF_%spell%_KIT_EFFECTS_REMOVE%" + SPRINT tempadd EVALUATE_BUFFER "%RESREF_%spell%_KIT_EFFECTS_ADD%" + SPRINT addstring "%addstring% %tempadd%" + PATCH_IF !VARIABLE_IS_SET $AP_already("%spell%") BEGIN + PATCH_IF "%tempremove%" STRING_COMPARE "" BEGIN + SPRINT deletestring "%deletestring% %tempremove%" + END + SPRINT $AP_already("%spell%") "" + END + END + END + DEFAULT + END + END + END + BUT_ONLY + END + END + END + END + PATCH_IF "%deletestring%" STRING_COMPARE_CASE "" BEGIN + LPF apply_patches_inline STR_VAR file_ext=CRE arguments="%deletestring%" END + END + LPF apply_patches_inline STR_VAR file_ext=CRE arguments="%addstring%" END + SPRINT spells_to_remove "" + SPRINT spells_to_add "" + SPRINT spells_known "" + PHP_EACH spells_in_clab AS key=>value BEGIN + REMOVE_MEMORIZED_SPELL "%key%" + SPRINT spells_to_add "%spells_to_add% ~%key%(%value%)~" + PATCH_IF joinable BEGIN + PATCH_IF !VARIABLE_IS_SET $is_innate_spell("%spell%") BEGIN + INNER_ACTION BEGIN + ACTION_IF FILE_EXISTS_IN_GAME "%spell%.spl" BEGIN + COPY_EXISTING "%spell%.spl" override + READ_SHORT 0x1c type + PATCH_IF type=4 BEGIN + SET $is_innate_spell("%spell%")=1 + END ELSE BEGIN + SET $is_innate_spell("%spell%")=0 + END + BUT_ONLY + END ELSE BEGIN + LAF warning STR_VAR warning="Tried to add kit spell %spell% for kit %kit%, but it doesn't exist" END + OUTER_SET $is_innate_spell("%spell%")=999 + END + END + END + SET temp=$is_innate_spell("%spell%") + PATCH_IF temp=0 BEGIN + SPRINT spells_known "%spells_known% ~%key%~" + END + END + END + LPF CRE_add_spells STR_VAR arguments="%spells_to_add%" END + PATCH_IF joinable BEGIN + LPF CRE_add_known_spells STR_VAR arguments="%spells_known%" END + END + PATCH_IF joinable BEGIN + LPF CRE_add_all_priest_spells END + END + +END + + +///////////////////////////////////////// +///// Enforce legal ability scores on dual-classing creatures +///////////////////////////////////////// + +DEFINE_ACTION_FUNCTION make_dualclass_legal + STR_VAR original_class="" + final_class="" + creature="" +BEGIN + ACTION_DEFINE_ASSOCIATIVE_ARRAY dual_legal BEGIN + original=>15 + final=>17 + END + COPY_EXISTING "%creature%.cre" override + PHP_EACH dual_legal AS type=>min BEGIN + + SPRINT class EVAL "%%type%_class%" + PATCH_MATCH "%class%" WITH + FIGHTER BEGIN + LPF CRE_strGT STR_VAR arguments="%min%" END + END + THIEF BEGIN + LPF CRE_dexGT STR_VAR arguments="%min%" END + END + RANGER BEGIN + LPF CRE_strGT STR_VAR arguments="%min%" END + LPF CRE_dexGT STR_VAR arguments="%min%" END + LPF CRE_conGT STR_VAR arguments="%min%" END + END + CLERIC BEGIN + LPF CRE_wisGT STR_VAR arguments="%min%" END + END + MAGE BEGIN + LPF CRE_intGT STR_VAR arguments="%min%" END + END + DRUID BEGIN + LPF CRE_wisGT STR_VAR arguments="%min%" END + LPF CRE_chaGT STR_VAR arguments="%min%" END + + END + DEFAULT END + + END + + +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// check that memorised spells are actually used +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +DEFINE_PATCH_FUNCTION spell_use_script_check + INT_VAR type=0 + STR_VAR script="" + log="spells_unused.txt" + filename="" +BEGIN + INNER_ACTION BEGIN + COPY_EXISTING "%script%.bcs" "override" + END + PATCH_IF "%filename%" STRING_EQUAL "" BEGIN + SPRINT filename "%SOURCE_RES%" + END + GET_OFFSET_ARRAY spell_array CRE_V10_KNOWN_SPELLS + PHP_EACH spell_array AS ind=>spell_off BEGIN + READ_ASCII spell_off spell_resref + PATCH_MATCH "%spell_resref%" WITH + "SPPR.*" BEGIN + SET idscode=1 + END + "SPWI.*" BEGIN + SET idscode=2 + END + "SPIN.*" BEGIN + SET idscode=3 + END + "SPCL.*" BEGIN + SET idscode=4 + END + DEFAULT + SET idscode=0 + END + PATCH_IF type=0 || idscode=0 BEGIN + SET found=0 + END ELSE BEGIN + SET found=!(type=idscode) + END + PATCH_IF idscode>0 BEGIN + INNER_PATCH_SAVE res_num "%spell_resref%" BEGIN + DELETE_BYTES 0x0 4 + INSERT_BYTES 0x0 1 + WRITE_ASCII 0x0 "%idscode%" (1) + END + PATCH_IF FILE_CONTAINS "override/%script%.bcs" "%res_num%" BEGIN + SET found=1 + END + END ELSE BEGIN + END + PATCH_IF !found BEGIN + PATCH_IF FILE_CONTAINS "override/%script%.bcs" "%spell_resref%" BEGIN + SET found=1 + END + END + PATCH_IF !found BEGIN + PATCH_IF idscode>0 BEGIN + LPF NAME_NUM_OF_SPELL_RES STR_VAR spell_res="%spell_resref%" RET spell_name END + SPRINT input "%filename% %spell_name% (%spell_resref%)" + END ELSE BEGIN + SPRINT input "%filename% %spell_resref%" + END + LPF log_this STR_VAR file="%log%" input END + END + + END +END + +DEFINE_ACTION_FUNCTION spell_use_script_check_batch + INT_VAR type=0 + STR_VAR prefix="" +BEGIN + COPY_EXISTING_REGEXP ".*\.cre" override + SET match=0 + FOR (offset=0x248;offset<0x270;offset+=8) BEGIN + READ_ASCII offset script_here + PATCH_MATCH "%script_here%" WITH + "%prefix%.*" BEGIN + SPRINT script "%script_here%" + SET match=1 + END + DEFAULT + END + END + PATCH_IF match BEGIN + LPF spell_use_script_check INT_VAR type STR_VAR script filename="%SOURCE_RES%" END + END + BUT_ONLY +END + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/// Deal with the issue where a file multiply references the same item +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +DEFINE_PATCH_FUNCTION CRE_deduplicate_items +BEGIN + abort=0 + READ_LONG 0x2b8 item_slot_off + CLEAR_ARRAY item_array + CLEAR_ARRAY slot_item_map + CLEAR_ARRAY all_items + CLEAR_ARRAY item_repeated + FOR (offset=item_slot_off + 0x24; offset=0 BEGIN + PATCH_IF VARIABLE_IS_SET $item_array("%item%") BEGIN + SET $item_array("%item%") +=1 + END ELSE BEGIN + SET $item_array("%item%") =1 + END + END + END + GET_OFFSET_ARRAY item_resref_array CRE_V10_ITEMS + PHP_EACH item_resref_array AS ind=>offset BEGIN + READ_ASCII offset resref + TO_LOWER resref + SPRINT $slot_item_map("%ind%") "%resref%" + PATCH_IF VARIABLE_IS_SET $all_items("%resref%") BEGIN + SET $item_repeated("%resref%")=1 + END ELSE BEGIN + SET $all_items("%resref%")=1 + END + END + PHP_EACH item_array AS slot=>num BEGIN + PATCH_IF num>1 BEGIN + SPRINT resref $slot_item_map("%slot%") + PATCH_IF !VARIABLE_IS_SET $item_repeated("%resref%") BEGIN + REMOVE_CRE_ITEM "%resref%" + FOR (i=0;i 11) + BEGIN + SET xp_value = (level - 10) * 1000 + END + ELSE + BEGIN + SET xp_value = 7 + END + END + + LPF CRE_xp_value STR_VAR arguments="%xp_value%" END +END + + diff --git a/iwdification/sfo/filetype/lib_dlg.tpa b/iwdification/sfo/filetype/lib_dlg.tpa new file mode 100644 index 0000000..c7c8af0 --- /dev/null +++ b/iwdification/sfo/filetype/lib_dlg.tpa @@ -0,0 +1,82 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// overarching edit without decompiling [ALMOST ALWAYS DON'T USE THIS- USE WEIDU INSTEAD!] +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION edit_compiled_dialog + INT_VAR allow_missing=0 + STR_VAR + dialog="" + edits="" + editstring="" + BEGIN + LAUNCH_ACTION_FUNCTION edit_template + INT_VAR allow_missing + STR_VAR file_list= ~%dialog%~ + file_ext=~DLG~ + edits editstring + END +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// offsets (beware: adding or subtracting entries won't work) +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +<<<<<<<< dlg_offsets.2da +TYPE offset_loc offset_length entrynum_loc entrynum_length entry_length +state 0xc 4 0x8 4 0x10 +transition 0x14 4 0x10 4 0x20 +state_trigger 0x18 4 0x1c 4 0x8 +trans_trigger 0x20 4 0x24 4 0x8 +action 0x2c 4 0x2c 4 0x8 +>>>>>>>> + + +OUTER_SPRINT ~offset_readin_lookup_2da~ ~dlg_offsets~ +OUTER_SPRINT ~offset_readin_file_ext~ ~DLG~ +LAUNCH_ACTION_MACRO read_in_offsets + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// (some) lookup functions +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +ACTION_DEFINE_ASSOCIATIVE_ARRAY dlg_trans_fields BEGIN + response_text => ~0x04,LONG~ + journal_text => ~0x08,LONG~ +END + +LAUNCH_ACTION_FUNCTION build_simple_data_field_editors STR_VAR lookup_table=dlg_trans_fields offset_base=yes function_prefix=DLG secondary="yes" END + + +ACTION_DEFINE_ASSOCIATIVE_ARRAY dlg_bit_fields BEGIN + associated_text => ~0x00,0~ + associated_trigger => ~0x00,1~ + associated_action => ~0x00,2~ + terminates_dialog => ~0x00,3~ + journal_entry => ~0x00,4~ + add_unsolved_quest => ~0x00,6~ + add_solved_quest => ~0x01,0~ +END +LAF build_flag_data_field_editors STR_VAR offset_base=yes lookup_table=dlg_bit_fields function_prefix=DLG secondary=yes END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Bulk compile +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION compile_all + STR_VAR location="" + locbase="" + locabs="" +BEGIN + LAF list_files STR_VAR location locbase locabs postfix=d RET list END + LAF reinclude_this STR_VAR input = "COMPILE EVALUATE_BUFFER %list%" END +END + diff --git a/iwdification/sfo/filetype/lib_eff.tpa b/iwdification/sfo/filetype/lib_eff.tpa new file mode 100644 index 0000000..8a8ab32 --- /dev/null +++ b/iwdification/sfo/filetype/lib_eff.tpa @@ -0,0 +1,199 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// overarching clone +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION clone_effect + INT_VAR allow_missing = 0 silent=0 + STR_VAR + effect="" + edits="" + editstring="" + BEGIN + LAUNCH_ACTION_FUNCTION clone_template + INT_VAR allow_missing silent + STR_VAR file_list= ~%effect%~ + file_ext=~EFF~ + edits= ~%edits%~ + editstring= ~%editstring%~ + END +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// overarching edit +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION edit_effect + INT_VAR allow_missing = 0 silent=0 + STR_VAR + effect="" + edits="" + editstring="" + BEGIN + LAUNCH_ACTION_FUNCTION edit_template + INT_VAR allow_missing silent + STR_VAR file_list= ~%effect%~ + file_ext=~EFF~ + edits + editstring + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// overarching make +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION make_effect + STR_VAR + effect="" + edits="" + editstring="" + BEGIN + LAUNCH_ACTION_FUNCTION make_template + STR_VAR file_list= ~%effect%~ + file_ext=~EFF~ + edits= ~%edits%~ + editstring= ~%editstring%~ + build_before= EFF_build + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// overarching install +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION install_effect + STR_VAR + effect="" + edits="" + editstring="" + location="" + locbase="" + locabs="" + BEGIN + LAUNCH_ACTION_FUNCTION install_template + STR_VAR file_list= ~%effect%~ + file_ext=~EFF~ + edits + editstring + location locbase locabs + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// simple data-field edits +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +ACTION_DEFINE_ASSOCIATIVE_ARRAY eff_fields BEGIN + opcode => ~0x10,LONG~ + target => ~0x14,LONG~ + power => ~0x18,LONG~ + parameter1=>~0x1c,LONG~ + parameter2=>~0x20,LONG~ + parameter2a=>~0x20,SHORT~ + parameter2b=>~0x22,SHORT~ + timing=>~0x24,SHORT~ + duration=>~0x28,LONG~ + probability1=>~0x2c,SHORT~ + probability2=>~0x2e,SHORT~ + resource=>~0x30,ASCII~ + dicenum=>~0x38,LONG~ + dicesize=>~0x3c,LONG~ + savebonus=>~0x44,LONG~ + resistance=>~0x5c,LONG~ + resist_dispel=>~0x5c,LONG~ + parameter3=>"0x60,LONG" + parameter4=>"0x64,LONG" + vvc=>~0x70,ASCII~ + resource2=>~0x70,ASCII~ + caster_xloc=>"0x80,LONG" + caster_yloc=>"0x84,LONG" + target_xloc=>"0x88,LONG" + target_yloc=>"0x8c,LONG" + + //many others; I'll stop there +END + +LAUNCH_ACTION_FUNCTION build_simple_data_field_editors STR_VAR lookup_table=eff_fields function_prefix=EFF END + + +ACTION_DEFINE_ASSOCIATIVE_ARRAY eff_bit_fields BEGIN + save_vs_spell=>~0x40,0~ + save_spells=>~0x40,0~ + save_vs_breath=>~0x40,1~ + save_breath=>~0x40,1~ + save_vs_death=>~0x40,2~ + save_death=>~0x40,2~ + save_vs_wand=>~0x40,3~ + save_wands=>~0x40,3~ + save_vs_polymorph=>~0x40,4~ + save_polymorph=>~0x40,4~ + bypass_mirror_image=>~0x43,0~ + fist_only=>~0x48,2~ +END + +LAF build_flag_data_field_editors STR_VAR lookup_table=eff_bit_fields function_prefix=EFF END + + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// build a basic effect +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION EFF_build +BEGIN + ///// basic structure + DELETE_BYTES 0x0 BUFFER_LENGTH + INSERT_BYTES 0x0 0x110 + + // sig + WRITE_ASCII 0x0 ~EFF V2.0~ + WRITE_ASCII 0x8 ~EFF V2.0~ + // start off with probability 100 + WRITE_BYTE 0x2c 100 + // unknown fields, copied blindly from example file + WRITE_LONG 0x80 0xffffffff + WRITE_LONG 0x84 0xffffffff + WRITE_LONG 0x88 0xffffffff + WRITE_LONG 0x8c 0xffffffff + WRITE_LONG 0xa4 0xffffffff +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// make an effect that casts a spell +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION make_casting_effect + INT_VAR target=2 + STR_VAR effect="" + spell="" +BEGIN + ACTION_CLEAR_ARRAY patch_data + ACTION_DEFINE_ASSOCIATIVE_ARRAY patch_data BEGIN + opcode=>146 + target=>~%target%~ + parameter2=>1 + timing=>1 + parameter1=>1 + resource=>~%spell%~ + END + LAF make_effect STR_VAR effect edits=patch_data END + + + +END diff --git a/iwdification/sfo/filetype/lib_genai.tpa b/iwdification/sfo/filetype/lib_genai.tpa new file mode 100644 index 0000000..983d87d --- /dev/null +++ b/iwdification/sfo/filetype/lib_genai.tpa @@ -0,0 +1,451 @@ +/////////////////////////////////////////////////////////////////////////////////////////// +/// Read in item data (the thought is that doing this once and for all may save time) +/////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_MACRO read_in_genai_item_data BEGIN + ACTION_IF !(VARIABLE_IS_SET genai_items_read) BEGIN + OUTER_SET genai_items_read=1 + PRINT ~Reading in initial data about weapons~ + SILENT + ACTION_TRY + COPY_EXISTING_REGEXP GLOB ~%tutu_var%.*\.itm~ ~override~ + SPRINT filename ~%SOURCE_RES%~ + LPF identify_weapon_patch RET twohanded type proftype enchantment damagetype END + TO_UPPER filename + SET $genai_twohanded(~%filename%~)=twohanded + SET $genai_type(~%filename%~)=type + SET $genai_proftype(~%filename%~)=proftype + SET $genai_enchantment(~%filename%~)=enchantment + SPRINT $genai_damagetype(~%filename%~) ~%damagetype%~ + BUT_ONLY + WITH DEFAULT + LAF warning STR_VAR warning="Item file %filename% appears malformed" END + END + END +END + +////////////////////////////////////////////////////////////////////////////////////////// +// Full proficiency enforcement +//////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION CRE_enforce_proficiencies +BEGIN + LPF CRE_read_kit RET kit=value END + LPF CRE_read_class RET class=value END + LPF identify_weapon_preferences STR_VAR filename RET has_ranged skip_me onhandprof offhandprof rangedprof style END + PATCH_IF !skip_me BEGIN + LPF allocate_proficiencies INT_VAR onhandprof offhandprof rangedprof style level STR_VAR class kit END + END +END + + +////////////////////////////////////////////////////////////////////////////////////////// +/// Proficiency allocation +/// +/// Here are the priorities: +/// (1) put one star into onhand, offhand, and ranged (if appropriate, in each case) +/// (2) if fighting two-handed, max out two-weapon +/// (3) if using a ranged weapon, max it out +/// (4) if using an on-hand weapon, max it out +/// (5) if using an off-hand weapon, max it out +/// (6) max out any fighting style other than two-handed +/// +/////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION allocate_proficiencies + INT_VAR onhandprof=0 + offhandprof=0 + rangedprof=0 + style=0 + level=0 + STR_VAR class="" + kit="" +BEGIN + SET rangedprofnum=0 + SET offhandprofnum=0 + SET onhandprofnum=0 + SET stylenum=0 + SET onhandprof = onhandprof=rangedprof? 0 :onhandprof // allow for duplications (e.g. two swords, or battleaxe/throwing axe) + SET offhandprof = offhandprof=rangedprof? 0 : offhandprof + SET offhandprof = offhandprof=onhandprof? 0 : offhandprof + LPF get_num_profs INT_VAR level STR_VAR class RET num_profs=num_profs END + PATCH_FOR_EACH profname IN onhandprof offhandprof rangedprof style BEGIN + SET proficiency= ~%profname%~ + LPF get_max_profs INT_VAR proficiency level STR_VAR class kit RET ~max_%profname%~=max END + END + WHILE num_profs>0 BEGIN + // decrease proficiency counter + SET num_profs=num_profs - 1 + PATCH_IF (rangedprof>0 & rangedprofnum=0) BEGIN // get basically proficient in one's weapons + SET rangedprofnum=1 + END ELSE + PATCH_IF (onhandprof>0 & onhandprofnum=0 & max_onhandprof>0) BEGIN + SET onhandprofnum=1 + END ELSE + PATCH_IF (offhandprof>0 & offhandprofnum=0 & max_offhandprof>0) BEGIN + SET offhandprofnum=1 + END ELSE + PATCH_IF (style=STAT_VALUE_PROFICIENCY2WEAPON & stylenum0 & rangedprofnum0 & onhandprofnum0 & offhandprofnum0 & stylenum0 BEGIN + SET_BG2_PROFICIENCY "%profname%" value + END + + /* SET profcode= ~%profname%~ + PATCH_IF profcode>0 BEGIN + SET value= ~%profname%num~ + PATCH_IF value>0 BEGIN + LPF add_entry_inline STR_VAR arguments=~opcode=>233 parameter1=>%value% parameter2=>%profcode% target=>0~ type=effect file_ext=CRE END + END + END + + */ + END +END + +/////////////////////////////////////////////////////////////////////////////////////////// +/// Work out the number of proficiencies a given character has (NB: this gets dual-classed characters wrong, but it's hard to automate them as they can't allocate their points +/// fully freely) +/////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION get_num_profs + INT_VAR level=0 + STR_VAR class="" + RET num_profs +BEGIN + INNER_ACTION BEGIN + LAUNCH_ACTION_MACRO read_in_proficiency_progression + END + TO_UPPER class + PATCH_IF VARIABLE_IS_SET $PROFICIENCY_FIRST_LEVEL( ~%class%~) BEGIN + SET base=$PROFICIENCY_FIRST_LEVEL( ~%class%~) + SET rate=$PROFICIENCY_RATE( ~%class%~) + END ELSE BEGIN + SET base=3 + SET rate=4 + END + SET num_profs=base+level/rate +END + + + +/////////////////////////////////////////////////////////////////////////////////////////// +/// Work out the maximum number of proficiencies in a given proficiency slot +/////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION get_max_profs + INT_VAR proficiency=0 + level=0 + STR_VAR class="" + kit="" + RET max +BEGIN + PATCH_IF proficiency=0 BEGIN + SET max=0 + END ELSE BEGIN + INNER_ACTION BEGIN + LAUNCH_ACTION_MACRO read_in_proficiencies + LAUNCH_ACTION_MACRO read_in_proficiency_progression + END + TO_UPPER kit + TO_UPPER class + PATCH_IF VARIABLE_IS_SET $PROFICIENCY(~%proficiency%~ ~%kit%~) BEGIN + SET max=$PROFICIENCY(~%proficiency%~ ~%kit%~) + END ELSE BEGIN + PATCH_IF VARIABLE_IS_SET $PROFICIENCY(~%proficiency%~ ~%class%~) BEGIN + SET max=$PROFICIENCY(~%proficiency%~ ~%class%~) + END ELSE BEGIN + SET max=5 + END + END + PATCH_IF VARIABLE_IS_SET $PROFICIENCY_FIRST_LEVEL_MAX("%class%") BEGIN + SET lev1max=$PROFICIENCY_FIRST_LEVEL_MAX("%class%") + END ELSE BEGIN + SET lev1max=1 // monsters - so monsters, having lev1max=1 and rate=4, get 2 profs at L5, 3 at L9, 4 at L13, 5 at L17 - which sounds ok + END + PATCH_IF VARIABLE_IS_SET $PROFICIENCY_OTHER_LEVEL_MAX("%class%") BEGIN + SET levothermax=$PROFICIENCY_OTHER_LEVEL_MAX("%class%") + END ELSE BEGIN + SET levothermax=5 + END + PATCH_IF VARIABLE_IS_SET $PROFICIENCY_RATE(~%class%~) BEGIN + SET rate=$PROFICIENCY_RATE(~%class%~) + END ELSE BEGIN + SET rate=4 + END + SET levmax = lev1max + (level / rate) + SET levmax = levmax>levothermax? levothermax : levmax + SET max = max>levmax? levmax: max + + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//// For this item, record its proficiency, whether it's ranged, whether it's two-handed +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +DEFINE_PATCH_FUNCTION identify_weapon // note that if called on a shield, it returns type 0 + STR_VAR weaponfile="" + RET twohanded + type + proftype + enchantment + damagetype +BEGIN + TO_UPPER weaponfile + PATCH_IF !VARIABLE_IS_SET $genai_twohanded(~%weaponfile%~) BEGIN + SET type=0 + SET proftype=0 + SET twohanded=0 + INNER_ACTION BEGIN + ACTION_MATCH "%weaponfile%" WITH + // IWDEE random weapons + rndtre11 BEGIN + OUTER_SET twohanded=1 + OUTER_SET proftype="-1" + OUTER_SET enchantment=0 + OUTER_SPRINT damagetype slashing + OUTER_SET type=1 + END + rndtre03 rndtre04 rndtre05 rndtre40 rndtre49 rndtre50 rndtre80 BEGIN // random melee weapons + OUTER_SET twohanded=0 + OUTER_SET proftype="-1" + OUTER_SET enchantment=0 + OUTER_SPRINT damagetype none + OUTER_SET type=1 + END + rndtre41 rndtre42 BEGIN // random bow + OUTER_SET twohanded=0 + OUTER_SET proftype="-1" + OUTER_SET enchantment=0 + OUTER_SPRINT damagetype none + OUTER_SET type=2 + END + rndtre58 BEGIN // IWDEE random magic longbow + OUTER_INNER_PATCH "" BEGIN + LPF identify_weapon STR_VAR weaponfile=ulbow4a RET twohanded type proftype enchantment damagetype END + END + END + rndtre77 BEGIN // IWDEE random staff + OUTER_INNER_PATCH "" BEGIN + LPF identify_weapon STR_VAR weaponfile=staf01 RET twohanded type proftype enchantment damagetype END + END + END + rndtre87 BEGIN // IWDEE random crossbow + OUTER_INNER_PATCH "" BEGIN + LPF identify_weapon STR_VAR weaponfile=xbow01 RET twohanded type proftype enchantment damagetype END + END + END + rndtre88 BEGIN // IWDEE random crossbow + OUTER_INNER_PATCH "" BEGIN + LPF identify_weapon STR_VAR weaponfile=xbow04 RET twohanded type proftype enchantment damagetype END + END + END + DEFAULT + + + ACTION_IF FILE_EXISTS_IN_GAME ~%weaponfile%.itm~ BEGIN + COPY_EXISTING ~%weaponfile%.itm~ ~override~ + LPF identify_weapon_patch RET twohanded type proftype enchantment damagetype END + BUT_ONLY + END ELSE BEGIN + LAF warning STR_VAR arguments= ~Tried to identify nonexistent weapon %weaponfile%.itm~ END + END + END + END + END ELSE BEGIN + SET type=$genai_type(~%weaponfile%~) + SET proftype=$genai_proftype(~%weaponfile%~) + SET twohanded=$genai_twohanded(~%weaponfile%~) + SPRINT damagetype $genai_damagetype(~%weaponfile%~) + SET enchantment=$genai_enchantment(~%weaponfile%~) + END +END + +DEFINE_PATCH_FUNCTION identify_weapon_patch + RET twohanded + type + proftype + enchantment + damagetype +BEGIN + SPRINT damagetype none + SET twohanded=0 + SET type=0 + SET proftype=0 + SET enchantment=0 + LPF ITM_read_twohanded RET twohanded=value END + LPF ITM_read_proficiency_code RET proftype=value END + SPRINT entry_type ability + SPRINT file_ext ITM + LAUNCH_PATCH_MACRO get_offset_array + PHP_EACH offset_array AS int=>offset_base BEGIN + LPF ITM_read_ability_type RET ab_type=value END + PATCH_IF ab_type=1 && type=0 BEGIN + LPF ITM_read_enchantment RET enchantment=value END + SET type=1 + LPF ITM_read_damage_type RET damage_code=value END + PATCH_MATCH damage_code WITH + 1 BEGIN + SPRINT damagetype piercing + END + 2 BEGIN + SPRINT damagetype crushing + END + DEFAULT + SPRINT damagetype slashing + END + END + PATCH_IF (ab_type=2 || ab_type=4) && type=0 BEGIN + SET type=2 + END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//// Go through carried weapons and record the proficiency type of the onhand, offhand and ranged weapon, or +//// zero if none is carried; set skip_me to 1 if a non-proficiency weapon is carried; set style to the preferred +//// weapon style; wipe the offhand slot if it's illegal; get the highest enchantment level and the melee damage type(s) +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +DEFINE_PATCH_FUNCTION identify_weapon_preferences // goes through all carried weapons. Determines if a melee or a ranged weapon is carried, the proficiencies of carried weapons, + STR_VAR filename="" + RET onhandprof + offhandprof + rangedprof + style + skip_me + has_ranged + damagetype + enchantment + no_weapon +BEGIN + SPRINT damagetype unknown + SET enchantment=0 + PATCH_FOR_EACH var IN has_twohanded onhandprof offhandprof rangedprof has_ranged has_melee BEGIN + SET ~%var%~ = 0 + END + SET style=STAT_VALUE_PROFICIENCYSINGLEWEAPON + SET no_weapon=1 + SET skip_me=0 + SPRINT ~to_delete~ ~~ + // get the item assigned to each slot + PATCH_FOR_EACH arguments IN weapon1 weapon2 weapon3 weapon4 BEGIN + LPF CRE_read_item_in_slot STR_VAR arguments RET weaponfile=value END + PATCH_IF ~%weaponfile%~ STRING_COMPARE_CASE ~~ BEGIN + PATCH_IF no_weapon BEGIN + SET no_weapon=0 + SET skip_me=1 + END + LPF identify_weapon STR_VAR weaponfile RET this_twohanded=twohanded type=type proftype=proftype damagetype_here=damagetype ench_here=enchantment END + PATCH_IF !(proftype=0) BEGIN + SET skip_me=0 + END + PATCH_IF type=1 BEGIN + SET onhandprof=proftype + SET has_twohanded= this_twohanded=1? 1 : has_twohanded + PATCH_IF this_twohanded=1 BEGIN + SET style=STAT_VALUE_PROFICIENCY2HANDED + END + SET has_melee=1 + END + PATCH_IF type=2 BEGIN + SET rangedprof=proftype + SET has_ranged=1 + SET has_twohanded= this_twohanded=1? 1 : has_twohanded + END + SET enchantment = enchantment>ench_here? enchantment : ench_here + PATCH_IF ~%damagetype_here%~ STRING_COMPARE none BEGIN + PATCH_IF ~%damagetype%~ STRING_EQUAL unknown BEGIN + SPRINT damagetype ~%damagetype_here%~ + END ELSE + PATCH_IF ~%damagetype%~ STRING_COMPARE ~%damagetype_here%~ BEGIN + SPRINT damagetype mixed + END + END + END + END + LPF CRE_read_item_in_slot STR_VAR arguments=shield RET weaponfile=value END + PATCH_IF ~%weaponfile%~ STRING_COMPARE_CASE ~~ BEGIN + LPF identify_weapon STR_VAR weaponfile RET type=type proftype=proftype ench_here=enchantment damagetype_here=damagetype END + PATCH_IF type=0 BEGIN + SET style=STAT_VALUE_PROFICIENCYSWORDANDSHIELD + END ELSE BEGIN + SET style=STAT_VALUE_PROFICIENCY2WEAPON + SET offhandprof=proftype + END + PATCH_IF has_twohanded=1 BEGIN + SPRINT ~to_delete~ ~%weaponfile%~ + END + SET enchantment = enchantment>ench_here? enchantment : ench_here + PATCH_IF ~%damagetype_here%~ STRING_COMPARE none BEGIN + PATCH_IF ~%damagetype%~ STRING_EQUAL unknown BEGIN + SPRINT damagetype ~%damagetype_here%~ + END ELSE + PATCH_IF ~%damagetype%~ STRING_COMPARE ~%damagetype_here%~ BEGIN + SPRINT damagetype mixed + END + END + END + PATCH_FOR_EACH arguments IN quiver1 quiver2 quiver3 quiver4 BEGIN + LPF CRE_read_item_in_slot STR_VAR arguments RET weaponfile=value END + PATCH_IF ~%weaponfile%~ STRING_COMPARE_CASE ~~ BEGIN + LPF identify_ammo STR_VAR weaponfile RET ench_here=enchantment END + SET enchantment = enchantment>ench_here? enchantment : ench_here + END + END + PATCH_IF (~%to_delete%~ STRING_COMPARE_CASE ~~) BEGIN + LPF CRE_remove_items STR_VAR arguments= ~%to_delete%~ END + PATCH_WITH_SCOPE BEGIN + SPRINT file_ext CRE + LPF log_resource_name STR_VAR arguments=illegal_offhand END + END + END + PATCH_IF (has_ranged && !has_melee) BEGIN + LPF warning STR_VAR warning="%filename% has ranged but not melee weapon" END + END + +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//// Get the enchantment level for ammo +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION identify_ammo + STR_VAR weaponfile="" + RET enchantment +BEGIN + INNER_ACTION BEGIN + ACTION_IF FILE_EXISTS_IN_GAME ~%weaponfile%.itm~ BEGIN + COPY_EXISTING ~%weaponfile%.itm~ ~override~ + LPF ITM_read_enchantment RET enchantment=value END + BUT_ONLY + END ELSE BEGIN + LAF warning STR_VAR warning=~Tried to identify nonexistent ammo %weaponfile%.itm~ END + END + END +END + + diff --git a/iwdification/sfo/filetype/lib_itm.tpa b/iwdification/sfo/filetype/lib_itm.tpa new file mode 100644 index 0000000..35aab62 --- /dev/null +++ b/iwdification/sfo/filetype/lib_itm.tpa @@ -0,0 +1,1049 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// overarching clone +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION clone_item + INT_VAR silent=0 + allow_missing=0 + tv=0 + STR_VAR + item="" + edits="" + editstring="" + BEGIN + LAUNCH_ACTION_FUNCTION clone_template + INT_VAR silent tv allow_missing + STR_VAR file_list= ~%item%~ + file_ext=~ITM~ + edits + editstring + + END +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// overarching edit +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION edit_item + INT_VAR + silent=0 + allow_missing=0 + tv=0 + STR_VAR + item="" + edits="" + editstring="" + location="" + locbase="" + locabs="" + BEGIN + LAUNCH_ACTION_FUNCTION edit_template + INT_VAR tv silent allow_missing + STR_VAR file_list= ~%item%~ + file_ext=~ITM~ + edits editstring location locbase locabs + + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// overarching install +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION install_item + INT_VAR + silent=0 + allow_missing=0 + tv=0 + STR_VAR + item="" + edits="" + editstring="" + location="" + locbase="" + BEGIN + LAUNCH_ACTION_FUNCTION install_template + INT_VAR tv silent allow_missing + STR_VAR file_list= ~%item%~ + file_ext=~ITM~ + edits editstring location locbase + + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// overarching regexp +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION edit_all_items + STR_VAR + edits="" + editstring="" + BEGIN + LAUNCH_ACTION_FUNCTION regexp_template + INT_VAR tv=1 + STR_VAR file_ext=~ITM~ + edits + editstring + END +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// overarching make +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION make_item + STR_VAR + item="" + edits="" + editstring="" + BEGIN + LAUNCH_ACTION_FUNCTION make_template + STR_VAR file_list= ~%item%~ + file_ext=~ITM~ + edits= ~%edits%~ + editstring= ~%editstring%~ + build_before= ITM_build + build_after = ITM_postbuild + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// offsets +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +<<<<<<<< item_offsets.2da +TYPE offset_loc offset_length entrynum_loc entrynum_length entry_length +ability 0x64 4 0x68 2 0x38 +effect 0x6a 4 -1 0 0x30 +>>>>>>>> +OUTER_SPRINT ~offset_readin_lookup_2da~ ~item_offsets~ +OUTER_SPRINT ~offset_readin_file_ext~ ~ITM~ +LAUNCH_ACTION_MACRO read_in_offsets + +OUTER_SPRINT has_secondaries_ITM_ability "" + + +OUTER_SPRINT $ITM_virtual_type_parent(effect) ability +OUTER_SPRINT $ITM_virtual_type_child(effect) effect +OUTER_SET $ITM_virtual_type_index("effect")=0 +OUTER_SET $lookup_ITM_ability_effect_ind_loc(0)=0x20 +OUTER_SET $lookup_ITM_ability_effect_ind_length(0)=2 +OUTER_SET $lookup_ITM_ability_effect_num_loc(0)=0x1e +OUTER_SET $lookup_ITM_ability_effect_num_length(0)=2 + +OUTER_SPRINT $ITM_effect_secondaries_follow(ability) effect_global + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// simple data-field edits +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +ACTION_DEFINE_ASSOCIATIVE_ARRAY item_fields BEGIN + name1_string => ~0x8,LONG~ + name2_string => ~0xc,LONG~ + enchantment => ~0x60,LONG~ + category => ~0x1c,SHORT~ + inventory =>~0x22,ASCII2~ + price => ~0x34,LONG~ + max_in_stack =>~0x38,SHORT~ + icon => ~0x3a,ASCII~ + icon_ground =>~0x44,ASCII~ + icon_carried=>~0x58,ASCII~ + minimum_strength=>~0x26,SHORT~ + lore=> ~0x42,SHORT~ + weight=>~0x4c,LONG~ + description1_string => ~0x50,LONG~ + description2_string => ~0x54,LONG~ + num_abils=> ~0x68,SHORT~ + proficiency_code => ~0x31,BYTE~ +END + +LAUNCH_ACTION_FUNCTION build_simple_data_field_editors STR_VAR lookup_table=item_fields function_prefix=ITM END + +ACTION_DEFINE_ASSOCIATIVE_ARRAY item_ability_fields BEGIN + ability_type => ~0x0,BYTE~ + ability_icon_loc => ~0x2,BYTE~ + ability_icon => ~0x4,ASCII~ + ability_target=>~0xc,BYTE~ + ability_target_count=>~0xd,BYTE~ + ability_range=>~0xe,SHORT~ + launcher_required=>~0x10,SHORT~ + speed=> ~0x12,SHORT~ + to_hit => ~0x14,SHORT~ + ability_dicesize=>~0x16,BYTE~ + ability_school=>~0x17,BYTE~ + ability_secondary=>~0x19,BYTE~ + ability_numdice=>~0x18,BYTE~ + ability_dicenum=>~0x18,BYTE~ + damage_bonus=>~0x1a,SHORT~ + damage_type=>~0x1c,SHORT~ + effect_num=>~0x1e,SHORT~ + effect_offset=>~0x20,SHORT~ + number_charges => ~0x22,SHORT~ + when_drained => ~0x24,BYTE~ + strength_bonus=>~0x26,BYTE~ + projectile => ~0x2a,SHORT~ + overhand=>~0x2c,SHORT~ + backhand=>~0x2e,SHORT~ + thrust=>~0x30,SHORT~ + is_arrow=>~0x32,SHORT~ + is_bolt=>~0x34,SHORT~ + is_missile=>~0x36,SHORT~ +END + +LAUNCH_ACTION_FUNCTION build_simple_data_field_editors STR_VAR offset_base=yes lookup_table=item_ability_fields function_prefix=ITM END + + +ACTION_DEFINE_ASSOCIATIVE_ARRAY eff_fields BEGIN + opcode=>~0,SHORT~ + target=>~0x2,BYTE~ + power=>~0x3,BYTE~ + parameter1=>~0x4,LONG~ + parameter2=>~0x8,LONG~ + parameter2a=>~0x8,SHORT~ + parameter2b=>~0xa,SHORT~ + timing=>~0xc,BYTE~ + resist_dispel=>~0xd,BYTE~ + dispel=>~0xd,BYTE~ + duration=>~0xe,LONG~ + probability1=>~0x12,BYTE~ + probability2=>~0x13,BYTE~ + resource=>~0x14,ASCII~ + dicenum=> ~0x1c,LONG~ + dicesize=> ~0x20,LONG~ + save_bonus=>~0x28,LONG~ + mode=>~0x2c,LONG~ +END + +LAUNCH_ACTION_FUNCTION build_simple_data_field_editors STR_VAR lookup_table=eff_fields offset_base=yes function_prefix=ITM secondary="yes" END + +ACTION_DEFINE_ASSOCIATIVE_ARRAY itm_bit_fields BEGIN + unsellable => ~0x18,0~ + twohanded => ~0x18,1~ + droppable => ~0x18,2~ + displayable => ~0x18,3~ + cursed => ~0x18,4~ + not_copyable => ~0x18,5~ + magical => ~0x18,6~ + bow => ~0x18,7~ + silver => ~0x19,0~ + cold_iron => ~0x19,1~ + stolen => ~0x19,2~ + conversable => ~0x19,3~ + forbid_offhand => ~0x19,5~ + unusable_chaotic => ~0x1e,0~ + unusable_evil => ~0x1e,1~ + unusable_good => ~0x1e,2~ + unusable_GEneutral => ~0x1e,3~ + unusable_lawful => ~0x1e,4~ + unusable_LCneutral => ~0x1e,5~ + unusable_chaotic_priest => ~0x1e,0~ + unusable_evil_priest => ~0x1e,1~ + unusable_good_priest => ~0x1e,2~ + unusable_GEneutral_priest => ~0x1e,3~ + unusable_lawful_priest => ~0x1e,4~ + unusable_LCneutral_priest => ~0x1e,5~ + unusable_bard => ~0x1e,6~ + unusable_cleric => ~0x1e,7~ + unusable_cleric_mage => ~0x1f,0~ + unusable_cleric_thief => ~0x1f,1~ + unusable_cleric_ranger => ~0x1f,2~ + unusable_fighter => ~0x1f,3~ + unusable_fighter_druid => ~0x1f,4~ + unusable_fighter_mage => ~0x1f,5~ + unusable_fighter_cleric => ~0x1f,6~ + unusable_fighter_mage_cleric => ~0x1f,7~ + unusable_fighter_mage_thief => ~0x20,0~ + unusable_fighter_thief => ~0x20,1~ + unusable_mage => ~0x20,2~ + unusable_mage_thief => ~0x20,3~ + unusable_paladin => ~0x20,4~ + unusable_ranger => ~0x20,5~ + unusable_thief => ~0x20,6~ + unusable_elf => ~0x20,7~ + unusable_dwarf => ~0x21,0~ + unusable_half_elf => ~0x21,1~ + unusable_halfling => ~0x21,2~ + unusable_human => ~0x21,3~ + unusable_gnome => ~0x21,4~ + unusable_monk => ~0x21,5~ + unusable_druid => ~0x21,6~ + unusable_half_orc => ~0x21,7~ + unusable_cleric_of_talos=>~0x29,0~ + unusable_cleric_of_helm=>~0x29,1~ + unusable_cleric_of_lathander=>~0x29,2~ + unusable_totemic_druid=>~0x29,3~ + unusable_shapeshifter=>~0x29,4~ + unusable_avenger=>~0x29,5~ + unusable_barbarian=>~0x29,6~ + unusable_wild_mage=>~0x29,7~ + unusable_stalker=>~0x2b,0~ + unusable_beastmaster=>~0x2b,1~ + unusable_assassin=>~0x2b,2~ + unusable_bounty_hunter=>~0x2b,3~ + unusable_swashbuckler=>~0x2b,4~ + unusable_blade=>~0x2b,5~ + unusable_jester=>~0x2b,6~ + unusable_skald=>~0x2b,7~ + unusable_diviner=>~0x2d,0~ + unusable_enchanter=>~0x2d,1~ + unusable_illusionist=>~0x2d,2~ + unusable_invoker=>~0x2d,3~ + unusable_necromancer=>~0x2d,4~ + unusable_transmuter=>~0x2d,5~ + unusable_no_kit=>~0x2d,6~ + unusable_archer=>~0x2d,7~ + unusable_berserker=>~0x2f,0~ + unusable_wizard_slayer=>~0x2f,1~ + unusable_kensai=>~0x2f,2~ + unusable_cavalier=>~0x2f,3~ + unusable_inquisitor=>~0x2f,4~ + unusable_undead_hunter=>~0x2f,5~ + unusable_abjurer=>~0x2f,6~ + unusable_conjurer=>~0x2f,7~ +END + +LAF build_flag_data_field_editors STR_VAR lookup_table=itm_bit_fields function_prefix=ITM END + +ACTION_DEFINE_ASSOCIATIVE_ARRAY abil_bit_fields BEGIN + add_strength_bonus=>~0x26,0~ + breakable=>~0x26,1~ + damage_only=>~0x26,2~ + to_hit_only=>~0x26,3~ + breaks_sanctuary=>~0x27,1~ + hostile=>~0x27,2~ + recharges_on_rest=>~0x27,3~ +END +LAF build_flag_data_field_editors STR_VAR lookup_table=abil_bit_fields offset_base=yes function_prefix=ITM END + + +ACTION_DEFINE_ASSOCIATIVE_ARRAY eff_bit_fields BEGIN + save_vs_spell => ~0x24,0~ + save_vs_breath => ~0x24,1~ + save_vs_death => ~0x24,2~ + save_vs_poison => ~0x24,2~ + save_vs_wands => ~0x24,3~ + save_vs_petrification => ~0x24,4~ + save_vs_polymorph => ~0x24,4~ + bypass_mirror_image =>~0x27,0~ +END + +LAF build_flag_data_field_editors STR_VAR lookup_table=eff_bit_fields offset_base=yes function_prefix=ITM secondary="yes" END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// data-field edits involving lookup +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +ACTION_DEFINE_ASSOCIATIVE_ARRAY ~itm_ids_fields~ BEGIN + proficiency => ~0x31,BYTE,STATS~ +END + +LAUNCH_ACTION_FUNCTION build_IDS_data_field_editors STR_VAR lookup_table=itm_ids_fields function_prefix=ITM END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// delete opcodes +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION ~ITM_delete_opcodes~ + STR_VAR arguments="" +BEGIN + PATCH_IF ~%arguments%~ STRING_COMPARE ~~ BEGIN + LPF return_first_entry STR_VAR list= ~%arguments%~ RET arguments=list opcode_to_delete=entry END + PATCH_MATCH ~%opcode_to_delete%~ WITH + all BEGIN + LPF DELETE_ITEM_EFFECT INT_VAR opcode_to_delete=~-1~ END + LPF DELETE_ITEM_EQEFFECT INT_VAR opcode_to_delete=~-1~ END + END + equipped BEGIN + LPF DELETE_ITEM_EQEFFECT INT_VAR opcode_to_delete=~-1~ END + END + ability BEGIN + LPF DELETE_ITEM_EFFECT INT_VAR opcode_to_delete=~-1~ END + END + DEFAULT + LPF DELETE_ITEM_EFFECT INT_VAR opcode_to_delete END + LPF DELETE_ITEM_EQEFFECT INT_VAR opcode_to_delete END + LPF ITM_delete_opcodes STR_VAR arguments END + END + END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("ITM_delete_opcodes") "" + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// give immunity to opcodes +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION ITM_immunity_to_opcode + STR_VAR arguments="" +BEGIN + PATCH_IF ~%arguments%~ STRING_COMPARE_CASE ~~ BEGIN + LPF return_first_entry STR_VAR list=~%arguments%~ RET entry=entry arguments=list END + LPF delete_entry STR_VAR type=effect_global arguments=~opcode=101 and parameter2=%entry%~ file_ext=ITM END + LPF add_entry_inline STR_VAR arguments =~opcode=>101 parameter2=>%entry%~ type=effect_global file_ext=ITM END + LPF ITM_immunity_to_opcode STR_VAR arguments END + END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("ITM_immunity_to_opcode") "" + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// give immunity to a spell (opcode 206) +///////////// +///////////// if we use "arguments" assume it's a string of entries +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION ITM_immunity_to_spell + STR_VAR spellname="" + spellcode="" + arguments="" +BEGIN + PATCH_IF ~%spellname%~ STRING_COMPARE_CASE ~~ BEGIN + LPF deabbreviate_spellname STR_VAR input= ~%spellname%~ RET spellname END + PATCH_IF VARIABLE_IS_SET "%spellname%" BEGIN + SPRINT spellcode EVALUATE_BUFFER ~%%spellname%%~ + END ELSE BEGIN + SPRINT spellcode "%spellname%" + LPF warning STR_VAR warning="Spell %spellname% does not appear to exist" END + END + END + PATCH_IF ~%spellcode%~ STRING_COMPARE_CASE ~~ BEGIN + LPF add_entry_inline STR_VAR arguments =~opcode=>206 resource=>%spellcode%~ type=effect_global file_ext=ITM END + END + PATCH_IF ~%arguments%~ STRING_COMPARE_CASE ~~ BEGIN + LPF return_first_entry STR_VAR list= ~%arguments%~ RET spell=entry arguments=list END + INNER_ACTION BEGIN + ACTION_IF FILE_EXISTS_IN_GAME ~%spell%.spl~ BEGIN + OUTER_SPRINT spellcode ~%spell%~ + OUTER_SPRINT spellname ~~ + END ELSE BEGIN + OUTER_SPRINT spellname ~%spell%~ + OUTER_SPRINT spellcode ~~ + END + END + LPF ITM_immunity_to_spell STR_VAR arguments spellname spellcode END + END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("ITM_immunity_to_spell") "" + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// take an item, and transfer all effects of a given ability onto a new spell +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION copy_item_to_spell + INT_VAR abil_ind=0 + STR_VAR item="" + spell="" +BEGIN + // make a new spell + LAF make_spell STR_VAR spell= ~%spell%~ END + // add the labelled ability of the item, and the effects, to the spell + COPY_EXISTING ~%item%.itm~ ~override~ + READ_ASCII ((LONG_AT 0x64) + 0x38 * abil_ind) ability (0x38) + SET offset=LONG_AT 0x64 + READ_SHORT 0x72 type + INNER_PATCH_SAVE ability ~%ability%~ BEGIN + WRITE_BYTE 0x2 4 // innate slots + WRITE_BYTE 0x1 0 + WRITE_SHORT 0x10 1 // min level + DELETE_BYTES 0x26 0x4 + DELETE_BYTES 0x28 0xc + READ_SHORT 0x1e eff_num + READ_SHORT 0x20 eff_ind + WRITE_SHORT 0x20 0 + READ_SHORT 0x26 proj + PATCH_IF proj>1 BEGIN + WRITE_BYTE 0x0 2 + END ELSE BEGIN + WRITE_BYTE 0x0 1 + END + END + SET eff_length=0x30*eff_num + READ_ASCII ((LONG_AT 0x6a) + 0x30*eff_ind) effects (eff_length) + INNER_ACTION BEGIN + COPY_EXISTING ~%spell%.spl~ ~override~ + INSERT_BYTES (LONG_AT 0x64) 0x28 + WRITE_ASCIIE (LONG_AT 0x64) ~%ability%~ + WRITE_SHORT 0x68 1 + WRITE_LONG 0x6a ((LONG_AT 0x6a) + 0x28) + INSERT_BYTES (LONG_AT 0x6a) ~eff_length~ + WRITE_ASCIIE (LONG_AT 0x6a) ~%effects%~ + BUT_ONLY + END + BUT_ONLY +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// externalise an item's global effects to a spell (so the spell applies, permanently, all the item's effects) leaving the item itself unchanged +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION copy_item_effects_to_spell + STR_VAR item="" + spell="" +BEGIN + // make a new spell + LAF make_spell STR_VAR spell END + COPY_EXISTING "%item%.itm" "%workspace%" + READ_SHORT 0x70 num_eff + READ_ASCII (LONG_AT 0x6a + (SHORT_AT 0x6e)*0x30) eff_array (num_eff*0x30) // read in whole effect block + BUT_ONLY + COPY_EXISTING "%spell%.spl" override + INNER_PATCH_SAVE ability "" BEGIN + INSERT_BYTES 0x0 0x28 + WRITE_SHORT 0x0 1 // type: melee + WRITE_SHORT 0x2 4 // slot:innate + WRITE_ASCII 0x4 "noicon" + WRITE_BYTE 0xc 5 // target:caster + WRITE_SHORT 0xe 1 // range + WRITE_SHORT 0x10 1 // min level + WRITE_SHORT 0x16 6 // dice size - just in case + WRITE_SHORT 0x1c 1 // piercing type - just in case + WRITE_SHORT 0x1e "%num_eff%" + WRITE_SHORT 0x22 1 // num charges + WRITE_SHORT 0x24 1 // unknown + WRITE_SHORT 0x26 1 // projectile NONE + + END + WRITE_SHORT 0x68 1 + INSERT_BYTES 0x72 0x28 + WRITE_ASCII 0x72 "%ability%" + WRITE_LONG 0x6a 0x72+0x28 + INSERT_BYTES (0x72+0x28) (0x30*num_eff) + WRITE_ASCII (0x72+0x28) "%eff_array%" + BUT_ONLY + LAF edit_spell STR_VAR spell editstring="patch_effect_inline=>~timing=>9~" END + +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// externalise an item's ability to a spell (so all the ability does is cast the spell) +///////////// The item has the same name as the spell unless you specify another explicitly +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION externalise_item_ability + INT_VAR abil_ind=0 + STR_VAR item="" + spell="" +BEGIN + // find the name for the spell + ACTION_IF "%spell%" STRING_EQUAL "" BEGIN + ACTION_IF !FILE_EXISTS_IN_GAME "%item%.spl" BEGIN + OUTER_SPRINT spell "%item%" + END ELSE BEGIN + FAIL "No explicit choice of spell for externalised %item%.itm, and %item%.spl is not available" + END + END + // make the spell + LAF copy_item_to_spell INT_VAR abil_ind STR_VAR item spell END + // edit the item + + ACTION_CLEAR_ARRAY patch_data + ACTION_DEFINE_ASSOCIATIVE_ARRAY patch_data BEGIN + delete_effect=>"parent_index=%abil_ind%" + add_effect_inline=>"match=>~parent_index=%abil_ind%~ opcode=>146 parameter2=>1 resource=>%spell% target=>2 timing=>1" + END + LAF edit_item STR_VAR item edits=patch_data END +END + + + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// append the description +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION ITM_append_description + STR_VAR arguments="" +BEGIN + LPF patch_text_entry INT_VAR loc=0x54 STR_VAR function=append_string_nospace arguments= ~%arguments%~ END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("ITM_append_description") "" + +DEFINE_PATCH_FUNCTION ITM_append_description_newline + STR_VAR arguments="" +BEGIN + LPF patch_text_entry INT_VAR loc=0x54 STR_VAR function=append_string_nospace arguments= ~%WNL%%arguments%~ END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("ITM_append_description_newline") "" + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// substitute the description +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION ITM_substitute_description + STR_VAR arguments="" +BEGIN + LPF patch_text_entry INT_VAR loc=0x54 STR_VAR function=substitute_string arguments= ~%arguments%~ END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("ITM_substitute_description") "" + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// set the description +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION ITM_set_description + STR_VAR arguments="" +BEGIN + LPF patch_text_entry INT_VAR loc=0x54 STR_VAR function=set_string arguments END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("ITM_set_description") "" + +DEFINE_PATCH_FUNCTION ITM_set_unidentified_description + STR_VAR arguments="" +BEGIN + SAY 0x50 (AT "%arguments%") + LPF patch_text_entry INT_VAR loc=0x50 STR_VAR function=set_string arguments END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("ITM_set_unidentified_description") "" + + +DEFINE_PATCH_FUNCTION ITM_say_description + STR_VAR arguments="" +BEGIN + LPF item_useability_string INT_VAR tra_ref=arguments RET desc END + LPF patch_text_entry INT_VAR loc=0x54 STR_VAR function=set_string arguments="%desc%" END +END + +DEFINE_PATCH_FUNCTION ITM_say_unidentified_description + STR_VAR arguments="" +BEGIN + LPF item_useability_string INT_VAR tra_ref=arguments RET desc END + LPF patch_text_entry INT_VAR loc=0x50 STR_VAR function=set_string arguments="%desc%" END +END + +DEFINE_PATCH_FUNCTION ITM_set_both_descriptions + STR_VAR arguments="" +BEGIN + LPF ITM_set_description STR_VAR arguments END + LPF ITM_set_unidentified_description STR_VAR arguments END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("ITM_set_both_descriptions") "" + +DEFINE_PATCH_FUNCTION ITM_say_both_descriptions + STR_VAR arguments="" +BEGIN + LPF ITM_say_description STR_VAR arguments END + LPF ITM_say_unidentified_description STR_VAR arguments END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// get the name +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION ITM_identified_name + RET value +BEGIN + READ_STRREF 0xc value +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// set the name +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION ITM_set_name + STR_VAR arguments="" +BEGIN + LPF patch_text_entry INT_VAR loc=0xc STR_VAR function=set_string arguments= ~%arguments%~ END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("ITM_set_name") "" + +DEFINE_PATCH_FUNCTION ITM_set_name_evaluate + STR_VAR arguments="" +BEGIN + LPF patch_text_entry INT_VAR loc=0xc STR_VAR function=set_string arguments= ~%arguments%~ END +END + +DEFINE_PATCH_FUNCTION ITM_set_unidentified_name + STR_VAR arguments="" +BEGIN + LPF patch_text_entry INT_VAR loc=0x8 STR_VAR function=set_string arguments= ~%arguments%~ END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("ITM_set_unidentified_name") "" + +DEFINE_PATCH_FUNCTION ITM_say_name + STR_VAR arguments="" +BEGIN + WRITE_LONG 0xc RESOLVE_STR_REF ((AT arguments)) +END + +DEFINE_PATCH_FUNCTION ITM_say_unidentified_name + STR_VAR arguments="" +BEGIN + WRITE_LONG 0x8 RESOLVE_STR_REF ((AT arguments)) +END + + +DEFINE_PATCH_FUNCTION ITM_set_both_names + STR_VAR arguments="" +BEGIN + LPF ITM_set_name STR_VAR arguments END + LPF ITM_set_unidentified_name STR_VAR arguments END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("ITM_set_both_names") "" + +DEFINE_PATCH_FUNCTION ITM_say_both_names + STR_VAR arguments="" +BEGIN + LPF ITM_say_name STR_VAR arguments END + LPF ITM_say_unidentified_name STR_VAR arguments END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// build +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION ITM_build +BEGIN + ///// basic structure + DELETE_BYTES 0x0 BUFFER_LENGTH + INSERT_BYTES 0x0 0x72 + // sig + WRITE_ASCII 0x0 ~ITM V1 ~ + // name + WRITE_LONG 0x8 ~-1~ + WRITE_LONG 0xc ~-1~ + // max in stack + WRITE_SHORT 0x38 1 + // description + WRITE_LONG 0x50 ~-1~ + WRITE_LONG 0x54 ~-1~ + //offsets + WRITE_LONG 0x64 0x72 + WRITE_LONG 0x6a 0x72 +END + +DEFINE_PATCH_FUNCTION ITM_postbuild BEGIN + // sort out relevant proficiency + SET prof=0 + SPRINT inv "" + READ_SHORT 0x1c category + PATCH_MATCH category WITH + 25 BEGIN // axes + SPRINT inv AX + END + 28 BEGIN // handheld weapons + SPRINT inv H6 + END + 69 BEGIN // bastard swords + SPRINT inv S1 + SET prof=89 + END + 15 BEGIN // bows + SPRINT inv BW + SET prof=104 + END + 44 BEGIN // clubs + SPRINT inv CL + SET prof=115 + END + 27 BEGIN // crossbows + SPRINT inv CB + SET prof=103 + END + 16 BEGIN // daggers + SPRINT inv DD + SET prof=96 + END + 24 BEGIN // darts + SET prof=106 + END + 23 BEGIN // flails + SPRINT inv FL + SET prof=100 + END + 57 BEGIN // greatswords + SPRINT inv S2 + SET prof=93 + END + 30 BEGIN // halberds + SPRINT inv HB + SET prof=99 + END + 21 BEGIN // hammers + SPRINT inv WH + SET prof=97 + END + 20 BEGIN // longswords + SPRINT inv S1 + SET prof=90 + END + 17 BEGIN // maces + SPRINT inv MC + SET prof=101 + END + 22 BEGIN // morning stars + SPRINT inv MS + SET prof=100 + END + 26 BEGIN // quarterstaffs + SPRINT inv QS + SET prof=102 + END + 12 BEGIN // shields + SPRINT inv D2 + END + 19 BEGIN // shortswords + SPRINT inv SS + SET prof=91 + END + 18 BEGIN // slings + SPRINT inv SL + SET prof=107 + END + 29 BEGIN // spears + SPRINT inv SP + SET prof=98 + END + DEFAULT + END + PATCH_IF (prof>0) BEGIN + LPF ITM_read_proficiency_code RET value=value END + PATCH_IF value=0 BEGIN + LPF ITM_proficiency_code STR_VAR arguments= ~%prof%~ END + END + END + PATCH_IF (~%inv%~ STRING_COMPARE ~~) BEGIN + LPF ITM_read_inventory RET value=value END + PATCH_IF ~%value%~ STRING_EQUAL_CASE ~~ BEGIN + LPF ITM_inventory STR_VAR arguments= ~%inv%~ END + END + END + +END + +///////////////////////////////////////////////////////////////////////////////////////////// +/// logs the name of the item +///////////////////////////////////////////////////////////////////////////////////////////// + + +DEFINE_PATCH_FUNCTION ITM_log_me STR_VAR arguments="" BEGIN + LPF log_this STR_VAR file= ~%arguments%~ input= ~%filename%~ repeat=no END +END + +///////////////////////////////////////////////////////////////////////////////////////////// +/// code to make an item description string according to whether EE is installed +///////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION item_useability_string + INT_VAR tra_ref=0 + RET desc +BEGIN + SPRINT desc ( AT "%tra_ref%") + PATCH_IF enhanced_edition BEGIN + PATCH_IF VARIABLE_IS_SET SFO_unusable_string_tra_ref BEGIN + SPRINT unusable ( AT "%SFO_unusable_string_tra_ref%") + INNER_PATCH "%desc%" BEGIN + SET ind=INDEX_BUFFER (CASE_INSENSITIVE "%unusable%") + PATCH_IF ind>=0 BEGIN + READ_ASCII 0x0 desc (ind) + END + END + END + PATCH_IF VARIABLE_IS_SET SFO_usable_string_tra_ref BEGIN + SPRINT usable ( AT "%SFO_usable_string_tra_ref%") + INNER_PATCH "%desc%" BEGIN + SET ind=INDEX_BUFFER (CASE_INSENSITIVE "%usable%") + PATCH_IF ind>=0 BEGIN + READ_ASCII 0x0 desc (ind) + END + END + END + END +END + + +//////////////////////////////////////////////////////////////////////////////////////// +/// Armor-type-finding function +/// +/// use example: LAF armor_type STR_VAR item=chan01 RET success type END +/// +/// success=1 if we find the armor type, 0 if we don't +/// type is one of: file_does_not_exist, not_armor, robes, leather, studded_leather, hide, chain, splint, plate, full_plate, scale, unknown +/// +/// if we can't work it out, but it is armor, we try to guess (but still set success=0) +//////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION armor_type + STR_VAR item="" + RET type success +BEGIN + FAIL "armor_type function calls 'read_armor_bonus_by_type' function, which doesn't exist" + OUTER_SET success=0 + ACTION_IF FILE_EXISTS_IN_GAME "%item%.cre" BEGIN + COPY_EXISTING "%item%.itm" override + // start by looking at the category, to confirm it's actually armor + PATCH_IF !((SHORT_AT 0x1c)=2) BEGIN + SET success=1 + SPRINT type not_armor + END + PATCH_IF !success BEGIN + // look at the animation type + READ_SHORT 0x22 anim_type + PATCH_MATCH "%anim_type%" WITH + 2W 3W 4W BEGIN // robes + SET success=1 + SPRINT type robes + END + // end of 2W 3W 4W section + 2A BEGIN // leather armor - could be ordinary,studded,hide + LPF read_armor_bonus_by_type RET slashing piercing crushing missile END + PATCH_IF (piercing="-2" && missile="-2") BEGIN // either leather or hide + PATCH_IF (SHORT_AT 0x26)=6 BEGIN // if you need strength 6 (rather than 4), it's hide + SET success=1 + SPRINT type hide + END ELSE BEGIN + SET success=1 + SPRINT type leather + END + END ELSE + PATCH_IF (slashing=2 && piercing=1 && missile=1) BEGIN // studded leather + SET success=1 + SPRINT type studded_leather + END ELSE BEGIN + SET success=0 + SPRINT type leather // guess leather + END + END + // end of 2A section + 3A BEGIN // chain or splint + LPF read_armor_bonus_by_type RET slashing piercing crushing missile END + PATCH_IF (slashing=2 && crushing="-2") BEGIN // chain mail + SET success=1 + SPRINT type chain + END ELSE + PATCH_IF (piercing=1 && missile=1 && crushing=2) BEGIN + SET success=1 + SPRINT type splint + END ELSE BEGIN + SET success=0 + SPRINT type chain // guess chain + END + END + // end of 3A section + 4A BEGIN // plate or full plate + LPF read_armor_bonus_by_type RET slashing piercing crushing missile END + PATCH_IF (slashing=3 && missile=0 && piercing=0) BEGIN // plate mail + SET success=1 + SPRINT type plate + END ELSE + PATCH_IF (piercing=3 && missile=3 && slashing=4) BEGIN + SET success=1 + SPRINT type full_plate + END ELSE + PATCH_IF (slashing=3 && missile=1 && piercing=1) BEGIN // scale male - just a couple of dragon armors + SET success=1 + SPRINT type scale + END ELSE BEGIN + SET success=0 + SPRINT type plate // guess plate + END + END + // end of 4A section + DEFAULT + SET success=0 + SPRINT type robes // guess robes + END + END + BUT_ONLY + END ELSE BEGIN + OUTER_SET success=0 + OUTER_SPRINT type file_does_not_exist + END +END + +//////////////////////////////////////////////////////////////////////////////////////// +/// Helper function. Returns the vs-type bonuses for armor +//////////////////////////////////////////////////////////////////////////////////////// + + +DEFINE_PATCH_FUNCTION read_armor_bonus_vs_type + RET slashing piercing crushing missile +BEGIN + DEFINE_ASSOCIATIVE_ARRAY type_map BEGIN + 1=>crushing + 2=>missile + 4=>piercing + 8=>slashing + END + PHP_EACH type_map AS discard=>value BEGIN + SET "%value%"=0 + END + GET_OFFSET_ARRAY offsets ITM_V10_GEN_EFFECTS + PHP_EACH offsets AS discard=>offset BEGIN + PATCH_IF (SHORT_AT offset)=0 BEGIN // is an AC modification + READ_LONG (0x8 + offset) type + PHP_EACH type_map AS key=>value BEGIN + PATCH_IF type=key BEGIN + READ_LONG (0x4 + offset) modifier + SET "%value%"=modifier + END + END + END + END +END + +//////////////////////////////////////////////////////////////////////////////////////// +/// Return 1 if the item is stackable +//////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION ITM_is_stackable + RET value +BEGIN + SET value=0 + PATCH_IF (SHORT_AT 0x38>1) BEGIN + SET value=1 + END + PATCH_IF value=0 BEGIN + GET_OFFSET_ARRAY ab_arr ITM_V10_HEADERS + PHP_EACH ab_arr AS ind=>ab_off BEGIN + PATCH_IF (SHORT_AT (0x22 + ab_off) )>1 BEGIN + SET value=1 + END + END + END +END + + diff --git a/iwdification/sfo/filetype/lib_kit.tpa b/iwdification/sfo/filetype/lib_kit.tpa new file mode 100644 index 0000000..51f0a48 --- /dev/null +++ b/iwdification/sfo/filetype/lib_kit.tpa @@ -0,0 +1,2794 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///// General kit editor +///// "kit" refers to the table entry in kitlist.2da +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION edit_kit + INT_VAR skip_lua=0 + skip_clab=0 + at_top_hla=0 + do_not_deexternalize_weapprof=0 + STR_VAR editstring="" + edits="" + kit="" +BEGIN + // de-externalize weapprof + ACTION_IF !do_not_deexternalize_weapprof && FILE_EXISTS "%data_loc_shared%/weapprof.2da" BEGIN + COPY "%data_loc_shared%/weapprof.2da" override + END + + // initialise + ACTION_CLEAR_ARRAY mc_clab_edits + // synonyms + LAF standardize_kit STR_VAR arguments="%kit%" RET kit=value END + // get parent class + LAF resolve_parent_class STR_VAR kit RET parent_class true_class multiclassed END + OUTER_SET class_id=IDS_OF_SYMBOL (class "%parent_class%") + // get kit code + ACTION_IF true_class=0 BEGIN + COPY_EXISTING kitlist.2da "%workspace%" + LPF get_table_row_coordinate INT_VAR lookup_column=1 STR_VAR row="%kit%" RET kit_id=rownum END + BUT_ONLY + END + // process edits + OUTER_SPRINT clab_edits "" + OUTER_SPRINT lua_edits "" + OUTER_WHILE "%editstring%" STRING_COMPARE "" BEGIN + LAF return_first_pair STR_VAR list="%editstring%" RET command=key arguments=value editstring=list END + OUTER_PATCH_SAVE command "%command%" BEGIN + REPLACE_TEXTUALLY "'[0-9]*" "" + REPLACE_TEXTUALLY "'" "" + END + ACTION_MATCH "%command%" WITH + "grant_power_.*" "apply_power_.*" BEGIN + ACTION_IF !multiclassed BEGIN + WARN "multiclassed CLAB ability edit called for single-classed kit %kit% (parent class is %parent_class%)" + END + OUTER_PATCH "%command%" BEGIN + REPLACE_EVALUATE "\(.*_power\)_\(.*\)" BEGIN + SPRINT command_core "%MATCH1%" + SPRINT call_class "%MATCH2%" + TO_UPPER call_class + END + "" + END + ACTION_IF !VARIABLE_IS_SET $mc_clab_edits("%call_class%") BEGIN + OUTER_SPRINT temp "" + END ELSE BEGIN + OUTER_SPRINT temp $mc_clab_edits("%call_class%") + END + OUTER_SPRINT $mc_clab_edits("%call_class%") "%temp% %command_core%=>~%arguments%~" + END + grant_power apply_power remove_power BEGIN + ACTION_IF multiclassed BEGIN + WARN "singleclass CLAB ability edit called for multi-classed kit %kit% (parent class is %parent_class%)" + END + OUTER_SPRINT clab_edits "%clab_edits% %command%=>~%arguments%~" + END + remove_hla grant_hla apply_hla restrict_hla BEGIN + OUTER_SPRINT lua_edits "%lua_edits% %command%=>~%arguments%~" + END + DEFAULT + LAF edit_kit_parser STR_VAR command arguments END + END + END + ACTION_PHP_EACH "%edits%" AS command=>arguments BEGIN + OUTER_PATCH_SAVE command "%command%" BEGIN + REPLACE_TEXTUALLY "'[0-9]*" "" + REPLACE_TEXTUALLY "'" "" + END + + ACTION_MATCH "%command%" WITH + "grant_power_.*" "apply_power_.*" BEGIN + ACTION_IF !multiclassed BEGIN + WARN "multiclassed CLAB ability edit called for single-classed kit %kit% (parent class is %parent_class%)" + END + OUTER_PATCH "%command%" BEGIN + REPLACE_EVALUATE "\(.*_power\)_\(.*\)" BEGIN + SPRINT command_core "%MATCH1%" + SPRINT call_class "%MATCH2%" + TO_UPPER call_class + END + "" + END + ACTION_IF !VARIABLE_IS_SET $mc_clab_edits("%call_class%") BEGIN + OUTER_SPRINT temp "" + END ELSE BEGIN + OUTER_SPRINT temp $mc_clab_edits("%call_class%") + END + OUTER_SPRINT $mc_clab_edits("%call_class%") "%temp% %command_core%=>~%arguments%~" + END + + grant_power apply_power remove_power BEGIN + ACTION_IF multiclassed BEGIN + WARN "singleclass CLAB ability edit called for multi-classed kit %kit% (parent class is %parent_class%)" + END + OUTER_SPRINT clab_edits "%clab_edits% %command%=>~%arguments%~" + END + remove_hla grant_hla apply_hla restrict_hla BEGIN + OUTER_SPRINT lua_edits "%lua_edits% %command%=>~%arguments%~" + END + DEFAULT + LAF edit_kit_parser STR_VAR command arguments END + END + END + // process CLAB editing + ACTION_IF ("%clab_edits%" STRING_COMPARE "" && !skip_clab) BEGIN + LAF edit_clab STR_VAR editstring="%clab_edits%" kit END + END + // process multiclass CLAB editing + ACTION_PHP_EACH mc_clab_edits AS primary_class=>editstring BEGIN + LAF edit_clab_mc INT_VAR kit_id STR_VAR primary_class parent_class kit editstring END + END + // process LUA editing + ACTION_IF ("%lua_edits%" STRING_COMPARE "" && !skip_lua) BEGIN + LAF edit_lua INT_VAR at_top="%at_top_hla%" STR_VAR editstring="%lua_edits%" kit END + END + + // put weapprof back if we're externalized + // (still need to rerun the code to generate lua data) + ACTION_IF FILE_EXISTS "%data_loc_shared%/weapprof.2da" BEGIN + COPY_EXISTING "weapprof.2da" "%data_loc_shared%" + END + +END + + +DEFINE_ACTION_FUNCTION edit_kit_parser + STR_VAR command="" + arguments="" +BEGIN + OUTER_SET found=1 + ACTION_TO_UPPER command + ACTION_TO_UPPER kit + ACTION_MATCH "%command%" WITH + "min_\(str\|dex\|con\|int\|wis\|chr\)" BEGIN + LAF write_table_entry STR_VAR row="%kit%" column="%command%" arguments file=ABCLASRQ END + END + "mod_\(str\|dex\|con\|int\|wis\|chr\)" BEGIN + LAF write_table_entry STR_VAR row="%kit%" column="%command%" arguments file=ABCLSMOD END + END + "dc_from_min_\(str\|dex\|con\|int\|wis\|chr\)" BEGIN + ACTION_IF multiclassed BEGIN + FAIL "%command% is not valid for multi-classed characters" + END + OUTER_PATCH_SAVE command "%command%" BEGIN + DELETE_BYTES 0x0 3 + END + LAF write_table_entry STR_VAR row="%kit%" column="%command%" arguments file=ABDCSCRQ END + END + "dc_to_min_\(str\|dex\|con\|int\|wis\|chr\)" BEGIN + ACTION_IF !true_class BEGIN + FAIL "%command% is not valid for kitted characters" + END + ACTION_IF multiclassed BEGIN + FAIL "%command% is not valid for multi-classed characters" + END + OUTER_PATCH_SAVE command "%command%" BEGIN + DELETE_BYTES 0x0 3 + END + LAF write_table_entry STR_VAR row="%kit%" column="%command%" arguments file=ABDCDSRQ END + END + "\(lawful\|chaotic\|neutral\)_\(good\|neutral\|evil\)" "neutral" "[lcn]_[gne]" BEGIN + OUTER_PATCH_SAVE command "%command%" BEGIN + REPLACE_TEXTUALLY lawful l + REPLACE_TEXTUALLY chaotic c + REPLACE_TEXTUALLY good g + REPLACE_TEXTUALLY evil e + REPLACE_TEXTUALLY neutral n + REPLACE_TEXTUALLY "^n$" "n_n" + END + LAF write_table_entry STR_VAR row="%kit%" column="%command%" arguments file=ALIGNMNT END + END + small_sword large_sword blunt missile bow spiked axe spear BEGIN + LAF write_table_entry STR_VAR row="%kit%" column="%command%" arguments file=CLASWEAP END + END + "dual_to_\(fighter\|cleric\|mage\|thief\|druid\|ranger\)" BEGIN + ACTION_IF multiclassed BEGIN + FAIL "%command% is not valid for multi-classed characters" + END + OUTER_PATCH_SAVE command "%command%" BEGIN + DELETE_BYTES 0x0 8 + END + LAF write_table_entry STR_VAR row="%kit%" column="%command%" arguments file=DUALCLAS END + END + "prof_.*" "proficiency_.*" BEGIN + OUTER_PATCH_SAVE command "%command%" BEGIN + REPLACE_TEXTUALLY "prof_" "" + REPLACE_TEXTUALLY "proficiency_" "" + END + LAF write_table_entry INT_VAR do_not_insert=1 STR_VAR row="%command%" column="%kit%" file=WEAPPROF arguments END + END + "initial_\(pick_pockets\|open_locks\|find_traps\|move_silently\|hide_in_shadows\|detect_illusion\|set_traps\)" BEGIN + ACTION_IF enhanced_edition BEGIN + OUTER_PATCH_SAVE command "%command%" BEGIN + DELETE_BYTES 0x0 8 + END + LAF write_table_entry STR_VAR row="%command%" column="%kit%" arguments file=clasiskl END + END ELSE BEGIN + LAF warning STR_VAR warning="Initial thief skills can only be edited on the Enhanced Edition of the game" END + END + END + gets_prof_apr unarmed_divisor zero_skill_thac0 BEGIN + ACTION_IF enhanced_edition BEGIN + LAF write_table_entry STR_VAR row="%kit%" column="%command%" arguments file=clswpbon END + END ELSE BEGIN + LAF warning STR_VAR warning="values in 'clswpbon' can only be edited on the Enhanced Edition of the game" END + END + END + hp_table BEGIN + ACTION_IF enhanced_edition BEGIN + LAF write_table_entry STR_VAR row="%kit%" column=table arguments file=hpclass END + END ELSE BEGIN + LAF warning STR_VAR warning="The hit point table used by a class or kit can only be edited on the Enhanced Edition of the game" END + END + END + weapon_slots BEGIN + ACTION_IF enhanced_edition BEGIN + LAF write_table_entry STR_VAR row="%kit%" column=slots file=numwslot arguments END + END ELSE BEGIN + LAF warning STR_VAR warning="The number of weapon slots available to a class or kit can only be edited in the Enhanced Edition of the game" END + END + END + "scale_\(stealth\|pick_pockets\|open_locks\|find_traps\|move_silently\|hide_in_shadows\|detect_illusion\|set_traps\)" BEGIN + ACTION_IF enhanced_edition BEGIN + OUTER_PATCH_SAVE command "%command%" BEGIN + DELETE_BYTES 0x0 6 + END + LAF write_table_entry STR_VAR row="%command%" column="%kit%" arguments file=thiefscl END + END ELSE BEGIN + LAF warning STR_VAR warning="The scaling of thief skills can only be edited on the Enhanced Edition of the game" END + END + END + thief_start_points thief_level_points BEGIN + ACTION_IF enhanced_edition BEGIN + OUTER_PATCH_SAVE command "%command%" BEGIN + DELETE_BYTES 0x0 6 + END + LAF write_table_entry STR_VAR row="%kit%" column="%command%" arguments file=thiefskl END + END ELSE BEGIN + LAF warning STR_VAR warning="The number of available thief skill points can only be edited on the Enhanced Edition of the game" END + END + END + trap_limit BEGIN + ACTION_IF enhanced_edition BEGIN + LAF write_table_entry STR_VAR row="%kit%" column=limit arguments file=traplimt END + END ELSE BEGIN + LAF warning STR_VAR warning="The maximum number of settable traps can only be edited on the Enhanced Edition of the game" END + END + END + available_to unavailable_to BEGIN + OUTER_PATCH_SAVE list "%arguments%" BEGIN + REPLACE_TEXTUALLY "\[" "" // we allow either format of entry here + REPLACE_TEXTUALLY "\]" "" + END + OUTER_WHILE "%list%" STRING_COMPARE "" BEGIN + LAF return_first_entry STR_VAR list RET entry list END + ACTION_IF !true_class BEGIN + LAF kit_race_notrueclass STR_VAR entry kit END + END ELSE BEGIN + LAF kit_race_trueclass STR_VAR entry kit END + END + END // end of WHILE loop + END // end of available_to section + fallen BEGIN + ACTION_IF !true_class BEGIN // lookup by IDS doesn't look reliable for CLASTEXT + ACTION_MATCH "%kit%" WITH + ABJURER CONJURER DIVINER ENCHANTER ILLUSIONIST INVOKER NECROMANCER TRANSMUTER + BEGIN + LAF write_table_entry STR_VAR row="%kit%" column=fallen arguments file=clastext END + END + WILDMAGE BEGIN + LAF write_table_entry STR_VAR row=WILD_MAGE column=fallen arguments file=clastext END + END + DEFAULT + LAF write_table_entry INT_VAR lookup_column=2 STR_VAR row="%kit_id%" column=fallen arguments file=clastext END + END + END ELSE BEGIN + LAF write_table_entry INT_VAR lookup_column=2 STR_VAR row="%class_id%" column=fallen arguments file=clastext END + END + + END + set_name say_name name_strref BEGIN + ACTION_MATCH "%command%" WITH + set_name BEGIN + OUTER_SET mixed=RESOLVE_STR_REF ("%arguments%") + LAF kit_name_to_lower STR_VAR mixed_string="%arguments%" RET lower_string END + OUTER_SET lower=RESOLVE_STR_REF ("%lower_string%") + END + say_name BEGIN + OUTER_SET mixed=RESOLVE_STR_REF ((AT "%arguments%")) + ACTION_GET_STRREF mixed mixed_string + LAF kit_name_to_lower STR_VAR mixed_string RET lower_string END + OUTER_SET lower=RESOLVE_STR_REF ("%lower_string%") + END + DEFAULT + OUTER_SET mixed=arguments + ACTION_GET_STRREF mixed mixed_string + LAF kit_name_to_lower STR_VAR mixed_string RET lower_string END + OUTER_SET lower=RESOLVE_STR_REF ("%lower_string%") + END + ACTION_IF !true_class BEGIN + LAF write_table_entry INT_VAR lookup_column=1 STR_VAR row="%kit%" column=LOWER arguments="%lower%" file=kitlist END + LAF write_table_entry INT_VAR lookup_column=1 STR_VAR row="%kit%" column=mixed arguments="%mixed%" file=kitlist END + ACTION_IF enhanced_edition BEGIN // now CLASTEXT, for enhanced + // lookup by IDS doesn't look reliable for CLASTEXT + ACTION_MATCH "%kit%" WITH + ABJURER CONJURER DIVINER ENCHANTER ILLUSIONIST INVOKER NECROMANCER TRANSMUTER + BEGIN + LAF write_table_entry STR_VAR row="%kit%" column=lower arguments="%lower%" file=clastext END + LAF write_table_entry STR_VAR row="%kit%" column=mixed arguments="%mixed%" file=clastext END + END + WILDMAGE BEGIN + LAF write_table_entry STR_VAR row=WILD_MAGE column=lower arguments="%lower%" file=clastext END + LAF write_table_entry STR_VAR row=WILD_MAGE column=mixed arguments="%mixed%" file=clastext END + END + DEFAULT + LAF write_table_entry INT_VAR lookup_column=2 STR_VAR row="%kit_id%" column=LOWER arguments="%lower%" file=clastext END + LAF write_table_entry INT_VAR lookup_column=2 STR_VAR row="%kit_id%" column=mixed arguments="%mixed%" file=clastext END + END + END + END ELSE BEGIN + ACTION_IF enhanced_edition BEGIN + LAF write_table_entry INT_VAR lookup_column=2 STR_VAR row="%class_id%" column=LOWER arguments="%lower%" file=clastext END + LAF write_table_entry INT_VAR lookup_column=2 STR_VAR row="%class_id%" column=mixed arguments="%mixed%" file=clastext END + END ELSE BEGIN + LAF warning STR_VAR warning="Names of classes can only (readily) be edited on the Enhanced Edition of the game" END + END + END + END + set_biography say_biography biography_strref BEGIN + ACTION_IF !enhanced_edition BEGIN + LAF warning STR_VAR warning="Biographies can only be edited on the Enhanced Edition of the game" END + END ELSE BEGIN + ACTION_MATCH "%command%" WITH + set_biography BEGIN + OUTER_SET strref=RESOLVE_STR_REF ("%arguments%") + END + say_biography BEGIN + OUTER_SET strref=RESOLVE_STR_REF ( (AT arguments) ) + END + DEFAULT + OUTER_SET strref=arguments + END + ACTION_IF !true_class BEGIN // lookup by IDS doesn't look reliable for CLASTEXT + ACTION_MATCH "%kit%" WITH + ABJURER CONJURER DIVINER ENCHANTER ILLUSIONIST INVOKER NECROMANCER TRANSMUTER + BEGIN + LAF write_table_entry STR_VAR row="%kit%" column=biography arguments="%strref%" file=clastext END + END + WILDMAGE BEGIN + LAF write_table_entry STR_VAR row=WILD_MAGE column=biography arguments="%strref%" file=clastext END + END + DEFAULT + LAF write_table_entry INT_VAR lookup_column=2 STR_VAR row="%kit_id%" column=biography arguments="%strref%" file=clastext END + END + END ELSE BEGIN + LAF write_table_entry INT_VAR lookup_column=2 STR_VAR row="%class_id%" column=biography arguments="%strref%" file=clastext END + END + END + END + set_description say_description description_strref BEGIN + ACTION_MATCH "%command%" WITH + set_description BEGIN + OUTER_SET strref=RESOLVE_STR_REF ("%arguments%") + END + say_description BEGIN + OUTER_SET strref=RESOLVE_STR_REF ((AT arguments)) + END + DEFAULT + OUTER_SET strref=arguments + END + ACTION_IF !true_class BEGIN + // first KITLIST + LAF write_table_entry INT_VAR lookup_column=1 STR_VAR row="%kit%" column=help arguments="%strref%" file=kitlist END + // then, on enhanced edition, CLASTEXT + ACTION_IF enhanced_edition BEGIN + // lookup by IDS doesn't look reliable for CLASTEXT + ACTION_MATCH "%kit%" WITH + ABJURER CONJURER DIVINER ENCHANTER ILLUSIONIST INVOKER NECROMANCER TRANSMUTER + BEGIN + LAF write_table_entry STR_VAR row="%kit%" column=descstr arguments="%strref%" file=clastext END + END + WILDMAGE BEGIN + LAF write_table_entry STR_VAR row=WILD_MAGE column=descstr arguments="%strref%" file=clastext END + END + DEFAULT + LAF write_table_entry INT_VAR lookup_column=2 STR_VAR row="%kit_id%" column=descstr arguments="%strref%" file=clastext END + END + END + END ELSE BEGIN + ACTION_IF enhanced_edition BEGIN + LAF write_table_entry STR_VAR row="%class" column=descstr arguments="%strref%" file=clastext END + END ELSE BEGIN + LAF warning STR_VAR warning="Class descriptions can only be (readily) edited on the Enhanced version of the game" END + END + END + END + patch_description_strref BEGIN + ACTION_IF !true_class BEGIN + LAF read_table_entry INT_VAR lookup_column=1 STR_VAR row="%kit%" column=help file=kitlist RET strref=value END + END ELSE BEGIN + ACTION_IF enhanced_edition BEGIN + LAF read_table_entry STR_VAR row="%parent_class%" column=descstr file=clastext RET strref=value END + END ELSE BEGIN // use the BG2 default values + ACTION_IF VARIABLE_IS_SET $default_class_descriptions("%class_id%") BEGIN + OUTER_SET strref=$default_class_descriptions("%class_id%") + END ELSE BEGIN + OUTER_SET strref="-1" + LAF warning STR_VAR warning="You are on the vanilla (non-enhanced) game but are editing the string of an unrecognised class" END + END + END + END + ACTION_IF strref>=0 BEGIN + LAF apply_function_to_tlk_entry INT_VAR tlk_entry=strref STR_VAR arguments END + END + END + metal minor_cloth main_cloth leather armor BEGIN + LAF write_table_entry STR_VAR row="%command%" column="%kit%" arguments file=clascolr END + END + armor shield helm bag ring1 ring2 cloak boots amulet bracers belt ammo1 ammo2 ammo3 misc1 misc2 misc3 misc4 misc5 weapon1 BEGIN + LAF write_table_entry STR_VAR row="%command%" column="%kit%" arguments file=25stweap END + END + backstab BEGIN + ACTION_IF enhanced_edition BEGIN + COPY_EXISTING backstab.2da override + COUNT_2DA_COLS colcount + BUT_ONLY + OUTER_FOR (i=0;ih + elf=>e + elven=>e + dwarf=>d + dwarven=>d + halfelf=>he + half-elf=>he + half_elf=>he + half-elven=>he + halfelven=>he + half_elven=>he + halfling=>hl + gnome=>g + halforc=>ho + half-orc=>ho + half_orc=>ho + END + ACTION_DEFINE_ASSOCIATIVE_ARRAY kit_class_codes BEGIN + bard=>b + cleric=>c + priest=>c + druid=>d + fighter=>f + monk=>mn + paladin=>p + ranger=>r + sorceror=>s + sorcerer=>s + thief=>t + END + ACTION_TO_LOWER entry + OUTER_SPRINT racecode $kit_race_codes("%entry%") + ACTION_TO_LOWER parent_class + OUTER_SPRINT classcode $kit_class_codes("%parent_class%") + OUTER_SPRINT filename "K_%classcode%_%racecode%" + ACTION_IF FILE_EXISTS_IN_GAME "%filename%.2da" BEGIN + COPY_EXISTING "%filename%.2da" override + COUNT_2DA_ROWS 2 rowcount + PATCH_IF "%command%" STRING_EQUAL_CASE unavailable_to BEGIN + SET to_delete="-1" + FOR (i=1;i=0 BEGIN + REMOVE_2DA_ROW to_delete 2 + LPF renumber_rows END + END + END ELSE BEGIN + SET is_present=0 + FOR (i=1;i=0 BEGIN + OUTER_SPRINT dc_line "%kit% 0 0 0 0 0 0" + ACTION_FOR_EACH file IN abdcdsrq abdcscrq BEGIN + APPEND "%file%.2da" "%dc_line%" + COPY_EXISTING "%file%.2da" override PRETTY_PRINT_2DA + END + END + + + // set up base class abilities + + ACTION_IF INDEX ("_" "%parent_class%")<0 BEGIN + LAF find_next_unused_clab INT_VAR clone=1 STR_VAR parent_class RET clab END + END ELSE BEGIN + OUTER_SPRINT clab "clabnull" + END + LAF find_next_unused_lua INT_VAR clone=1 STR_VAR parent_class RET lua END + + // set up the entry in KITLIST + + // first get the proficiency code (column index in WEAPPROF) + + COPY_EXISTING weapprof.2da "%workspace%" + COUNT_2DA_COLS colcount + SET prof_num = colcount - 2 + BUT_ONLY + + + + // get the ID of the parent class + + OUTER_SET class_id = IDS_OF_SYMBOL (class "%parent_class%") + + OUTER_SPRINT to_add "%kit% -1 -1 -1 %clab% %prof_num% 0x00004000 %class_id%" + ACTION_IF enhanced_edition BEGIN + OUTER_SPRINT to_add "%to_add% IDS_PLACEHOLDER" + END + + // add the string + + + COPY_EXISTING kitlist.2da override + LPF append_numbered_row STR_VAR arguments="%to_add%" RET kit_id=value END + SET idsnum=0x4000+kit_id + LPF ensure_hex STR_VAR in="%idsnum%" RET idsnum=out END + INNER_PATCH_SAVE idsnum_disp "%idsnum%" BEGIN + REPLACE_TEXTUALLY "0x" "0x0000" + END + REPLACE_TEXTUALLY "IDS_PLACEHOLDER" "%idsnum_disp%" + PRETTY_PRINT_2DA + + // add the IDS entry + + + APPEND "kit.ids" "%idsnum% %kit%" + + // on the enhanced edition, set up the entry in CLASTEXT + + ACTION_IF enhanced_edition BEGIN + + // make sure the FALLEN_NOTICE column is present (it's not on BGEE) + + ACTION_IF !RESOURCE_CONTAINS "clastext.2da" "FALLEN_NOTICE" BEGIN + COPY_EXISTING "clastext.2da" override + COUNT_2DA_COLS colcount + COUNT_2DA_ROWS colcount rowcount + BUT_ONLY + OUTER_SPRINT new_column "$ $ FALLEN_NOTICE" + OUTER_FOR (row=0;row>>>>>>> + COPY ".../stratagems-inline/%table%.2da" override + END + COPY_EXISTING "%table%.2da" override + COUNT_2DA_ROWS 2 rowcount + OUTER_WHILE "%kit_id%" STRING_COMPARE "" BEGIN + LAF return_first_entry STR_VAR list="%kit_id%" RET entry kit_id=list END + APPEND "%table%.2da" "%rowcount% %entry%" + OUTER_SET rowcount +=1 + END + + COPY_EXISTING "%table%.2da" override + PRETTY_PRINT_2DA + +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///// General clab editor +///// (Intended basically to be called from within edit_kit) +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION edit_clab + STR_VAR editstring="" + edits="" + kit="" +BEGIN + + // once only (gated by label) fix extant CLAB bugs + LAF fix_clab_bugs END + + // find and read in the CLAB file + LAF find_clab STR_VAR kit RET clab END + // if it doesn't exist, make it + ACTION_IF !FILE_EXISTS_IN_GAME "%clab%.2da" BEGIN + OUTER_SPRINT row "" + OUTER_SPRINT row2 "ABILITY1" + OUTER_FOR (i=1;i<=40;i+=1) BEGIN + OUTER_SPRINT row "%row% %i%" + OUTER_SPRINT row2 "%row2% ****" + END + +<<<<<<<< .../stratagems-inline/clab_template.2da +2DA V1.0 +**** +%row% +%row2% +>>>>>>>> + COPY ".../stratagems-inline/clab_template.2da" "override/%clab%.2da" EVALUATE_BUFFER PRETTY_PRINT_2DA + END + COPY_EXISTING "%clab%.2da" override + // read in the data + LPF find_clab_levels RET max_level END + SET colcount=max_level + 1 + READ_2DA_ENTRIES_NOW clab_data colcount + FOR (level=1;level<=max_level;level+=1) BEGIN + SPRINT abil_temp "" + FOR (i=0;i max_level BEGIN + SET max_here = max_level + END + END + END + PATCH_IF rec<=0 BEGIN SET rec=99 END // guard against infinite loops + WHILE level<=max_here BEGIN + LPF CLAB_add_ability INT_VAR level STR_VAR spell type="%command%" RET string=string END + SPRINT $abil("%level%") "%string%" + SET level += rec + END + END + DEFAULT + PATCH_FAIL "%command% is not a valid argument for edit_clab" + END + END + BUT_ONLY + LAF CLAB_write INT_VAR max_level STR_VAR clab END +END + +DEFINE_PATCH_FUNCTION CLAB_remove_ability // return a string which is the resources at given level, minus the spell listed. (Limitations of WEIDU mean we have to stick it in manually) + INT_VAR level=1 + STR_VAR spell="" + RET string +BEGIN + LPF deabbreviate_spellname STR_VAR input="%spell%" RET spell=spellname END + PATCH_IF "%spell%" STRING_EQUAL_CASE "all" BEGIN + SPRINT string "" + END ELSE BEGIN + PATCH_IF VARIABLE_IS_SET "%spell%" BEGIN + SPRINT spell EVALUATE_BUFFER "%%spell%%" + END + SPRINT string $abil("%level%") + INNER_PATCH_SAVE string "%string%" BEGIN + REPLACE_TEXTUALLY CASE_INSENSITIVE "\(GA\|AP\)_%spell%" "" + END + END +END + +DEFINE_PATCH_FUNCTION CLAB_add_ability // return a string which is the resources at given level, plus the specified ability. (Limitations of WEIDU mean we have to stick it in manually) + INT_VAR level=1 + STR_VAR spell="" + type="" + RET string +BEGIN + LPF deabbreviate_spellname STR_VAR input="%spell%" RET spell=spellname END + PATCH_IF VARIABLE_IS_SET "%spell%" BEGIN + SPRINT spell EVALUATE_BUFFER "%%spell%%" + END + SPRINT string $abil("%level%") + PATCH_MATCH "%type%" WITH + apply_power BEGIN + SPRINT string "%string% AP_%spell%" + END + grant_power BEGIN + SPRINT string "%string% GA_%spell%" + END + DEFAULT PATCH_FAIL "shouldn't happen (CLAB)" END +END + +DEFINE_DIMORPHIC_FUNCTION find_clab // find the CLAB file for a particular kit + STR_VAR kit="" + RET clab +BEGIN + LAF standardize_kit STR_VAR arguments="%kit%" RET kit=value END + // handle mismatches between class.ids and kitlist.ids + ACTION_MATCH "%kit%" WITH + "GOD.*" BEGIN + OUTER_PATCH_SAVE kit "%kit%" BEGIN + DELETE_BYTES 0x0 3 + END + END + "MAGESCHOOL_GENERALIST" BEGIN + OUTER_SPRINT kit MAGE + END + "MAGESCHOOL_.*" BEGIN + OUTER_PATCH_SAVE kit "%kit%" BEGIN + DELETE_BYTES 0x0 11 + END + END + DEFAULT + END + OUTER_SPRINT clab unknown_clab + COPY_EXISTING kitlist.2da "%workspace%" + READ_2DA_ENTRIES_NOW kitlist_data 6 + FOR (i=0;iFI01 + RANGER=>RN01 + PALADIN=>PA01 + MONK=>MO01 + CLERIC=>PR01 + PRIEST=>PR01 + DRUID=>DR01 + MAGE=> MA01 + SORCEROR=>MA01 + SORCERER=>MA01 + SHAMAN=>SH01 + THIEF=>TH01 + BARD=>BA01 + END + ACTION_IF VARIABLE_IS_SET $class_clab("%kit%") BEGIN + OUTER_SPRINT clab EVALUATE_BUFFER "CLAB%class_clab_%kit%%" + END ELSE BEGIN + LAF warning STR_VAR warning="Cannot find clab file for kit %kit%" END + END + END +END + +DEFINE_ACTION_FUNCTION CLAB_write // create the CLAB file (wipes existing one, all data - hopefully - already imported) + INT_VAR max_level=0 + STR_VAR clab="" +BEGIN +<<<<<<<< .../stratagems-inline/clab_template.2da +2DA V1.0 +**** +>>>>>>>> + COPY ".../stratagems-inline/clab_template.2da" "override/%clab%.2da" + OUTER_SPRINT topline " " + OUTER_FOR (level=1;level<=max_level;level+=1) BEGIN + LAF prettify_clab_entry STR_VAR entry="%level%" RET level_new=entry_new END + OUTER_SPRINT topline "%topline% %level_new%" + END + APPEND "%clab%.2da" "%topline%" + OUTER_SET done=0 + OUTER_SET rowcount=0 + OUTER_WHILE !done BEGIN + OUTER_SET done=1 + OUTER_SET rowcount +=1 + OUTER_SPRINT row "ABILITY%rowcount% " + + OUTER_FOR (level=1;level<=max_level;level+=1) BEGIN + OUTER_SPRINT temp $abil("%level%") + ACTION_IF "%temp%" STRING_MATCHES_REGEXP " *$" BEGIN + OUTER_SET done=0 + LAF return_first_entry STR_VAR list="%temp%" RET entry=entry temp=list END + OUTER_SPRINT $abil("%level%") "%temp%" + LAF prettify_clab_entry STR_VAR entry RET entry=entry_new END + OUTER_SPRINT row "%row% %entry%" + END ELSE BEGIN + OUTER_SPRINT row "%row% **** " + END + ACTION_IF !done BEGIN + + END + END + ACTION_IF !done BEGIN + APPEND "%clab%.2da" "%row%" + END + END +END + +DEFINE_ACTION_FUNCTION prettify_clab_entry + STR_VAR entry="" + RET entry_new +BEGIN + OUTER_PATCH_SAVE entry_new " " BEGIN + WRITE_ASCII 0x0 "%entry%" + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///// Multiclass clab editor +///// (Intended basically to be called from within edit_kit) +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION edit_clab_mc + INT_VAR kit_id=0 + STR_VAR kit="" + parent_class="" + primary_class="" + editstring="" +BEGIN + + + // set the prefix names for the various master applicators + ACTION_CLEAR_ARRAY clab_mc_map + ACTION_DEFINE_ASSOCIATIVE_ARRAY clab_mc_map BEGIN + fighter=>dwmkf + cleric=>dwmkc + mage=>dwmkm + thief=>dwmkt + ranger=>dwmkr + druid=>dwmkd + END + // initialise, if we haven't already + LAF edit_clab_mc_initialise END + + // find the non-primary class + + OUTER_PATCH_SAVE other_class "%parent_class%" BEGIN + REPLACE_TEXTUALLY "%primary_class%" "" + REPLACE_TEXTUALLY "_" "" + END + ACTION_MATCH "%other_class%" WITH + FIGHTER THIEF CLERIC MAGE RANGER DRUID + BEGIN + END + DEFAULT + OUTER_SPRINT other_class "NULL" + END + + // get the actual hex value of the kit ID + + LAF read_table_entry STR_VAR file="kitlist.2da" row="%kit_id%" column=KITIDS RET kit_id_real=value END + + // get the splprot entry + + LAF resolve_splprot_entry INT_VAR stat=152 value="-1" STR_VAR relation=equal RET stat_ind_equal=value END + LAF resolve_splprot_entry INT_VAR stat=152 value="-1" STR_VAR relation=not_equal RET stat_ind_notequal=value END + + + // find and set up the delete spell if appropriate + + ACTION_IF !FILE_EXISTS "%data_loc_shared%/dw_mc_deletes.txt" BEGIN + COPY ".../stratagems-inline/blank" "%data_loc_shared%/dw_mc_deletes.txt" + END + + OUTER_SPRINT delete_file "NULL" + ACTION_IF "%other_class%" STRING_COMPARE_CASE null BEGIN + COPY "%data_loc_shared%/dw_mc_deletes.txt" "%workspace%" + SPRINT delete_file "null" + REPLACE_EVALUATE "%kit% +%other_class% +\([a-z0-9]+\)" BEGIN + SPRINT delete_file "%MATCH1%" + END + "" + BUT_ONLY + ACTION_IF "%delete_file%" STRING_EQUAL_CASE null BEGIN + OUTER_SET counter=1 + OUTER_WHILE counter<1000 BEGIN + ACTION_IF counter>99 BEGIN + OUTER_SPRINT delete_file "dwkdl%counter%" + END ELSE + ACTION_IF counter>9 BEGIN + OUTER_SPRINT delete_file "dwkdl0%counter%" + END ELSE BEGIN + OUTER_SPRINT delete_file "dwkdl00%counter%" + END + ACTION_IF FILE_EXISTS_IN_GAME "%delete_file%.spl" BEGIN + OUTER_SET counter+=1 + END ELSE BEGIN + OUTER_SET counter=1000 + END + END + APPEND_OUTER "%data_loc_shared%/dw_mc_deletes.txt" "%kit% %other_class% %delete_file%%WNL%" + LAF ds_resolve_stat STR_VAR id="ORIGINAL_CLASS_%primary_class%" RET stat_ind_primary=stat_ind END + ACTION_CLEAR_ARRAY patch_data + ACTION_DEFINE_ASSOCIATIVE_ARRAY patch_data BEGIN + add_basic_ability=>null + add_effect_inline=>"opcode=>318 target=>2 timing=>0 duration=>1 parameter1=>%stat_ind_primary% parameter2=>111 resource=>%delete_file%" + END + + LAF make_spell STR_VAR spell="%delete_file%" edits=patch_data END + + ACTION_TO_LOWER other_class + OUTER_SPRINT other_prefix $clab_mc_map("%other_class%") + COPY_EXISTING "%other_prefix%01.spl" override + LPF ADD_SPELL_EFFECT INT_VAR opcode=326 target=2 timing=1 parameter1=kit_id_real parameter2=stat_ind_equal STR_VAR resource="%delete_file%" END + BUT_ONLY + LAF edit_clab STR_VAR kit="%other_class%" editstring="apply_power=>~%delete_file% 1~" END + + END + END + + // parse the instructions + OUTER_WHILE "%editstring%" STRING_COMPARE "" BEGIN + // get command-argument pair + LAF return_first_pair STR_VAR list="%editstring%" RET command=key argument=value editstring=list END + // parse the argument + OUTER_PATCH "%argument%" BEGIN + REPLACE_EVALUATE "^ *\([^ ]+\) \([0-9 ]*\)" BEGIN + SPRINT spell "%MATCH1%" + END + "%MATCH2%" + REPLACE_EVALUATE "\([0-9]+\) +\([0-9]+\) +\([0-9]+\)" BEGIN + start="%MATCH1%" + iterate="%MATCH2%" + end="%MATCH3%" + END + "" + REPLACE_EVALUATE "\([0-9]+\) +\([0-9]+\)" BEGIN + start="%MATCH1%" + iterate="%MATCH2%" + end=50 + END + "" + REPLACE_EVALUATE "\([0-9]+\)" BEGIN + start="%MATCH1%" + iterate=999 + end=start + END + "" + END + + + + ACTION_MATCH "%command%" WITH + apply_power BEGIN + // 'apply' is the default, 'grant' is converted into an apply + ACTION_IF "%delete_file%" STRING_COMPARE_CASE "NULL" BEGIN + COPY_EXISTING "%delete_file%.spl" override + LPF ADD_SPELL_EFFECT INT_VAR opcode=321 target=2 timing=1 STR_VAR resource="%spell%" END + BUT_ONLY + END + END + grant_power BEGIN + ACTION_IF "%delete_file%" STRING_COMPARE_CASE "NULL" BEGIN + COPY_EXISTING "%delete_file%.spl" override + LPF ADD_SPELL_EFFECT INT_VAR opcode=172 target=2 timing=1 STR_VAR resource="%spell%" END + BUT_ONLY + END + LAF resolve_kit_spell_applicator STR_VAR spell RET applicator END + OUTER_SPRINT spell "%applicator%" + END + DEFAULT + FAIL "unrecognised command %command% in edit_kit_mc" + END + + // now apply the spell + ACTION_TO_LOWER primary_class + OUTER_SPRINT prefix $clab_mc_map("%primary_class%") + OUTER_FOR (index=start;index<=end;index+=iterate) BEGIN + ACTION_IF index<10 BEGIN + OUTER_SPRINT master_spell "%prefix%0%index%" + END ELSE BEGIN + OUTER_SPRINT master_spell "%prefix%%index%" + END + ACTION_IF FILE_EXISTS_IN_GAME "%master_spell%.spl" BEGIN + COPY_EXISTING "%master_spell%.spl" override + LPF ADD_SPELL_EFFECT INT_VAR opcode=326 target=2 timing=1 parameter1=kit_id_real parameter2=stat_ind_equal STR_VAR resource="%spell%" END + BUT_ONLY + END + END + END +END + +DEFINE_ACTION_FUNCTION resolve_kit_spell_applicator STR_VAR spell="null" RET applicator BEGIN + + OUTER_SPRINT applicator "null" + // sanity check + ACTION_IF "%spell%" STRING_EQUAL "null" BEGIN + FAIL "no argument given for 'spell' in 'resolve_kit_spell_applicator'" + END + // create log file if it doesn't exist + ACTION_IF !FILE_EXISTS "%data_loc_shared%/dw_mc_applicators.txt" BEGIN + COPY ".../stratagems-inline/blank" "%data_loc_shared%/dw_mc_applicators.txt" + END + + // check log file + COPY "%data_loc_shared%/dw_mc_applicators.txt" "%workspace%" + SPRINT delete_file "null" + REPLACE_EVALUATE "%spell% +\(dwka[0-9]+\)" BEGIN + SPRINT applicator "%MATCH1%" + END + "" + BUT_ONLY + // if there isn't an applicator, build one and log it + ACTION_IF "%applicator%" STRING_EQUAL_CASE "null" BEGIN + // first, find a name + OUTER_SET index=1 + OUTER_SET success=0 + OUTER_WHILE index<1000 && !success BEGIN + ACTION_IF index<10 BEGIN + OUTER_SPRINT applicator "dwka00%index%" + END ELSE + ACTION_IF index<100 BEGIN + OUTER_SPRINT applicator "dwka0%index%" + END ELSE BEGIN + OUTER_SPRINT applicator "dwka%index%" + END + ACTION_IF !FILE_EXISTS_IN_GAME "%applicator%.spl" BEGIN + OUTER_SET success=1 + END ELSE BEGIN + OUTER_SET index +=1 + END + END + ACTION_IF !success BEGIN + FAIL "More than 999 applicators in edit_clab_mc; SFO can't handle this" + END + + // make the applicator + + ACTION_CLEAR_ARRAY patch_data + ACTION_DEFINE_ASSOCIATIVE_ARRAY patch_data BEGIN + add_basic_ability=>null + add_effect_inline=>"opcode=>171 target=>2 timing=>1 resource=>%spell%" + END + LAF make_spell STR_VAR spell="%applicator%" edits=patch_data END + + // log it + + APPEND_OUTER "%data_loc_shared%/dw_mc_applicators.txt" "%spell% %applicator%" + + + END + +END + + +DEFINE_ACTION_FUNCTION edit_clab_mc_initialise BEGIN + + ACTION_DEFINE_ASSOCIATIVE_ARRAY trueclass_clab BEGIN + fighter=>clabfi01 + mage=>clabma01 + cleric=>clabpr01 + druid=>clabdr01 + thief=>clabth01 + ranger=>clabrn01 + END + + LAF check_label STR_VAR label="dw#edit_clab_mc_initialised" RET value END + ACTION_IF !value BEGIN + LAF make_label STR_VAR label="dw#edit_clab_mc_initialised" END + ACTION_PHP_EACH clab_mc_map AS parent_class=>prefix BEGIN + LAF make_spell STR_VAR spell="%prefix%01" editstring="add_basic_ability=>null" END + OUTER_SPRINT clab $trueclass_clab("%parent_class%") + COPY_EXISTING "%clab%.2da" override + COUNT_2DA_COLS colcount + COUNT_2DA_ROWS colcount rowcount + rownumber=rowcount+1 + SPRINT row "ABILITY%rownumber% " + FOR (col=1;col99 BEGIN + OUTER_SPRINT delete_file "dwkdl%counter%" + END ELSE + ACTION_IF counter>9 BEGIN + OUTER_SPRINT delete_file "dwkdl0%counter%" + END ELSE BEGIN + OUTER_SPRINT delete_file "dwkdl00%counter%" + END + ACTION_IF FILE_EXISTS_IN_GAME "%delete_file%.spl" BEGIN + OUTER_SET counter+=1 + END ELSE BEGIN + OUTER_SET counter=1000 + END + END + APPEND_OUTER "%data_loc_shared%/dw_mc_deletes.txt" "%kit% %other_class% %delete_file%%WNL%" + LAF ds_resolve_stat STR_VAR id="ORIGINAL_CLASS_%primary_class%" RET stat_ind_primary=stat_ind END + ACTION_CLEAR_ARRAY patch_data + ACTION_DEFINE_ASSOCIATIVE_ARRAY patch_data BEGIN + add_basic_ability=>null + add_effect_inline=>"opcode=>318 target=>2 timing=>0 duration=>1 parameter1=>%stat_ind_primary% parameter2=>111 resource=>%delete_file%" + add_effect_inline'=>"opcode=>318 target=>2 timing=>0 duration=>1 resource=>%delete_file% parameter1=>%kit_id_real% parameter2=>%stat_ind_notequal%" + END + + LAF make_spell STR_VAR spell="%delete_file%" edits=patch_data END + LAF edit_clab STR_VAR kit="%other_class%" editstring="apply_power=>~%delete_file% 1~" END + + END + END + + + // find the base name for wrap spells + + LAF ensure_hex STR_VAR in="%kit_id%" RET kit_id_hex=out END + OUTER_PATCH_SAVE kit_id_hex "%kit_id_hex%" BEGIN + REPLACE_TEXTUALLY "0x" "" + END + OUTER_SPRINT wrap_prefix "DWMK%kit_id_hex%" // 6 characters or less + + // parse the editstring, building wraps for each spell as appropriate + + OUTER_SPRINT list "%editstring%" // the input + OUTER_SPRINT editstring "" // the string we're going to pass to edit_clab + OUTER_WHILE "%list%" STRING_COMPARE "" BEGIN + // get command-argument pair + LAF return_first_pair STR_VAR list RET command=key argument=value list END + // find a wrap name + LAF find_unused_wrap_name STR_VAR wrap_prefix RET wrap END + // extract the spell being applied/granted; swap it for the wrap + OUTER_PATCH_SAVE argument "%argument%" BEGIN + REPLACE_EVALUATE "^\([^ ]+\)" BEGIN + SPRINT core_spell "%MATCH1%" + END + "%wrap%" + END + // build the wrap + ACTION_CLEAR_ARRAY patch_data + ACTION_IF "%command%" STRING_EQUAL_CASE grant_power BEGIN + ACTION_DEFINE_ASSOCIATIVE_ARRAY patch_data BEGIN + add_basic_ability=>null + add_effect_inline=>"opcode=>171 target=>2 timing=>1 resource=>%core_spell%" + add_effect_inline'=>"opcode=>318 target=>2 timing=>0 duration=>1 resource=>%wrap% parameter1=>%kit_id_real% parameter2=>%stat_ind_notequal%" + END + ACTION_IF "%delete_file%" STRING_COMPARE_CASE "NULL" BEGIN + COPY_EXISTING "%delete_file%.spl" override + LPF ADD_SPELL_EFFECT INT_VAR opcode=172 target=2 timing=1 STR_VAR resource="%core_spell%" END + BUT_ONLY + END + END ELSE BEGIN + ACTION_DEFINE_ASSOCIATIVE_ARRAY patch_data BEGIN + add_basic_ability=>null + add_effect_inline'=>"opcode=>326 target=>2 timing=>0 duration=>1 resource=>%core_spell% parameter1=>%kit_id_real% parameter2=>%stat_ind_equal%" + END + ACTION_IF "%delete_file%" STRING_COMPARE_CASE "NULL" BEGIN + COPY_EXISTING "%delete_file%.spl" override + LPF ADD_SPELL_EFFECT INT_VAR opcode=321 target=2 timing=1 STR_VAR resource="%core_spell%" END + BUT_ONLY + END + END + LAF make_spell STR_VAR spell="%wrap%" edits=patch_data END + // add to the command string + OUTER_SPRINT editstring "%editstring% apply_power=>~%argument%~" + END + // apply to the CLAB + + LAF edit_clab STR_VAR kit="%primary_class%" editstring END + +END + +DEFINE_ACTION_FUNCTION find_unused_wrap_name INT_VAR to_try=1 STR_VAR wrap_prefix="" RET wrap BEGIN + + ACTION_IF to_try<10 BEGIN + OUTER_SPRINT wrap "%wrap_prefix%0%to_try%" + END ELSE BEGIN + OUTER_SPRINT wrap "%wrap_prefix%%to_try%" + END + ACTION_IF FILE_EXISTS_IN_GAME "%wrap%.spl" BEGIN + OUTER_SET to_try=to_try+1 + LAF find_unused_wrap_name INT_VAR to_try STR_VAR wrap_prefix RET wrap END + END + +END + +*/ + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///// General HLA editor +///// (Intended basically to be called from within edit_kit) +///// +///// Syntax: grant|apply_hla => file list +///// remove_hla => file list +///// restrict_hla => key=> value list +///// +///// where the most general restrict_hla command is +///// hla=>file [required] +///// min_level=>int +///// max_level=>int +///// num_allowed=>int +///// prerequisite|excluded_by=>file [must already be in the lua] +///// alignment_restrict|exclude_alignment => good|evil +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION edit_lua + INT_VAR at_top=0 + STR_VAR + kit="" + lua="" + editstring="" +BEGIN + ACTION_IF "%lua%" STRING_EQUAL "" BEGIN + LAF resolve_lua STR_VAR kit RET lua END + END + // if it doesn't exist, make it + ACTION_IF !FILE_EXISTS_IN_GAME "%lua%.2da" BEGIN +<<<<<<<< .../stratagems-inline/lua_template.2da + 2DA V1.0 +* + ABILITY ICON STRREF MIN_LEV MAX_LEVEL NUM_ALLOWED PREREQUISITE EXCLUDED_BY ALIGNMENT_RESTRICT +>>>>>>>> + COPY ".../stratagems-inline/lua_template.2da" "override/%lua%.2da" + END + COPY_EXISTING "%lua%.2da" override + // parametrise file + COUNT_2DA_COLS colcount + COUNT_2DA_ROWS colcount rowcount + // read in the list of powers + SET number_of_powers=0 + FOR (i=0;iFI + RANGER=>RN + PALADIN=>PA + MONK=>MO + CLERIC=>PR + DRUID=>DR + MAGE=> MA + SORCEROR=>SO + SORCERER=>SO + SHAMAN=>SH + THIEF=>TH + BARD=>BA + END + ACTION_TO_UPPER parent_class + OUTER_SPRINT file_ext $class_clab("%parent_class%") + ACTION_IF try_next<10 BEGIN + OUTER_SPRINT file_to_try "CLAB%file_ext%0%try_next%" + END ELSE BEGIN + OUTER_SPRINT file_to_try "CLAB%file_ext%%try_next%" + END + + ACTION_IF !FILE_EXISTS_IN_GAME "%file_to_try%.2da" BEGIN + OUTER_SPRINT clab "%file_to_try%" + ACTION_IF clone BEGIN + ACTION_IF "%file_ext%" STRING_EQUAL_CASE SO BEGIN + OUTER_SPRINT clab_template CLABMA01 + END ELSE BEGIN + OUTER_SPRINT clab_template "CLAB%file_ext%01" + END + COPY_EXISTING "%clab_template%.2da" "override/%clab%.2da" + REPLACE_TEXTUALLY "AP_DWMK[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z]" "****" + END + END ELSE BEGIN + LAF find_next_unused_clab INT_VAR clone try_next=try_next + 1 STR_VAR parent_class RET clab END + END +END + +DEFINE_ACTION_FUNCTION find_next_unused_lua + INT_VAR try_next=1 clone=0 + STR_VAR parent_class="" + RET lua +BEGIN + ACTION_CLEAR_ARRAY class_lua + ACTION_DEFINE_ASSOCIATIVE_ARRAY class_lua BEGIN + FIGHTER=>FI + MAGE=>MA + CLERIC=>CL + THIEF=>TH + BARD=>BA + PALADIN=>PA + DRUID=>DR + RANGER=>RA + MONK=>MO + SORCERER=>SO + SORCEROR=>SO + SHAMAN=>SH + FIGHTER_MAGE =>FM + FIGHTER_CLERIC =>FC + FIGHTER_THIEF =>FT + FIGHTER_MAGE_THIEF => FT + MAGE_THIEF => MT + CLERIC_MAGE => CM + CLERIC_THIEF => CT + FIGHTER_DRUID => FD + FIGHTER_MAGE_CLERIC => FC + CLERIC_RANGER => CR + END + ACTION_TO_UPPER parent_class + OUTER_SPRINT file_ext $class_lua("%parent_class%") + OUTER_SPRINT file_to_try "lu%file_ext%%try_next%" + ACTION_IF !FILE_EXISTS_IN_GAME "%file_to_try%.2da" BEGIN + OUTER_SPRINT lua "%file_to_try%" + ACTION_IF clone BEGIN + COPY_EXISTING "lu%file_ext%0.2da" "override/%lua%.2da" + END + END ELSE BEGIN + LAF find_next_unused_lua INT_VAR clone try_next=try_next+1 STR_VAR parent_class RET lua END + END + + +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///// Race editor +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION edit_race + STR_VAR editstring="" + edits="" + race="" +BEGIN + LAF standardize_race STR_VAR arguments="%race%" RET race=value END + // process edits + OUTER_WHILE "%editstring%" STRING_COMPARE "" BEGIN + LAF return_first_pair STR_VAR list="%editstring%" RET command=key arguments=value editstring=list END + LAF edit_race_parser STR_VAR race command arguments END + END + ACTION_PHP_EACH "%edits%" AS command=>arguments BEGIN + LAF edit_race_parser STR_VAR race command arguments END + END +END + +DEFINE_ACTION_FUNCTION edit_race_parser + STR_VAR command="" + arguments="" + race="" +BEGIN + ACTION_MATCH "%command%" WITH + "thac0_.*" BEGIN + ACTION_IF FILE_EXISTS_IN_GAME "racethac.2da" BEGIN + OUTER_PATCH_SAVE prof "%command%" BEGIN + REPLACE_TEXTUALLY "thac0_" "" + END + LAF write_table_entry INT_VAR do_not_insert=1 lookup_column=1 STR_VAR row="%prof%" column="%race%" arguments file="racethac" END + END ELSE BEGIN + LAF warning STR_VAR warning="Racial attack bonuses can only be edited on the Enhanced Edition" END + END + END + hair skin BEGIN + ACTION_IF FILE_EXISTS_IN_GAME "racecolr.2da" BEGIN + LAF write_table_entry STR_VAR column="%race%" row="%command%" arguments file=racecolr END + END ELSE BEGIN + LAF warning STR_VAR warning="Racial starting colours can only be edited on the Enhanced Edition" END + END + END + set_name say_name BEGIN + ACTION_IF FILE_EXISTS_IN_GAME "racetext.2da" BEGIN + ACTION_IF "%command%" STRING_EQUAL_CASE "say_name" BEGIN + OUTER_SET mixed=RESOLVE_STR_REF ((AT arguments)) + ACTION_GET_STRREF mixed mixed_string + ACTION_TO_LOWER mixed_string + OUTER_SET lower=RESOLVE_STR_REF ("%mixed_string%") + END ELSE BEGIN + OUTER_SET mixed=RESOLVE_STR_REF ("%arguments%") + ACTION_TO_LOWER arguments + OUTER_SET lower=RESOLVE_STR_REF ("%arguments%") + END + LAF write_table_entry STR_VAR row="%race%" column=name file=racetext arguments="%lower%" END + LAF write_table_entry STR_VAR row="%race%" column=uppercase file=racetext arguments="%mixed%" END + END ELSE BEGIN + LAF warning STR_VAR warning="Racial names can only be (readily) edited on the Enhanced Edition or on ToBEx" END + END + END + "\(set\|say\)_description" BEGIN + ACTION_IF FILE_EXISTS_IN_GAME "racetext.2da" BEGIN + LAF return_first_entry STR_VAR list="%command%" separator="_" RET setorsay=entry END + ACTION_IF "%setorsay%" STRING_EQUAL_CASE set BEGIN + OUTER_SET strref=RESOLVE_STR_REF ("%arguments%") + END ELSE BEGIN + OUTER_SET strref=RESOLVE_STR_REF ((AT arguments)) + END + LAF write_table_entry STR_VAR row="%race%" column=descstr file=racetext arguments="%strref%" END + END ELSE BEGIN + LAF warning STR_VAR warning="Racial descriptions only be (readily) edited on the Enhanced Edition or on ToBEx" END + END + END + "\(set\|say\)_biography" BEGIN + ACTION_IF enhanced_edition BEGIN + LAF return_first_entry STR_VAR list="%command%" separator="_" RET setorsay=entry END + ACTION_IF "%setorsay%" STRING_EQUAL_CASE set BEGIN + OUTER_SET strref=RESOLVE_STR_REF ("%arguments%") + END ELSE BEGIN + OUTER_SET strref=RESOLVE_STR_REF ((AT arguments)) + END + LAF write_table_entry STR_VAR row="%race%" column=biography file=racetext arguments="%strref%" END + END ELSE BEGIN + LAF warning STR_VAR warning="Racial biographies only be edited on the Enhanced Edition" END + END + END + DEFAULT + FAIL "%command% is not a valid command for edit_race" + END +END + +/////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION get_parent_class + STR_VAR kit="" + RET class_id parent_class true_class +BEGIN + LAF read_table_entry INT_VAR lookup_column=1 dont_complain=1 STR_VAR row="%kit%" column=class file=kitlist RET class_id=value END + ACTION_IF class_id<0 BEGIN + OUTER_SET class_id= IDS_OF_SYMBOL (class "%kit%") + OUTER_SET true_class=1 + END ELSE BEGIN + OUTER_SET true_class=0 + END + OUTER_PATCH "" BEGIN + LOOKUP_IDS_SYMBOL_OF_INT parent_class class "%class_id%" + END +END + +/////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION make_luas_unique +BEGIN + + // get the data + COPY_EXISTING "luabbr.2da" "%workspace%" + OUTER_SPRINT read_array_location "%workspace%" + OUTER_SPRINT array_to_read "luabbr.2da" + OUTER_SPRINT array_name luabbr + LAM read_in_assoc_array + + // go through as a first pass, to see what's in use + ACTION_PHP_EACH luabbr AS kit=>lua BEGIN + ACTION_IF ("%kit%" STRING_COMPARE_CASE 2da) BEGIN + OUTER_SPRINT $in_luabbr("%lua%") "" + END + END + + // go through + ACTION_PHP_EACH luabbr AS kit=>lua BEGIN + ACTION_IF ("%kit%" STRING_COMPARE_CASE 2da) BEGIN + ACTION_IF VARIABLE_IS_SET $in_use("%lua%") BEGIN + OUTER_PATCH "%lua%" BEGIN + READ_ASCII 0x0 prefix (2) + END + LAF make_luas_unique_helper STR_VAR prefix RET lua_new END + OUTER_SPRINT $luabbr("%kit%") "%lua_new%" + OUTER_SPRINT $in_use("%lua_new%") "" + OUTER_SPRINT $in_luabbr("%lua_new%") "" + COPY_EXISTING "lu%lua%.2da" "override/lu%lua_new%.2da" + END ELSE BEGIN + OUTER_SPRINT $in_use("%lua%") "" + END + END + END + // write out the updated luas + COPY_EXISTING luabbr.2da override + COUNT_2DA_ROWS 2 rowcount + FOR (i=0;inull BEGIN + OUTER_SPRINT remove_string "%remove_string% REMOVE_MEMORIZED_SPELL %spell%" + END + ACTION_PHP_EACH delete_these_spells AS spell=>null BEGIN + OUTER_SPRINT delete_string_core "%delete_string_core% %spell%" + END + ACTION_IF "%delete_string_core%" STRING_COMPARE "" BEGIN + OUTER_SPRINT delete_string ~ + PATCH_IF full_delete BEGIN + GET_OFFSET_ARRAY offset_array CRE_V10_EFFECTS + PHP_EACH offset_array AS ind=>fx_off BEGIN + READ_ASCII (fx_off + 0x88) parent + PATCH_MATCH "%parent%" WITH + %delete_string_core% BEGIN + WRITE_SHORT (fx_off+0x8) 999 + END + DEFAULT + END + END + LPF DELETE_CRE_EFFECT INT_VAR opcode_to_delete=999 END + END~ + END ELSE BEGIN + OUTER_SPRINT delete_string "" + END + OUTER_SPRINT add_string "" + OUTER_FOR (level=1;level<50;level+=1) BEGIN + ACTION_IF VARIABLE_IS_SET $add_level("%level%") BEGIN + OUTER_SPRINT add_this_level $add_level("%level%") + OUTER_SPRINT add_string "%add_string% PATCH_IF level>=%level% BEGIN %add_this_level% END" + END + END + APPEND_OUTER "%workspace%/kit_spell_build.tpa" "%kit_here% BEGIN + %remove_string% + %add_string% + %delete_string% +END " + ACTION_IF collect_apply BEGIN + OUTER_SET made_insertion=0 + OUTER_FOR (level=1;level<50;level+=1) BEGIN + ACTION_IF VARIABLE_IS_SET $apply_level("%level%") BEGIN + OUTER_SPRINT apply_this_level $apply_level("%level%") + ACTION_IF !made_insertion BEGIN + OUTER_SET made_insertion=1 + APPEND_OUTER "%workspace%/kit_collect_apply.txt" "" + APPEND_OUTER "%workspace%/kit_collect_apply.txt" "AP_ for kit %kit_here%" + APPEND_OUTER "%workspace%/kit_collect_apply.txt" "" + END + APPEND_OUTER "%workspace%/kit_collect_apply.txt" "Level %level%: %apply_this_level%" + END + END + END + END + END + APPEND_OUTER "%workspace%/kit_spell_build.tpa" "DEFAULT END" + APPEND_OUTER "%workspace%/kit_spell_build.tpa" "END" + END + INCLUDE "%workspace%/kit_spell_build.tpa" +END + +DEFINE_PATCH_FUNCTION kit_spell_exclude_func // things to be ignored entirely (not just skipped for reinstall) + STR_VAR spell="" + RET value +BEGIN + PATCH_MATCH "%spell%" WITH + "DWAU.*" "DW#AU.*" BEGIN + SET value=1 + END + DEFAULT + SET value=0 + END +END + + + + +DEFINE_PATCH_FUNCTION kit_hardcode BEGIN END // this is a placeholder, to be replaced by user-defined version (SCS's lives in lib/kit_hardcode.tpa) + + +///////////////////////////////////////////////////// +/// Wild Mage squats on the +/// core CLABs mages; +/// give them unique entries. +/// Also make sure every clab actually exists +///////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION make_clabs_unique BEGIN + LAF check_label STR_VAR label="dw#uniqueclab" RET value END + ACTION_IF !value BEGIN + LAF make_label STR_VAR label="dw#uniqueclab" END + // build unique template + OUTER_SPRINT row1 "" + OUTER_SPRINT row2 "ABILITY1" + OUTER_FOR (i=1;i<=40;i+=1) BEGIN + OUTER_SPRINT row1 "%row1% %i%" + OUTER_SPRINT row2 "%row2% ****" + END + +<<<<<<<<.../stratagems-inline/clab_template.2da +2DA V1.0 +**** +%row1% +%row2% +>>>>>>>> + // make sure each CLAB actually exists + COPY_EXISTING kitlist.2da override + COUNT_2DA_COLS colcount + COUNT_2DA_ROWS colcount rowcount + FOR (row=0;row max_level ? entry_here : max_level + END + END +END + +//////////////////////////////////////////////////////////////////////// +/// Lowercase a mixed-case string +///////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION kit_name_to_lower STR_VAR mixed_string="" RET lower_string BEGIN + + OUTER_PATCH_SAVE lower_string "%mixed_string%" BEGIN + REPLACE_TEXTUALLY "û" "U" + REPLACE_TEXTUALLY "Û" "U" + END + + ACTION_TO_LOWER lower_string + +END + +//////////////////////////////////////////////////////////////////////// +/// This table codes the vanilla BG2 class descriptions, indexed by +/// class ID +///////////////////////////////////////////////////////////////////////// + +ACTION_DEFINE_ASSOCIATIVE_ARRAY default_class_descriptions BEGIN + 2=>9556 // fighter + 12=>9557 // ranger + 6=>9558 // paladin + 3=>9559 // cleric + 11=>9560 // druid + 1 =>9563 // mage + 4=>9561 // thief + 5=>9562 // bard + 19=>45866 // sorcerer + 20=>45867 // monk + 7=>9574 // F/M + 8=>9573 // F/C + 9=>9572 // F/T + 10=>9576 // F/M/T + 13=>9575 // M/T + 14 =>9577 // C/M + 15 =>9578 // C/T + 16=>9579 // F/D + 17=>9581 // F/M/C + 18=>9580 // C/R +END + + +//////////////////////////////////////////////////////////////////////// +/// Make a kit selectable +///////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION make_kit_selectable INT_VAR human=0 dwarf=0 elf=0 half_elf=0 halfling=0 gnome=0 halforc=0 all_races=1 STR_VAR kit="" class="" BEGIN + COPY_EXISTING "kitlist.2da" override + COUNT_2DA_COLS colcount + READ_2DA_ENTRIES_NOW kitlist_data colcount + FOR (row=0;rowcolnum BEGIN + READ_2DA_ENTRY_FORMER kittable_data row colnum entry + SPRINT $"%colname%"("%rowname%") "%entry%" + END + END + BUT_ONLY + COPY_EXISTING "kittable.2da" override + OUTER_WHILE "%class%" STRING_COMPARE "" BEGIN + LAF return_first_entry STR_VAR list="%class%" RET this_class=entry class=list END + ACTION_PHP_EACH kittable_cols AS race=>null BEGIN + ACTION_IF "%%race%%"=1 || all_races=1 BEGIN + OUTER_SPRINT file $"%race%"("%this_class%") + LAF make_kit_selectable_core STR_VAR kit file END + END + END + END +END + +DEFINE_ACTION_FUNCTION make_kit_selectable_core STR_VAR kit="" file="" BEGIN + ACTION_IF "%kit%" STRING_COMPARE "" BEGIN + ACTION_CLEAR_ARRAY kits_here_arr + // get already-present kits + ACTION_IF FILE_EXISTS_IN_GAME "%file%.2da" BEGIN + COPY_EXISTING "%file%.2da" "%workspace%" + COUNT_2DA_ROWS 2 rowcount + FOR (row=0;rownull BEGIN + OUTER_SPRINT data "%data%%ind% %num%%WNL%" + OUTER_SET ++ind + END + COPY ".../stratagems-inline/k_x_y_template.2da" "override/%file%.2da" + EVALUATE_BUFFER + PRETTY_PRINT_2DA + + + END +END + +<<<<<<<< .../stratagems-inline/k_x_y_template.2da +2DA V1.0 +* + KIT +%data% +>>>>>>>> + +//////////////////////////////////////////////////////////////////////// + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// class labels need to be wrapped in a subspell to prevent the dual-class setup from inactivating them +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +DEFINE_ACTION_FUNCTION label_original_classes +BEGIN + ACTION_IF !VARIABLE_IS_SET blocking_opcode BEGIN + OUTER_SET blocking_opcode=318 + END + LAF check_label STR_VAR label=dw#original_classes_labelled RET value END + ACTION_IF !value BEGIN + LAF make_label STR_VAR label=dw#original_classes_labelled END + LAF resolve_splprot_entry INT_VAR stat=0x10d value="-1" STR_VAR relation=equal RET splprot_num=value END + + ACTION_CLEAR_ARRAY original_class_map + ACTION_DEFINE_ASSOCIATIVE_ARRAY original_class_map BEGIN + FIGHTER=>"dw#l2ocf" + CLERIC=>"dw#l2occ" + MAGE=>"dw#l2ocm" + DRUID=>"dw#lbocd" + RANGER=>"dw#lbocr" + THIEF=>"dw#lboct" + END + ACTION_PHP_EACH original_class_map AS class=>spell BEGIN + OUTER_SET id = IDS_OF_SYMBOL (class "%class%") + LAF ds_resolve_stat STR_VAR id="ORIGINAL_CLASS_%class%" RET stat_ind END + ACTION_CLEAR_ARRAY patch_data + ACTION_DEFINE_ASSOCIATIVE_ARRAY patch_data BEGIN + add_basic_ability=>null + add_effect_inline=>"opcode=>328 target=>2 mode=>1 timing=>1 parameter2=>%stat_ind%" + add_effect_inline'=>"opcode=>326 target=>2 timing=>1 resource=>dw#l2oco at_end=>1" + END + LAF make_spell STR_VAR spell="%spell%" edits=patch_data END + LAF edit_all_kits STR_VAR parent_class="%class%" editstring="apply_power=>~dw#lboco 1~" END + END + LAF ds_resolve_stat STR_VAR id="MULTI_CLASS" RET stat_ind END + ACTION_CLEAR_ARRAY patch_data + ACTION_DEFINE_ASSOCIATIVE_ARRAY patch_data BEGIN + add_basic_ability=>null + add_effect_inline=>"opcode=>328 target=>2 mode=>1 timing=>1 parameter2=>%stat_ind%" + add_effect_inline'=>"opcode=>326 target=>2 timing=>1 resource=>dw#l2oco at_end=>1" + END + LAF make_spell STR_VAR spell="dw#l2oc2" edits=patch_data END + + + ACTION_CLEAR_ARRAY patch_data + ACTION_DEFINE_ASSOCIATIVE_ARRAY patch_data BEGIN + add_basic_ability=>null + add_effect_inline'0=>"opcode=>318 target=>2 timing=>1 resource=>dw#l2ocf" + add_effect_inline'1=>"opcode=>318 target=>2 timing=>1 resource=>dw#l2occ" + add_effect_inline'2=>"opcode=>318 target=>2 timing=>1 resource=>dw#l2ocm" + add_effect_inline'3=>"opcode=>318 target=>2 timing=>1 resource=>dw#l2ocd" + add_effect_inline'4=>"opcode=>318 target=>2 timing=>1 resource=>dw#l2ocr" + add_effect_inline'5=>"opcode=>318 target=>2 timing=>1 resource=>dw#l2oct" + add_effect_inline'6=>"opcode=>318 target=>2 timing=>1 resource=>dw#l2oc2" + END + LAF make_spell STR_VAR spell=dw#l2oco edits=patch_data END + + ACTION_CLEAR_ARRAY patch_data + ACTION_DEFINE_ASSOCIATIVE_ARRAY patch_data BEGIN + add_basic_ability=>null + // add_effect_inline=>"opcode=>326 target=>2 timing=>1 resource=>dw#l2oco" + END + LAF make_spell STR_VAR spell=dw#lboco edits=patch_data END + COPY_EXISTING "dw#lboco.spl" override + PHP_EACH original_class_map AS class=>spell BEGIN + SET id= IDS_OF_SYMBOL (class "%class%") + LPF ADD_SPELL_EFFECT INT_VAR opcode=326 target=2 timing=1 parameter1=id parameter2=splprot_num STR_VAR resource="%spell%" END + END + PATCH_FOR_EACH multiclass IN FIGHTER_CLERIC FIGHTER_MAGE FIGHTER_THIEF CLERIC_MAGE CLERIC_THIEF MAGE_THIEF FIGHTER_DRUID CLERIC_RANGER BEGIN + SET id=IDS_OF_SYMBOL (class "%multiclass%") + LPF ADD_SPELL_EFFECT INT_VAR opcode=326 target=2 timing=1 parameter1=id parameter2=splprot_num STR_VAR resource="dw#l2oc2" END + END + BUT_ONLY + END +END + + +DEFINE_ACTION_FUNCTION fix_clab_bugs BEGIN + + LAF check_label STR_VAR label="dw#sfo_clab_bugs_fixed" RET value END + ACTION_IF !value BEGIN + LAF make_label STR_VAR label="dw#sfo_clab_bugs_fixed" END + + COPY_EXISTING "kitlist.2da" "%workspace%" + COUNT_2DA_COLS colcount + READ_2DA_ENTRIES_NOW kitlist_data colcount + FOR (col=1;colcount? count_max : count + END + END + "ABILITY%MATCH1%%MATCH2%" + + PHP_EACH count AS row=>val BEGIN + PATCH_IF val0 BEGIN + delta = delta - 1 + SPRINT this_row "%this_row% ****" + END + END + "ABILITY%MATCH1%%this_row%" + // tidy up + PRETTY_PRINT_2DA + BUT_ONLY +END + diff --git a/iwdification/sfo/filetype/lib_mos.tpa b/iwdification/sfo/filetype/lib_mos.tpa new file mode 100644 index 0000000..ff768fe --- /dev/null +++ b/iwdification/sfo/filetype/lib_mos.tpa @@ -0,0 +1,49 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Installer for v2 MOSs +///////////// +///////////// uses helper functions in lib_bam +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION install_v2_mos + INT_VAR lowest_mos_index=0 + STR_VAR mos_name="" + mos_loc="" + pvrz_loc="" +BEGIN + ACTION_IF "%pvrz_loc%" STRING_EQUAL "" BEGIN + OUTER_SPRINT pvrz_loc "%mos_loc%" + END + // get initial list of PVRZ indices + ACTION_CLEAR_ARRAY pvrz_ind_list + COPY "%mos_loc%/%mos_name%.mos" override + GET_OFFSET_ARRAY bam_array 0x14 4 0x10 4 0 0 0x1c + PHP_EACH bam_array AS ind=>offset BEGIN + READ_LONG offset ref + SPRINT $pvrz_ind_list("%ref%") "" + END + // end of COPY + // go through and sort out the PVRZs' new indices + OUTER_SET current=lowest_mos_index + ACTION_PHP_EACH pvrz_ind_list AS ind=>discard BEGIN + LAF get_available_mos_index INT_VAR current RET new_index=value END + LAF pad_to_four INT_VAR arguments=ind RET padded_old=value END + LAF pad_to_four INT_VAR arguments=new_index RET padded_new=value END + COPY "%pvrz_loc%/mos%padded_old%.pvrz" "override/mos%padded_new%.pvrz" + + OUTER_SET $pvrz_ind_list("%ind%")=new_index + OUTER_SET current=new_index+1 + END + // update the mos file + COPY_EXISTING "%mos_name%.mos" override + GET_OFFSET_ARRAY bam_array 0x14 4 0x10 4 0 0 0x1c + PHP_EACH bam_array AS ind=>offset BEGIN + READ_LONG offset ref + SET ref_new=$pvrz_ind_list("%ref%") + WRITE_LONG offset ref_new + END + + + +END \ No newline at end of file diff --git a/iwdification/sfo/filetype/lib_pro.tpa b/iwdification/sfo/filetype/lib_pro.tpa new file mode 100644 index 0000000..9ba9b83 --- /dev/null +++ b/iwdification/sfo/filetype/lib_pro.tpa @@ -0,0 +1,334 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// overarching clone +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION clone_pro // beware-this only works for one projectile at a time + INT_VAR allow_missing=0 + STR_VAR + pro="" + edits="" + editstring="" + RET pro_num + BEGIN + LAUNCH_ACTION_FUNCTION clone_template + INT_VAR allow_missing + STR_VAR file_list= ~%pro%~ + file_ext=~PRO~ + edits + editstring + END + LAF return_first_pair STR_VAR list= ~%pro%~ RET new=value END + OUTER_SPRINT input ~ADD_PROJECTILE "override/%new%.pro"~ + LAM action_reinclude_this + OUTER_SET pro_num= ~%%new%%~ +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// overarching edit +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION edit_pro + INT_VAR allow_missing=0 + STR_VAR + pro="" + edits="" + editstring="" + location="" + locabs="" + locbase="" + BEGIN + LAUNCH_ACTION_FUNCTION edit_template + INT_VAR allow_missing + STR_VAR file_list= ~%pro%~ + file_ext=~PRO~ + edits + editstring + location + locabs + locbase + END +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// overarching make +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION make_pro + STR_VAR + pro="" + edits="" + editstring="" + RET pro_num + BEGIN + OUTER_SET is_area=0 + OUTER_SPRINT list ~%editstring%~ + OUTER_WHILE ~%list%~ STRING_COMPARE ~~ BEGIN + LAF return_first_pair STR_VAR list RET key=key value=value list=list END + ACTION_IF (~%key%~ STRING_EQUAL_CASE is_area & ~%value%~ STRING_EQUAL_CASE yes) BEGIN OUTER_SET is_area=1 END + END + ACTION_IF ( ~%%edits%_is_area%~ STRING_EQUAL_CASE yes) BEGIN OUTER_SET is_area=1 END + ACTION_IF is_area BEGIN + OUTER_SPRINT build_before PRO_build_area + END ELSE BEGIN + OUTER_SPRINT build_before PRO_build_before + END + LAUNCH_ACTION_FUNCTION make_template + STR_VAR file_list= ~%pro%~ + file_ext=~PRO~ + edits + editstring + build_before + build_after = PRO_postbuild + END + OUTER_SPRINT input ~ADD_PROJECTILE "%location%/%pro%.pro"~ + LAM action_reinclude_this + OUTER_SET pro_num= ~%%pro%%~ +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// offsets [none] +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// simple data-field edits +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +ACTION_DEFINE_ASSOCIATIVE_ARRAY pro_fields BEGIN + type => ~0x8, SHORT~ + speed => ~0xa,SHORT~ + travel_wav => ~0x10,ASCII~ + arrive_wav => ~0x18,ASCII~ + travel_wav0 => ~0x10,ASCII~ // this renaming facilitates IWD-in-BG2 + arrive_wav0 => ~0x18,ASCII~ + travel_vvc => ~0x20,ASCII~ + spark_color_num=>~0x28,SHORT~ + travel_anim => ~0x104,ASCII~ + shadow_anim => ~0x10c,ASCII~ + travel_anim0 => ~0x104,ASCII~ + shadow_anim0 => ~0x10c,ASCII~ + pro_seq_num => ~0x114,BYTE~ + shadow_seq_num => ~0x115,BYTE~ + light_intensity => ~0x116,SHORT~ + light_width => ~0x118,SHORT~ + light_height => ~0x11a,SHORT~ + palette => ~0x11c,ASCII~ + color_1 => ~0x124,BYTE~ + color_2 => ~0x125,BYTE~ + color_3 => ~0x126,BYTE~ + color_4 => ~0x127,BYTE~ + color_5 => ~0x128,BYTE~ + color_6 => ~0x129,BYTE~ + color_7 => ~0x12a,BYTE~ + smoke_color_1 => ~0x124,BYTE~ + smoke_color_2 => ~0x125,BYTE~ + smoke_color_3 => ~0x126,BYTE~ + smoke_color_4 => ~0x127,BYTE~ + smoke_color_5 => ~0x128,BYTE~ + smoke_color_6 => ~0x129,BYTE~ + smoke_color_7 => ~0x12a,BYTE~ + facing => ~0x133,BYTE~ + smoke_anim=>~0x134,SHORT~ + trail_anim_1=>~0x136,ASCII~ + trail_anim_2=>~0x13e,ASCII~ + trail_anim_3=>~0x146,ASCII~ + trail_anim_10=>~0x136,ASCII~ + trail_anim_20=>~0x13e,ASCII~ + trail_anim_30=>~0x146,ASCII~ + trail_1_seq_num=>~0x14e,ASCII~ + trail_2_seq_num=>~0x150,ASCII~ + trail_3_seq_num=>~0x152,ASCII~ + trigger_radius=>~0x204,SHORT~ + basic_aoe_radius => ~0x206,SHORT~ + trigger_wav => ~0x208,ASCII~ + trigger_wav0 => ~0x208,ASCII~ + explosion_frequency => ~0x210,SHORT~ + fragment_anim => ~0x212,SHORT~ + secondary_pro => ~0x214,SHORT~ + repetitions=>~0x216,BYTE~ + explosion_anim => ~0x217,BYTE~ + explosion_color=>~0x218,BYTE~ + target_anim=>~0x21a,SHORT~ + explosion_pro=> ~0x21a,SHORT~ + explosion_anim_vvc=>~0x21c,ASCII~ + ring_anim=>~0x230,ASCII~ + cone_angle=>~0x224,SHORT~ + animation_granularity=>~0x248,SHORT~ + animation_granularity_divider=>~0x24a,SHORT~ +END + +LAUNCH_ACTION_FUNCTION build_simple_data_field_editors STR_VAR lookup_table=pro_fields function_prefix=PRO END + + +ACTION_DEFINE_ASSOCIATIVE_ARRAY pro_bit_fields BEGIN + show_sparkle=>~0xc,0~ + sparkle_z_coord=>~0xc,1~ + loop_travel_sound=>~0xc,2~ + loop_arrive_sound=>~0xc,3~ + sparkle_no_direct_target=>~0xc,4~ + draw_below=>~0xc,5~ + use_palette=>~0x100,0~ + enable_smoke=>~0x100,1~ + use_area_lighting=>~0x100,3~ + use_area_height=>~0x100,4~ + enable_shadow=>~0x100,5~ + enable_light_spot=>~0x100,6~ + enable_brighten=>~0x100,7~ + low_brighten=>~0x101,0~ + high_brighten=>~0x101,1~ + keep_pro_visible=>~0x200,0~ + triggered_by_inanimate=>~0x200,1~ + triggered_on_condition=>~0x200,2~ + trigger_in_delay=>~0x200,3~ + use_secondary=>~0x200,4~ + use_fragment=>~0x200,5~ + target_flag_1=>~0x200,6~ + only_enemies=>~0x200,6~ + target_flag_2=>~0x200,7~ + num_is_mage_level=>~0x201,0~ + num_is_priest_level=>~0x201,1~ + use_vvc=>~0x201,2~ + is_cone=>~0x201,3~ + go_through_walls=>~0x201,4~ + delay_explosion=>~0x201,6~ + only_one_target=>~0x201,7~ + random_speed=>~0x240,1~ +END + +LAF build_flag_data_field_editors STR_VAR lookup_table=pro_bit_fields function_prefix=PRO END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// custom edits +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION PRO_aoe_radius + STR_VAR arguments="" +BEGIN + LPF PRO_trigger_radius STR_VAR arguments END + LPF PRO_basic_aoe_radius STR_VAR arguments END +END + +DEFINE_PATCH_FUNCTION PRO_add_explosion_vvc + STR_VAR arguments="" +BEGIN + LPF PRO_use_vvc STR_VAR arguments=1 END + LPF PRO_explosion_anim_vvc STR_VAR arguments END +END + +DEFINE_PATCH_FUNCTION PRO_is_area BEGIN END // a dummy function used for indicating to the make() program that this is an area-effect projectile + +DEFINE_PATCH_FUNCTION PRO_target STR_VAR arguments="" BEGIN + TO_LOWER arguments + PATCH_MATCH ~%arguments%~ WITH + ally allies BEGIN + LPF PRO_target_flag_1 STR_VAR arguments=1 END + LPF PRO_target_flag_2 STR_VAR arguments=1 END + END + enemy enemies BEGIN + LPF PRO_target_flag_1 STR_VAR arguments=1 END + LPF PRO_target_flag_2 STR_VAR arguments=0 END + END + all BEGIN + LPF PRO_target_flag_1 STR_VAR arguments=0 END + LPF PRO_target_flag_2 STR_VAR arguments=0 END + END + DEFAULT + LPF warning STR_VAR warning=~"%arguments% is an invalid argument for PRO_target~ END + END +END + +DEFINE_PATCH_FUNCTION PRO_spark_color STR_VAR arguments="" BEGIN + DEFINE_ASSOCIATIVE_ARRAY colmap BEGIN + black=>1 + blue=>2 + chromatic=>3 + gold=>4 + green=>5 + purple=>6 + red=>7 + white=>8 + ice=>9 + stone=>10 + magenta=>11 + orange=>12 + END + PATCH_IF VARIABLE_IS_SET ~colmap_%arguments%~ BEGIN + SET num= ~colmap_%arguments%~ + LPF PRO_spark_color_num STR_VAR arguments= ~%num%~ END + END ELSE BEGIN + LPF warning STR_VAR warning=~"%arguments% is an invalid argument for PRO_spark_color~ END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// builder +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION PRO_build_before BEGIN + INSERT_BYTES 0x000 0x200 + WRITE_ASCII 0x000 ~PRO V1.0~ + LPF PRO_speed STR_VAR arguments=60 END + LPF PRO_type STR_VAR arguments=2 END +END + +DEFINE_PATCH_FUNCTION PRO_postbuild BEGIN END + +DEFINE_PATCH_FUNCTION PRO_add_aoe BEGIN + INSERT_BYTES 0x200 0x100 +END + +DEFINE_PATCH_FUNCTION PRO_build_area BEGIN + LPF PRO_build_before END + LPF PRO_add_aoe END + LPF PRO_type STR_VAR arguments=3 END + LPF PRO_explosion_anim STR_VAR arguments=~-1~ END + LPF PRO_target_anim STR_VAR arguments=79 END + LPF PRO_repetitions STR_VAR arguments=1 END + LPF PRO_explosion_frequency STR_VAR arguments=100 END +END + +DEFINE_ACTION_FUNCTION resolve_projectile + STR_VAR projectile="" + RET value +BEGIN + COPY_EXISTING "projectl.ids" override + ind="-1" + COUNT_2DA_ROWS 2 rowcount + FOR (i=0;i %newname%" + END ELSE BEGIN + OUTER_SPRINT newname "%spell%" + END + LAUNCH_ACTION_FUNCTION install_template + INT_VAR allow_missing silent + STR_VAR file_list=~%spell%~ + file_ext=~SPL~ + edits + editstring + destination + location + locbase + locabs + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// overarching regexp +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION edit_all_spells + STR_VAR + edits="" + editstring="" + BEGIN + LAUNCH_ACTION_FUNCTION regexp_template + STR_VAR file_ext=~SPL~ + edits= ~%edits%~ + editstring= ~%editstring%~ + + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// overarching make +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION make_spell + INT_VAR level=1 + type=0 + STR_VAR + spell="" + idsname="" + edits="" + editstring="" + RET newname + BEGIN + ACTION_IF "%idsname%" STRING_COMPARE "" BEGIN + LAF add_spell_to_ids INT_VAR level type STR_VAR idsname filename="%spell%" file_loc RET newname=newname END + OUTER_SPRINT spell "%newname%" + END ELSE BEGIN + OUTER_SPRINT newname "%spell%" + END + ACTION_IF "%spell%" STRING_EQUAL_CASE "" BEGIN + FAIL ~make_spell needs either an IDS name ("idsname") or a file name ("spell")~ + END + + LAUNCH_ACTION_FUNCTION make_template + STR_VAR file_list=~%spell%~ + file_ext=~SPL~ + edits + editstring + build_before= SPL_build + build_after = SPL_postbuild + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// offsets +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +<<<<<<<< spell_offsets.2da +TYPE offset_loc offset_length entrynum_loc entrynum_length entry_length +ability 0x64 4 0x68 2 0x28 +effect 0x6a 4 -1 2 0x30 +>>>>>>>> +OUTER_SPRINT ~offset_readin_lookup_2da~ ~spell_offsets~ +OUTER_SPRINT ~offset_readin_file_ext~ ~SPL~ +LAUNCH_ACTION_MACRO read_in_offsets + +OUTER_SPRINT $SPL_virtual_type_parent(effect) ability +OUTER_SPRINT $SPL_virtual_type_child(effect) effect +OUTER_SET $SPL_virtual_type_index("effect")=0 +OUTER_SET $lookup_SPL_ability_effect_ind_loc(0)=0x20 +OUTER_SET $lookup_SPL_ability_effect_ind_length(0)=2 +OUTER_SET $lookup_SPL_ability_effect_num_loc(0)=0x1e +OUTER_SET $lookup_SPL_ability_effect_num_length(0)=2 + + +OUTER_SPRINT has_secondaries_SPL_ability "" + + +OUTER_SPRINT $SPL_effect_secondaries_follow(ability) effect_global + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// simple data-field edits +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +ACTION_DEFINE_ASSOCIATIVE_ARRAY spell_fields BEGIN + name1_string => ~0x8,LONG~ + name2_string => ~0xc,LONG~ + casting_sound => ~0x10,ASCII~ + flags=>~0x18,LONG~ + spell_type_num => ~0x1c,SHORT~ + priest_type => ~0x20,SHORT~ + casting_animation => ~0x22,BYTE~ + primary => ~0x25,SHORT~ + school_code => ~0x25,SHORT~ + secondary => ~0x27,BYTE~ + level => ~0x34,LONG~ + icon => ~0x3a,ASCII~ + description1_string => ~0x50,LONG~ + description2_string => ~0x54,LONG~ + num_abils=> ~0x68,SHORT~ +END + +LAUNCH_ACTION_FUNCTION build_simple_data_field_editors STR_VAR lookup_table=spell_fields function_prefix=SPL END + +ACTION_DEFINE_ASSOCIATIVE_ARRAY spell_ability_fields BEGIN + ability_type => ~0x0,BYTE~ + ability_icon_loc => ~0x2,SHORT~ + ability_icon => ~0x4,ASCII~ + ability_range => ~0xe,SHORT~ + ability_target => ~0xc,BYTE~ + ability_min_level =>~0x10,SHORT~ + ability_damage_type => ~0x1c,SHORT~ + ability_dicesize => ~0x16,SHORT~ + ability_charges=>~0x22,SHORT~ + ability_unknown_late => ~0x24,SHORT~ + projectile => ~0x26,SHORT~ + effect_number => ~0x1e,SHORT~ + casting_time=>~0x12,SHORT~ +END + +LAUNCH_ACTION_FUNCTION build_simple_data_field_editors STR_VAR offset_base=yes lookup_table=spell_ability_fields function_prefix=SPL END + + +ACTION_DEFINE_ASSOCIATIVE_ARRAY eff_fields BEGIN + opcode=>~0,SHORT~ + target=>~0x2,BYTE~ + power=>~0x3,BYTE~ + parameter1=>~0x4,LONG~ + parameter2=>~0x8,LONG~ + parameter2a=>~0x8,SHORT~ + parameter2b=>~0xa,SHORT~ + timing=>~0xc,BYTE~ + resist_dispel=>~0xd,BYTE~ + dispel=>~0xd,BYTE~ + duration=>~0xe,LONG~ + probability1=>~0x12,BYTE~ + probability2=>~0x13,BYTE~ + resource=>~0x14,ASCII~ + dicenum=> ~0x1c,LONG~ + dicesize=> ~0x20,LONG~ + savebonus=> ~0x28,LONG~ + mode=> ~0x2c,LONG~ +END + +LAUNCH_ACTION_FUNCTION build_simple_data_field_editors STR_VAR lookup_table=eff_fields offset_base=yes function_prefix=SPL secondary="yes" END + +ACTION_DEFINE_ASSOCIATIVE_ARRAY spl_bit_fields BEGIN + breaks_sanctuary=>~0x19,1~ + breaks_invisibility=>~0x19,2~ + hostile=>~0x19,2~ + no_LOS=>~0x19,3~ + outdoors_only=>~0x19,5~ + not_magical=>~0x19,6~ + contingency=>~0x19,7~ + not_wild_dead=>~0x19,6~ + not_wild_surge=>~0x19,7~ + not_in_combat=>~0x1a,0~ + bypass_II=>~0x1b,0~ + castable_when_silenced=>~0x1b,1~ + unusable_chaotic_priest=>~0x1e,0~ + unusable_evil_priest=>~0x1e,1~ + unusable_good_priest=>~0x1e,2~ + unusable_GEneutral_priest=>~0x1e,3~ + unusable_lawful_priest=>~0x1e,4~ + unusable_LCneutral_priest=>~0x1e,5~ + unusable_abjurer=>~0x1e,6~ + unusable_conjurer=>~0x1e,7~ + unusable_diviner=>~0x1f,0~ + unusable_enchanter=>~0x1f,1~ + unusable_illusionist=>~0x1f,2~ + unusable_invoker=>~0x1f,3~ + unusable_necromancer=>~0x1f,4~ + unusable_transmuter=>~0x1f,5~ + unusable_generalist=>~0x1f,6~ + unusable_cleric=>~0x21,6~ + unusable_druid=>~0x21,7~ +END + +LAF build_flag_data_field_editors STR_VAR lookup_table=spl_bit_fields function_prefix=SPL END + + + +ACTION_DEFINE_ASSOCIATIVE_ARRAY eff_bit_fields BEGIN + save_vs_spell => ~0x24,0~ + save_vs_spells => ~0x24,0~ + save_vs_breath => ~0x24,1~ + save_vs_death => ~0x24,2~ + save_vs_poison => ~0x24,2~ + save_vs_wands => ~0x24,3~ + save_vs_petrification => ~0x24,4~ + save_vs_polymorph => ~0x24,4~ + ignore_primary_target => ~0x25,2~ + ignore_secondary_target => ~0x25,3~ + bypass_mirror_image => ~0x27,0~ + ignore_difficulty => ~0x27,1~ + does_not_wake_sleeper => ~0x2d,2~ + save_for_half=>~0x2d,0~ + drain_hp_to_caster=>~0x2c,0~ +END + +LAF build_flag_data_field_editors STR_VAR lookup_table=eff_bit_fields offset_base=yes function_prefix=SPL secondary="yes" END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// get the type in the form "wizard" "innate" "priest" "special" "unknown" +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION SPL_read_spell_type +RET value +BEGIN + LPF SPL_read_spell_type_num RET num=value END + PATCH_MATCH "%num%" WITH + 1 BEGIN + SPRINT value wizard + END + 2 BEGIN + SPRINT value priest + END + 4 BEGIN + SPRINT value innate + END + 0 BEGIN + SPRINT value special + END + DEFAULT + SPRINT value unknown + END +END + +DEFINE_PATCH_FUNCTION SPL_spell_type +STR_VAR arguments="" +BEGIN + TO_LOWER arguments + PATCH_MATCH "%arguments%" WITH + 1 wizard BEGIN + SET number=1 + END + 2 cleric priest BEGIN + SET number=2 + END + 4 innate BEGIN + SET number=4 + END + 0 special BEGIN + SET number=0 + END + DEFAULT + LPF warning STR_VAR warning="Spell type %arguments% is unrecognised; defaulting to 4 (innate)" END + SET number=4 + END + LPF SPL_spell_type_num STR_VAR arguments="%number%" END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// set a spell's schoolname +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +DEFINE_PATCH_FUNCTION SPL_read_school + RET value +BEGIN + LPF SPL_read_school_code RET num=value END + PATCH_MATCH "%num%" WITH + 1 BEGIN + SPRINT value abjuration + END + 8 BEGIN + SPRINT value alteration + END + 2 BEGIN + SPRINT value conjuration + END + 3 BEGIN + SPRINT value divination + END + 4 BEGIN + SPRINT value enchantment + END + 5 BEGIN + SPRINT value illusion + END + 6 BEGIN + SPRINT value invocation + END + 7 BEGIN + SPRINT value necromancy + END + DEFAULT + SPRINT value generalist + END +END + + + +DEFINE_PATCH_FUNCTION SPL_school + STR_VAR arguments="" +BEGIN + TO_LOWER arguments + PATCH_MATCH "%arguments%" WITH + abjuration 1 BEGIN + SET out=1 + END + alteration 8 BEGIN + SET out=8 + END + conjuration 2 BEGIN + SET out=2 + END + divination 3 BEGIN + SET out=3 + END + enchantment 4 BEGIN + SET out=4 + END + illusion 5 BEGIN + SET out=5 + END + invocation evocation 6 BEGIN + SET out=6 + END + necromancy 7 BEGIN + SET out=7 + END + DEFAULT + SET out=9 + END + LPF SPL_school_code STR_VAR arguments="%out%" END +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// set a spell's school & associated details +///////////// - sets Primary, casting animation +//////////// - for wizard spells, sets exclusion flags +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION SPL_enforce_school + STR_VAR arguments="" +BEGIN + PATCH_IF is_iwd BEGIN + LPF SPL_enforce_school_iwd STR_VAR arguments END + END ELSE BEGIN + LPF SPL_enforce_school_bg2 STR_VAR arguments END + END +END + +DEFINE_PATCH_FUNCTION SPL_enforce_school_bg2 + STR_VAR arguments="" +BEGIN + INNER_ACTION BEGIN + <<<<<<<< spell_school_data + school_name casting_animation casting_sound exclude + abjuration 12 cas_m02 transmuter + alteration 10 cas_m08 abjurer + conjuration 14 cas_m03 diviner + divination 16 cas_m04 conjurer + enchantment 11 cas_m05 invoker + illusion 13 cas_m01 necromancer + invocation 15 cas_m06 enchanter + necromancy 9 cas_m07 illusionist + >>>>>>>> + COPY - spell_school_data "%workspace%" + COUNT_2DA_COLS colcount + READ_2DA_ENTRIES_NOW spell_school_data colcount + END + PATCH_IF "%arguments%" STRING_EQUAL_CASE "" BEGIN + LPF SPL_read_school RET arguments=value END + END + FOR (i=1;i>>>>>>> + COPY - spell_school_data "%workspace%" + COUNT_2DA_COLS colcount + READ_2DA_ENTRIES_NOW spell_school_data colcount + END + PATCH_IF "%arguments%" STRING_EQUAL_CASE "" BEGIN + LPF SPL_read_school RET arguments=value END + END + FOR (i=1;i0 and not an animation +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION SPL_duration_if_variable + STR_VAR arguments="" +BEGIN + LPF SPL_read_opcode RET opcode=value END + PATCH_MATCH "%opcode%" WITH + 215 BEGIN + + END + DEFAULT + LPF SPL_read_duration RET value END + PATCH_IF value>0 BEGIN + LPF SPL_duration STR_VAR arguments END + END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Find the true level at which an ability block is being applied (the first level is usually set to level=1) +///////////// +///////////// Algorithm: if ability_min_level>1, ability_true_level=ability_min_level +///////////// +///////////// Otherwise, get the spell's level and caster type & work out the lowest level at which it's castable +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION SPL_read_ability_true_level + RET value +BEGIN + LPF SPL_read_ability_min_level RET min_level=value END + PATCH_IF min_level>1 BEGIN + SET value=min_level + END ELSE BEGIN + LPF SPL_read_level RET spell_level=value END + PATCH_IF spell_level<=5 BEGIN + SET value = 2 * spell_level - 1 + END ELSE BEGIN + LPF SPL_read_spell_type RET type=value END + PATCH_IF type=2 BEGIN // priest + SET value= spell_level=6 ? 11 : 2*spell_level + END ELSE BEGIN + SET value= 2*spell_level + END + END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// find a spell's actual name from an abbreviated one (i.e., one without the CLERIC_ or WIZARD_ +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION deabbreviate_spellname + STR_VAR input="" + RET spellname +BEGIN + TO_UPPER input + SPRINT spellname ~%input%~ + PATCH_IF VARIABLE_IS_SET ~%%spellname%%~ BEGIN + END ELSE + PATCH_IF VARIABLE_IS_SET ~%percentage%WIZARD_%spellname%%percentage%~ AND VARIABLE_IS_SET ~%percentage%CLERIC_%spellname%%percentage%~ BEGIN + // PATCH_PRINT ~Spell %spellname% is ambiguous between WIZARD_%spellname% and CLERIC_%spellname%; assuming WIZARD~ + SPRINT ~spellname~ ~WIZARD_%spellname%~ + END ELSE + PATCH_IF VARIABLE_IS_SET ~%percentage%WIZARD_%spellname%%percentage%~ BEGIN + SPRINT ~spellname~ ~WIZARD_%spellname%~ + END ELSE + PATCH_IF VARIABLE_IS_SET ~%percentage%CLERIC_%spellname%%percentage%~ BEGIN + SPRINT ~spellname~ ~CLERIC_%spellname%~ + END ELSE BEGIN // assume it's a bare name + //PATCH_PRINT ~Warning: cannot identify spell %spellname%~ + END +END + +DEFINE_ACTION_FUNCTION deabbreviate_spellname + STR_VAR input="" + RET spellname +BEGIN + OUTER_PATCH "" BEGIN + LPF deabbreviate_spellname STR_VAR input RET spellname END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// find a spell's code from a possibly-abbreviated name (or return the code if given it) +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION get_spellcode STR_VAR input="" RET value +BEGIN + LPF deabbreviate_spellname STR_VAR input RET spellname=spellname END + PATCH_IF VARIABLE_IS_SET "%spellname%" BEGIN // first, see if the variable is set + SPRINT value EVALUATE_BUFFER ~%%spellname%%~ + END ELSE + PATCH_IF IDS_OF_SYMBOL (spell "%spellname%")>=0 BEGIN // then, try spell.ids + SET idscode=IDS_OF_SYMBOL (spell "%spellname%") + LPF idscode_to_spell INT_VAR idscode RET value=resref END + END ELSE BEGIN // otherwise, just return the input + SPRINT value "%input%" + END +END + +DEFINE_ACTION_FUNCTION get_spellcode STR_VAR input="" RET value +BEGIN + OUTER_INNER_PATCH ~~ BEGIN + LPF get_spellcode STR_VAR input RET value=value END + END +END +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// find a spell's IDS code (the 4-digit code in the IDS file) from a spell name +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION spell_to_idscode + STR_VAR resref="" + RET idscode +BEGIN + OUTER_INNER_PATCH_SAVE idscode "%resref%" BEGIN + REPLACE_TEXTUALLY CASE_INSENSITIVE sppr 1 + REPLACE_TEXTUALLY CASE_INSENSITIVE spwi 2 + REPLACE_TEXTUALLY CASE_INSENSITIVE spin 3 + REPLACE_TEXTUALLY CASE_INSENSITIVE spcl 4 + END +END + +DEFINE_PATCH_FUNCTION spell_to_idscode + STR_VAR resref="" + RET idscode +BEGIN + INNER_ACTION BEGIN + LAF spell_to_idscode STR_VAR resref RET idscode=idscode END + END +END +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// find a spell's name from its idscode +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION idscode_to_spell + INT_VAR idscode=0 + RET resref +BEGIN + OUTER_INNER_PATCH_SAVE resref "%idscode%" BEGIN + READ_ASCII 0x0 digit (1) + PATCH_MATCH "%digit%" WITH + 1 BEGIN + SPRINT prefix sppr + END + 2 BEGIN + SPRINT prefix spwi + END + 3 BEGIN + SPRINT prefix spin + END + 4 BEGIN + SPRINT prefix spcl + END + DEFAULT + LPF warning STR_VAR warning ="idscode_to_spell called with illegal argument" END + END + + INSERT_BYTES 0x0 3 + WRITE_ASCIIE 0x0 "%prefix%" (4) + END +END + +DEFINE_PATCH_FUNCTION idscode_to_spell + INT_VAR idscode=0 + RET resref +BEGIN + INNER_ACTION BEGIN + LAF idscode_to_spell INT_VAR idscode RET resref=resref END + END +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// make a prebuffed spell +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +DEFINE_ACTION_FUNCTION ~build_prebuff_spell~ + INT_VAR conceal=0 + STR_VAR spell_ID="" + RET newcode fullname +BEGIN + OUTER_SPRINT newcode UNALLOCATED + OUTER_SPRINT fullname UNALLOCATED + ACTION_IF !VARIABLE_IS_SET ~%%spell_ID%_PREBUFF%~ BEGIN + OUTER_INNER_PATCH ~~ BEGIN + LPF deabbreviate_spellname STR_VAR input = ~%spell_ID%~ RET spell_ID=spellname END + END + OUTER_SPRINT fullname ~%spell_ID%~ + OUTER_SPRINT ~spellcode~ EVALUATE_BUFFER ~%%spell_ID%%~ + ACTION_IF FILE_EXISTS_IN_GAME "%spellcode%.spl" BEGIN + OUTER_INNER_PATCH_SAVE ~newcode~ ~%spellcode%~ BEGIN + REPLACE_TEXTUALLY CASE_INSENSITIVE ~SPWI~ ~dwsw~ + REPLACE_TEXTUALLY CASE_INSENSITIVE ~SPPR~ ~dwsp~ + REPLACE_TEXTUALLY CASE_INSENSITIVE ~SPIN~ ~dwsi~ + REPLACE_TEXTUALLY CASE_INSENSITIVE ~SPCL~ ~dwsc~ + END + ACTION_IF !FILE_EXISTS_IN_GAME ~%newcode%.spl~ BEGIN + COPY_EXISTING ~%spellcode%.spl~ ~override/%newcode%.spl~ + LPF check_ini STR_VAR ini=Conceal_Prebuff_Spell_Names RET value END + PATCH_IF (value=1 || conceal=1) BEGIN + WRITE_LONG 0x8 ~-1~ + END ELSE BEGIN + READ_STRREF 0x8 ~spellname~ + SPRINT ~addon~ "%SFO_reserved_previously_string%" + SPRINT ~newname~ ~%spellname%~^ ~%addon%~ + SAY_EVALUATED 0x8 ~%newname%~ + END + PATCH_MATCH "%spell_ID%" WITH + CLERIC_BLADE_BARRIER CLERIC_GLOBE_OF_BLADES CLERIC_AURA_OF_FLAMING_DEATH WIZARD_FIRE_SHIELD_RED WIZARD_FIRE_SHIELD_BLUE NPC_BLADE_BARRIER CLERIC_CIRCLE_OF_BONES WIZARD_MESTILS_ACID_SHEATH + BEGIN + LPF DELETE_SPELL_EFFECT INT_VAR opcode_to_delete=174 END + // LPF delete_entry STR_VAR type=effect arguments="opcode=174" file_ext=SPL END + END + DEFAULT + LPF DELETE_SPELL_EFFECT INT_VAR opcode_to_delete=139 END + LPF DELETE_SPELL_EFFECT INT_VAR opcode_to_delete=174 END + LPF DELETE_SPELL_EFFECT INT_VAR opcode_to_delete=141 END + LPF DELETE_SPELL_EFFECT INT_VAR opcode_to_delete=215 END + LPF DELETE_SPELL_EFFECT INT_VAR opcode_to_delete=50 END + + // LPF delete_entry STR_VAR type=effect arguments="opcode is_in [139 174 215 141 50]" file_ext=SPL END + END + // BUT_ONLY - should happen anyway + END + END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// make a zero-casting-time spell +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +DEFINE_ACTION_FUNCTION ~build_instant_spell~ + STR_VAR spell_ID="" + RET newcode spellcode fullname +BEGIN + OUTER_INNER_PATCH ~~ BEGIN + LPF deabbreviate_spellname STR_VAR input = ~%spell_ID%~ RET spell_ID=spellname END + END + OUTER_SPRINT fullname ~%spell_ID%~ + OUTER_SPRINT ~spellcode~ EVALUATE_BUFFER ~%%spell_ID%%~ + OUTER_INNER_PATCH_SAVE ~newcode~ ~%spellcode%~ BEGIN + REPLACE_TEXTUALLY CASE_INSENSITIVE ~SPWI~ ~dw#0w~ + REPLACE_TEXTUALLY CASE_INSENSITIVE ~SPPR~ ~dw#0p~ + REPLACE_TEXTUALLY CASE_INSENSITIVE ~SPIN~ ~dw#0i~ + END + ACTION_IF !FILE_EXISTS_IN_GAME ~%newcode%.spl~ BEGIN + LAF clone_spell STR_VAR spell= ~%spellcode%=>%newcode%~ editstring=~patch_ability_inline=>"casting_time=>0"~ END + END +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// build a basic spell +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION SPL_build BEGIN + ///// basic structure + DELETE_BYTES 0x0 BUFFER_LENGTH + INSERT_BYTES 0x0 0x72 + + // sig + WRITE_ASCII 0x0 ~SPL V1 ~ + // name + WRITE_LONG 0x8 ~-1~ + WRITE_LONG 0xc ~-1~ + // spell type - default to INNATE + WRITE_SHORT 0x1c 4 + // primary + WRITE_SHORT 0x25 9 + // level + WRITE_LONG 0x34 1 + // unknown + WRITE_SHORT 0x38 1 + // description + WRITE_LONG 0x50 ~-1~ + WRITE_LONG 0x54 ~-1~ + //offsets + WRITE_LONG 0x64 0x72 + WRITE_LONG 0x6a 0x72 +END + +DEFINE_PATCH_FUNCTION SPL_postbuild +BEGIN +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// delete a list of opcodes +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +DEFINE_PATCH_FUNCTION SPL_delete_opcodes + STR_VAR arguments="" +BEGIN + PATCH_IF ~%arguments%~ STRING_COMPARE_CASE ~~ BEGIN + LPF return_first_entry STR_VAR list= ~%arguments%~ RET entry=entry arguments=list END + LPF delete_entry STR_VAR type=effect arguments="opcode=%entry%" file_ext=SPL END + LPF SPL_delete_opcodes STR_VAR arguments END + END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("SPL_delete_opcodes") "" + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// append the description +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION SPL_append_description + STR_VAR arguments="" +BEGIN + LPF patch_text_entry INT_VAR loc=0x50 STR_VAR function=append_string_nospace arguments= ~%arguments%~ END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("SPL_append_description") "" + +DEFINE_PATCH_FUNCTION SPL_append_description_newline + STR_VAR arguments="" +BEGIN + LPF patch_text_entry INT_VAR loc=0x50 STR_VAR function=append_string_nospace arguments= ~%WNL%%WNL%%arguments%~ END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("SPL_append_description_newline") "" + + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// substitute the description +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION SPL_substitute_description + STR_VAR arguments="" +BEGIN + LPF patch_text_entry INT_VAR loc=0x50 STR_VAR function=substitute_string arguments= ~%arguments%~ END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("SPL_substitute_description") "" + +DEFINE_PATCH_FUNCTION SPL_substitute_description_strref + STR_VAR arguments="" +BEGIN + READ_LONG 0x50 tlk_entry + LPF substitute_tlk_entry INT_VAR tlk_entry STR_VAR arguments END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("SPL_substitute_description_strref") "" + +DEFINE_PATCH_FUNCTION SPL_substitute_description_exact + STR_VAR arguments="" +BEGIN + LPF patch_text_entry INT_VAR loc=0x50 STR_VAR function=substitute_string_exact arguments= ~%arguments%~ END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("SPL_substitute_description_exact") "" + +DEFINE_PATCH_FUNCTION SPL_substitute_description_exact_strref + STR_VAR arguments="" +BEGIN + READ_LONG 0x50 tlk_entry + LPF substitute_tlk_entry INT_VAR exact=1 tlk_entry STR_VAR arguments END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("SPL_substitute_description_exact_strref") "" + +DEFINE_PATCH_FUNCTION SPL_substitute_description_function + STR_VAR arguments="" +BEGIN + READ_STRREF 0x50 desc + INNER_PATCH_SAVE desc "%desc%" BEGIN + LPF "%arguments%" END + END + SAY 0x50 "%desc%" +END +OUTER_SPRINT $SFO_do_not_parse_arguments("SPL_substitute_description_function") "" + + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// set the description +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION SPL_set_description + STR_VAR arguments="" +BEGIN + LPF patch_text_entry INT_VAR loc=0x50 STR_VAR function=set_string arguments= ~%arguments%~ END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("SPL_set_description") "" + + +DEFINE_PATCH_FUNCTION SPL_say_description + STR_VAR arguments="" +BEGIN + WRITE_LONG 0x50 RESOLVE_STR_REF ((AT arguments)) +END + +DEFINE_PATCH_FUNCTION SPL_say_description_strref + STR_VAR arguments="" +BEGIN + READ_LONG 0x50 strref + INNER_ACTION BEGIN + STRING_SET_EVALUATE strref (AT %arguments%) + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// get the name +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +DEFINE_PATCH_FUNCTION SPL_name + RET value +BEGIN + READ_STRREF 0x8 value +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// get the description +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION SPL_description + RET value +BEGIN + READ_STRREF 0x50 value +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// set the name +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION SPL_set_name + STR_VAR arguments="" +BEGIN + LPF patch_text_entry INT_VAR loc=0x8 STR_VAR function=set_string arguments= ~%arguments%~ END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("SPL_set_name") "" + + +DEFINE_PATCH_FUNCTION SPL_say_name + STR_VAR arguments="" +BEGIN + WRITE_LONG 0x8 RESOLVE_STR_REF ((AT arguments)) +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// add a basic ability +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION SPL_add_basic_ability + STR_VAR arguments="" +BEGIN + PATCH_MATCH ~%arguments%~ WITH + spell SPELL BEGIN + SET locnum=2 + END + DEFAULT + SET locnum=4 + END + PATCH_CLEAR_ARRAY ability_data + PATCH_DEFINE_ASSOCIATIVE_ARRAY ability_data BEGIN // these are based on the +hp BGT spells + type=>ability + ability_type=> 1 //type:melee + ability_icon_loc=>~%locnum%~ //location:innate + ability_target=>1 // target: living actor + ability_damage_type=> 1// damage type:piercing + ability_dicesize=> 6 // dice size: 6 + ability_charges => 1 + projectile =>1 + END + LPF add_entry STR_VAR arguments=ability_data file_ext=SPL END +END +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Take the first effect block of the spell and remove all subsequent blocks +///////////// Specify a function f:N->N, iter_func (put in "arguments"). Until iter_func returns -1, clone the whole +///////////// effect block, setting the level to iter_func of whatever you set it to previously, or 1 at start +///////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION level_based_blocks // no SPL prefix: "level_based_blocks isn't allowed to evaluate its argument, so it has to be called out specially" + STR_VAR arguments="" filename="" file_ext="" +BEGIN + SPRINT iter_func "%arguments%" // just for readability + // get the first ability as a template + SET ab_off=LONG_AT 0x64 + READ_ASCII ab_off ab_template (0x28) + // find the size of the whole effect block, and get it as a template + SET block_size= SHORT_AT (0x1e + ab_off) + SET eff_ind = SHORT_AT (0x20 + ab_off) + SET eff_off = LONG_AT 0x6a + READ_ASCII (eff_off + 0x30 * eff_ind) eff_template (0x30 * block_size) + // count how many (non-baseline) effects there are + SPRINT entry_type ability + SPRINT file_ext SPL + LPM get_offset_array + SET effcount=0 + PHP_EACH offset_array AS int=>offset BEGIN + SET effcount += SHORT_AT (0x1e + offset) + END + // wipe all extended effects + DELETE_BYTES (eff_off + 0x30 * eff_ind) (0x30 * effcount) + // wipe all abilities + SET ab_num=SHORT_AT 0x68 + DELETE_BYTES ab_off (0x28 * ab_num) + SET ab_num=0 + SET eff_off=0x72 + WRITE_SHORT 0x68 0 // we don't have to do this, but for debugging it's convenient if the file is wellformed at this stage + WRITE_SHORT 0x6a eff_off + // ok, at this point we're initialised, with an ability-free spell and our templates + + SET level=1 + SET sanity_check=0 // guard against poorly designed iter_func + WHILE level>=0 & sanity_check < 100 BEGIN + // add the ability + SET offset_base=ab_off + 0x28 * ab_num + SET ab_num +=1 + INSERT_BYTES offset_base 0x28 + SET eff_off += 0x28 + WRITE_ASCIIE offset_base "%ab_template%" + // set its parameters + WRITE_SHORT (offset_base + 0x10) level + WRITE_SHORT (offset_base + 0x20) eff_ind + // add the effect block + SET offset_base=eff_off + 0x30*eff_ind + INSERT_BYTES offset_base (0x30 * block_size) + WRITE_ASCIIE offset_base "%eff_template%" + SET eff_ind += block_size + SET sanity_check +=1 + LPF evaluate_expression STR_VAR filename file_ext=SPL expression="%iter_func%" arguments="%level%" RET level=value END + END + + // iter_func has terminated, update ab_num and eff_off + + WRITE_SHORT 0x68 ab_num + WRITE_LONG 0x6a eff_off + + // report if the sanity check fired + + PATCH_IF sanity_check=100 BEGIN + LPF warning STR_VAR warning="You called level_based_blocks on an iterator %iter_func% that didn't terminate (spell %filename%)" END + END +END + +////////////////////////////////////////////////////////////////////////// +//// Add spell to ids file (without copying it over), finding it a slot +//// starting (optionally) from at least to_try; return its new name and code, +//// and the next available slot. +//// +//// If it's already there in the right category and level, +//// just return the existing result (and log a warning). +//// +//// If it's there but in the wrong category and/or level, delete it first +//// +//// +////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION add_spell_to_ids + INT_VAR to_try=0 + level="-1" + type=0 + STR_VAR typename="unspecified" + filename="" + idsname="" + file_loc="" + RET newname + newcode + to_try_next + +BEGIN + LAF find_spell_type INT_VAR type STR_VAR typename filename idsname file_loc RET type END + ACTION_IF type<=2 BEGIN + LAF find_spell_level INT_VAR level STR_VAR filename file_loc RET level END + END + OUTER_SET current_num=IDS_OF_SYMBOL (spell "%idsname%") + ACTION_IF current_num<0 BEGIN + LAF find_spell_ids_slot INT_VAR to_try type level STR_VAR idsname RET newcode=slot to_try_next=to_try_next END + LAF idscode_to_spell INT_VAR idscode=newcode RET newname=resref END + APPEND spell.ids "%newcode% %idsname%" + CLEAR_IDS_MAP + END ELSE BEGIN + OUTER_SET current_type = current_num / 1000 + OUTER_SET current_level = (current_num - 1000 * current_type) / 100 + ACTION_IF (type=current_type) && ((level=current_level)||type>2) BEGIN + OUTER_SET to_try_next=current_num + OUTER_SET newcode=current_num + LAF idscode_to_spell INT_VAR idscode=newcode RET newname=resref END + LAF warning STR_VAR warning="No need to add spell %idsname% to spell.ids as it is already there at the right level" END + END ELSE BEGIN + COPY_EXISTING "spell.ids" override + REPLACE_TEXTUALLY "%current_num% +%idsname%" "%current_num% %idsname%_OLD" + BUT_ONLY + LAF warning STR_VAR warning="Deprecating older version of %idsname%" END + CLEAR_IDS_MAP + LAF add_spell_to_ids INT_VAR to_try level STR_VAR typename filename idsname file_loc RET newname newcode to_try_next END + END + END +END + +////////////////////////////////////////////////////////// +//// Find a slot for a new spell in spell.ids +//// +//// Takes as input the desired spell name, the type of +//// spell to add (1=cleric, 2=wizard, 3=innate, 4=class), the level, and +//// optionally the lowest-value code worth trying first. +//// +//// Returns the slot along with the lowest-value code worth trying next +//// for a spell of the same type. (Relevant for multiple insertions, e.g. +//// in IWD-in-BG2.) +//// +//// We read the spell codes into the array $idscode +//// (so that $idscode(IDS_ENTRY) returns the code of that entry) +//// and the set of in-use idscodes into $ids_in_use +//// (so that $ids_in_use(code) is set iff code is already assigned). +//// The macro read_in_spells_in_use will load both automatically; the +//// function calls it if it is not already defined, but it can be +//// loaded in in advance for quicker use +/////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION find_spell_ids_slot + INT_VAR to_try=0 + type=3 + level=0 + STR_VAR idsname="" + RET slot to_try_next +BEGIN + // read in spell data if not already known + ACTION_IF !VARIABLE_IS_SET spells_in_use_read_in BEGIN + LAM read_in_spells_in_use + END + OUTER_SPRINT temp $idscode(WIZARD_MAGIC_MISSILE) + // does it exist already? If so, we're done + ACTION_IF VARIABLE_IS_SET $idscode( "%idsname%") BEGIN + OUTER_SET slot=$idscode("%idsname%") + OUTER_SET to_try_next=to_try + END ELSE BEGIN + // what is the minimum code? + ACTION_MATCH "%type%" WITH + 1 2 BEGIN + OUTER_SET minimum=1000 * type + 100 * level + 1 + END + DEFAULT + OUTER_SET minimum=1000 * type + 101 + END + ACTION_IF minimum>to_try BEGIN // is the current code too low? If so, increase to the minimum and try again + LAF find_spell_ids_slot INT_VAR type level to_try=minimum STR_VAR idsname RET slot=slot to_try_next=to_try_next END + END ELSE BEGIN + // try the current slot. If it's occupied, add one and try again + ACTION_IF VARIABLE_IS_SET $ids_in_use( "%to_try%") BEGIN + LAF find_spell_ids_slot INT_VAR type level to_try=to_try + 1 STR_VAR idsname RET slot=slot to_try_next=to_try_next END + END ELSE BEGIN + // slot appears empty, but make sure there's no undocumented spell (or spell resources) in it! + LAF idscode_to_spell INT_VAR idscode=to_try RET resref END + ACTION_IF (FILE_EXISTS_IN_GAME "%resref%.spl" || FILE_EXISTS_IN_GAME "%resref%B.BAM") BEGIN + LAF find_spell_ids_slot INT_VAR type level to_try=to_try + 1 STR_VAR idsname RET slot=slot to_try_next=to_try_next END + END ELSE BEGIN + // if we get this far, slot is good + OUTER_SET slot=to_try + OUTER_SET to_try_next=slot+1 + END + END + END + END +END + +////////////////////////////////////////////////////////////////////////////// +/// Find the type of a spell (optional arguments are typename, idsname, filename, file_loc) +/// +/// First, check typename, which can be priest (or cleric), wizard, innate, or class +/// Failing that, check spell.ids. +/// Failing that, look at the first part of the idsname. If it's +/// WIZARD, CLERIC, DRUID, AVENGER, PALADIN [etc] we're done, If it's INNATE, likewise. +/// Failing that, look at the spell name. If it's SPPR, SPWI, SPIN or SPCL, we're +/// done. +/// Failing *that*, look inside the spell. +/// Failing *that*, guess "innate"! +////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION find_spell_type + INT_VAR type=0 + STR_VAR idsname="" + filename="" + file_loc="" + typename="unspecified" + RET type +BEGIN + ACTION_IF type=0 BEGIN + ACTION_TO_LOWER typename + ACTION_MATCH "%typename%" WITH + cleric priest BEGIN + OUTER_SET type=1 + END + wizard BEGIN + OUTER_SET type=2 + END + innate BEGIN + OUTER_SET type=3 + END + class BEGIN + OUTER_SET type=4 + END + DEFAULT + OUTER_SET type=0 + END + END + ACTION_IF type=0 & "%idsname%" STRING_COMPARE "" BEGIN + OUTER_SET ids_num=IDS_OF_SYMBOL (spell "%idsname%") + ACTION_IF (ids_num>=0) BEGIN + OUTER_SET type = ids_num / 1000 + END + END + ACTION_IF type=0 & "%idsname%" STRING_COMPARE "" BEGIN + LAF return_first_entry STR_VAR list="%idsname%" separator="_" RET entry=entry END + ACTION_TO_UPPER entry + ACTION_MATCH "%entry%" WITH + "CLERIC" BEGIN + OUTER_SET type=1 + END + "WIZARD" BEGIN + OUTER_SET type=2 + END + "INNATE" BEGIN + OUTER_SET type=3 + END + "PALADIN" "BARD" "DRUID" "RANGER" "ROGUE" "BEASTMASTER" "ARCHER" "SHAPESHIFTER" "AVENGER" "TOTEMIC_DRUID" + "TALOS" "LATHANDER" "HELM" "INQUIS" "BLACKGUARD" "SUN" "BLADE" "KENSAI" "BERSERKER" "BARBARIAN" BEGIN + OUTER_SET type=4 + END + DEFAULT + OUTER_SET type=0 + END + END + ACTION_IF type=0 & "%filename%" STRING_COMPARE "" BEGIN + OUTER_INNER_PATCH "%filename%___" BEGIN + READ_ASCII 0x0 check (4) + END + ACTION_TO_UPPER check + ACTION_MATCH "%check%" WITH + "SPPR" BEGIN + OUTER_SET type=1 + END + "SPWI" BEGIN + OUTER_SET type=2 + END + "SPIN" BEGIN + OUTER_SET type=3 + END + "SPCL" BEGIN + OUTER_SET type=4 + END + DEFAULT END + END + ACTION_IF type=0 & FILE_EXISTS "%file_loc%/%filename%.spl" BEGIN + COPY - "%file_loc%/%filename%.spl" "%workspace%" + READ_SHORT 0x1c type_in_file + BUT_ONLY + ACTION_MATCH "%type_in_file%" WITH + 1 BEGIN // wizard + OUTER_SET type=2 + END + 2 BEGIN // priest + OUTER_SET type=1 + END + DEFAULT // innate + OUTER_SET type=3 + END + END + ACTION_IF type=0 BEGIN + OUTER_SET type=3 + END +END + +////////////////////////////////////////////////////////////////////////////// +/// Find the level of a spell (optional arguments are level, filename, file_loc) +////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION find_spell_level + INT_VAR level="-1" + STR_VAR filename="" + file_loc="" + RET level +BEGIN + // if we already know the level, just return it + ACTION_IF level<0 BEGIN + ACTION_IF FILE_EXISTS "%file_loc%/%filename%.spl" BEGIN // if the file exists, get it from there + COPY - "%file_loc%/%filename%.spl" "%workspace%" + READ_SHORT 0x34 level + BUT_ONLY + END ELSE BEGIN // otherwise guess "1" + OUTER_SET level=1 + END + END +END + + +////////////////////////////////////////////////////////////////////////////// +/// Return the spell.ids name of spell.spl, or "%spell%" if there isn't one +////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION return_spellname + STR_VAR resref="" + RET spellname +BEGIN + ACTION_IF STRING_LENGTH "%resref%" =7 BEGIN // if not, it's not in standard form + OUTER_PATCH "%resref%" BEGIN + READ_ASCII 0x0 check (4) + PATCH_MATCH "%check%" WITH + SPWI SPCL SPPR SPIN BEGIN + READ_ASCII 0x4 check2 (3) + PATCH_IF IS_AN_INT "%check2%" BEGIN + LPF spell_to_idscode STR_VAR resref RET idscode END + LOOKUP_IDS_SYMBOL_OF_INT spellname spell "%idscode%" + PATCH_IF IS_AN_INT spellname BEGIN + SPRINT spellname "%resref%" + END + END ELSE BEGIN + SPRINT spellname "%resref%" + END + END + DEFAULT + SPRINT spellname "%resref%" + END + END + END ELSE BEGIN + OUTER_SPRINT spellname "%resref%" + END +END + +DEFINE_PATCH_FUNCTION return_spellname + STR_VAR resref="" + RET spellname +BEGIN + INNER_ACTION BEGIN + LAF return_spellname STR_VAR resref RET spellname END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// scroll maker +///////////// +///////////// Needs to be supplied with a function that takes the spell resref as input and spits out a name, or else just with the name itself +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION make_scroll_of_spell + INT_VAR price="-1" + STR_VAR resref="" + scrollname="" + scrollicon="" + name_func="" + spell_loc="" + price_func="standard_scroll_price" + RET scrollname +BEGIN + // find a name + ACTION_IF "%scrollname%" STRING_EQUAL "" BEGIN + LAF "%name_func%" STR_VAR arguments="%resref%" RET scrollname=value END + END + // set the icon if none given + ACTION_IF "%scrollicon%" STRING_EQUAL "" BEGIN + OUTER_TEXT_SPRINT scrollicon "%resref%A" + END + // find a price + ACTION_IF price<0 BEGIN + LAF "%price_func%" STR_VAR arguments="%resref%" RET price=value END + END + // get some data from the spell + ACTION_IF "%spell_loc%" STRING_EQUAL "" BEGIN + COPY_EXISTING "%resref%.spl" override + LPM scroll_of_spell_data_collection + BUT_ONLY + END ELSE BEGIN + COPY "%spell_loc%/%resref%.spl" "%spell_loc%" + LPM scroll_of_spell_data_collection + BUT_ONLY + + END + // get the template + ACTION_IF type=1 BEGIN + OUTER_SPRINT template "SCRL1D" // this is Clairvoyance, which is in BG1, BG2, IWD + END ELSE BEGIN + OUTER_SPRINT template "SCRL56" // this is Cure Serious Wounds, ditto + END + + // install the scroll + ACTION_CLEAR_ARRAY patch_data + ACTION_DEFINE_ASSOCIATIVE_ARRAY patch_data BEGIN + name2_string=>"%name%" + description2_string=>"%desc%" + patch_effect_inline=>"resource=>%resref%" + patch_ability_inline'1=>"ability_icon=>%scrollicon%" + icon=>"%scrollicon%" + price=>"%price%" + END + ACTION_PHP_EACH unusable_flag AS flag=>discard BEGIN + OUTER_SET $patch_data("unusable_%flag%")=1 + END + + ACTION_IF ability_target=4 BEGIN + OUTER_SPRINT $patch_data("patch_effect_inline'") "match=>opcode=146 ability_target=>4 ability_range=>%range% opcode=>148" + END ELSE BEGIN + OUTER_SPRINT $patch_data("patch_effect_inline'") "match=>opcode=146 ability_target=>%ability_target% target=>2 ability_range=>%range%" + END + + LAF clone_item STR_VAR item="%template%=>%scrollname%" edits=patch_data END +END // end of main function + +DEFINE_PATCH_MACRO scroll_of_spell_data_collection // just broken out for readability, no attempt at encapsulation +BEGIN + LPF SPL_unusable_conjurer STR_VAR arguments=0 END // because the template spell is unusable by conjurers! + LPF SPL_read_description1_string RET desc=value END + LPF SPL_read_name1_string RET name=value END + READ_LONG 0x64 offset_base + LPF SPL_read_ability_target RET ability_target=value END + LPF SPL_read_ability_range RET range=value END + LPF SPL_read_spell_type_num RET type=value END + PATCH_IF value=1 BEGIN + PATCH_FOR_EACH specialist IN abjurer conjurer diviner enchanter illusionist invoker necromancer transmuter generalist BEGIN + LPF "SPL_read_unusable_%specialist%" RET value END + PATCH_IF value BEGIN + SPRINT $unusable_flag("%specialist%") "" + END + END + END ELSE BEGIN + PATCH_FOR_EACH category IN chaotic_priest evil_priest good_priest GEneutral_priest lawful_priest LCneutral_priest cleric druid BEGIN + LPF "SPL_read_unusable_%category%" RET value END + PATCH_IF value BEGIN + SPRINT $unusable_flag("%category%") "" + END + END + END +END // end of macro + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// default function for scroll pricing +// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION standard_scroll_price + STR_VAR arguments="" + RET value +BEGIN + OUTER_INNER_PATCH "%arguments%" BEGIN + READ_ASCII 0x2 type (2) + READ_ASCII 0x4 level (1) + END + ACTION_IF "%type%" STRING_EQUAL PR BEGIN // priest pricing + OUTER_SET value = level * 100 + END ELSE BEGIN // wizard pricing + ACTION_MATCH "%level%" WITH + 1 BEGIN + OUTER_SET value=100 + END + 2 BEGIN + OUTER_SET value=200 + END + 3 BEGIN + OUTER_SET value=300 + END + 4 BEGIN + OUTER_SET value=500 + END + 5 BEGIN + OUTER_SET value=1000 + END + 6 BEGIN + OUTER_SET value=2000 + END + 7 BEGIN + OUTER_SET value=3000 + END + 8 BEGIN + OUTER_SET value=5000 + END + DEFAULT + OUTER_SET value=10000 + END + END + + + + + +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// list wizard spells by level and school +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION list_wizard_spells BEGIN + + // get hidespl [no, I don't know why ordinary 2da editing doesn't work here] + + COPY_EXISTING hidespl.2da override + FOR (i=101;i<1000;i+=1) BEGIN + PATCH_IF INDEX_BUFFER ("SPWI%i%")>=0 BEGIN + SPRINT $hidden("SPWI%i%") "" + END + END + BUT_ONLY + + + // get spells + + COPY_EXISTING_REGEXP GLOB "SPWI[1-9][0-9]+.spl" override + SPRINT filename "%SOURCE_RES%" + TO_UPPER filename + PATCH_IF !VARIABLE_IS_SET $hidden("%filename%") BEGIN + LPF SPL_read_school RET school=value END + READ_LONG 0x34 level + PATCH_IF VARIABLE_IS_SET $spell_list("%level%" "%school%") BEGIN + SPRINT temp $spell_list("%level%" "%school%" ) + SPRINT $spell_list("%level%" "%school%" ) "%temp% %filename%" + END ELSE BEGIN + SPRINT $spell_list("%level%" "%school%" ) "%filename%" + END + READ_STRREF 0x8 name + INNER_ACTION BEGIN + LAF return_spellname STR_VAR resref="%filename%" RET idsname=spellname END + END + SPRINT $spell_details("%filename%") "%name% (%idsname%)" + END + BUT_ONLY + + // format and output list + OUTER_SPRINT file "wizard_spells_by_level.txt" + LAF log_this STR_VAR file input="WIZARD SPELLS BY SCHOOL AND LEVEL" END + OUTER_FOR (level=1;level<10;level+=1) BEGIN + LAF log_this STR_VAR file input="Level %level%" END + ACTION_FOR_EACH school IN abjuration alteration conjuration divination enchantment illusion invocation necromancy generalist BEGIN + LAF log_this STR_VAR file input="%school%" END + ACTION_IF VARIABLE_IS_SET $spell_list("%level%" "%school%") BEGIN + OUTER_SPRINT list $spell_list("%level%" "%school%") + OUTER_WHILE "%list%" STRING_COMPARE "" BEGIN + LAF return_first_entry STR_VAR list RET entry list END + OUTER_SPRINT input $spell_details("%entry%") + LAF log_this STR_VAR file input END + END + END + END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// collect spell icons +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION collect_spell_icons + STR_VAR location="" + locbase="" + locabs="" + spell="" + resref="" +BEGIN + LAF get_directory STR_VAR location locbase locabs RET file_loc=directory END + CLEAR_IDS_MAP + LAF get_spellcode STR_VAR input="%spell%" RET spell_resref=value END + ACTION_FOR_EACH letter IN a b c BEGIN + ACTION_IF FILE_EXISTS "%file_loc%/%resref%%letter%.bam" BEGIN + COPY "%file_loc%/%resref%%letter%.bam" "override/%spell_resref%%letter%.bam" + END + END + ACTION_CLEAR_ARRAY patch_data + ACTION_DEFINE_ASSOCIATIVE_ARRAY patch_data BEGIN + icon=>"%spell_resref%c" + patch_ability_inline=>"ability_icon=>%spell_resref%b" + END + LAF edit_spell STR_VAR spell="%spell_resref%" edits=patch_data END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// make a repeating innate spell +///////////// input is either old=>new list (if overwrite=0) or spell list (if overwrite=1) +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION make_innate_repeating_spell + INT_VAR template_is_ids=1 + new_is_ids=1 + cooldown=0 + overwrite=0 + allow_missing=0 + patch_description=1 + override_description=0 + delete_casting=0 + desc_strref_cd = 100404 // the string to be appended to the description, with "99999" replaced by the actual repeat time. Default value is from SCS shared.tra + desc_strref_atwill = 100405 // this string says 'use at will' and gets appended instead if cooldown=0 + STR_VAR arguments="" +BEGIN + ACTION_IF override_description>0 BEGIN + OUTER_SET patch_description=0 + END + ACTION_IF "%arguments%" STRING_COMPARE "" BEGIN + ACTION_IF overwrite BEGIN + LAF return_first_entry STR_VAR list="%arguments%" RET template=entry arguments=list END + END ELSE BEGIN + LAF return_first_pair STR_VAR list="%arguments%" RET template=key idsname=value arguments=list END + END + ACTION_IF template_is_ids BEGIN + LAF get_spellcode STR_VAR input="%template%" RET oldname=value END + END ELSE BEGIN + OUTER_SPRINT oldname "%template%" + END + ACTION_IF (FILE_EXISTS_IN_GAME "%oldname%.spl" || !allow_missing) BEGIN + ACTION_IF overwrite BEGIN + OUTER_SPRINT newname "%oldname%" + END ELSE BEGIN + ACTION_IF new_is_ids BEGIN + LAF add_spell_to_ids INT_VAR level=1 type=3 STR_VAR idsname RET newname END + END ELSE BEGIN + OUTER_SPRINT newname "%idsname%" + END + END + ACTION_CLEAR_ARRAY patch_data + OUTER_SET timing = cooldown >0 ? 4 : 1 + ACTION_IF patch_description BEGIN + OUTER_SPRINT extra_string (AT desc_strref_cd) + ACTION_IF cooldown>0 BEGIN + OUTER_INNER_PATCH_SAVE extra_string "%extra_string%" BEGIN + REPLACE_TEXTUALLY 99999 "%cooldown%" + END + END ELSE BEGIN + OUTER_SPRINT extra_string (AT desc_strref_atwill) + END + END + + ACTION_DEFINE_ASSOCIATIVE_ARRAY patch_data BEGIN + level=>1 + spell_type=>innate + patch_ability_inline=>"ability_icon_loc=>4" + add_effect_inline'=>"opcode=>171 target=>1 timing=>%timing% duration=>%cooldown% resource=>%newname%" + add_effect_inline=>"opcode=>172 target=>1 timing=>1 resource=>%newname%" + END + ACTION_IF patch_description BEGIN + OUTER_SPRINT $patch_data("append_description") "%extra_string%" + END + ACTION_IF override_description>0 BEGIN + OUTER_SPRINT $patch_data("say_description") "%override_description%" + END + ACTION_IF delete_casting BEGIN + OUTER_SPRINT $patch_data("casting_sound") null + OUTER_SPRINT $patch_data("casting_animation") 0 + END + ACTION_IF overwrite BEGIN + LAF edit_spell STR_VAR spell="%newname%" edits=patch_data END + END ELSE BEGIN + OUTER_SPRINT $patch_data("add_effect_inline''") "match=>~resource=%oldname%~ resource=>%newname%" + LAF clone_spell STR_VAR spell="%oldname%=>%newname%" edits=patch_data END + END + + END + LAF make_innate_repeating_spell INT_VAR cooldown overwrite allow_missing STR_VAR arguments END + + END + +END + +//////////////////////////////////////////////////////////////// +// Remove any use of IS_FINAL from hidespl, so that new spells +// can be safely added +//////////////////////////////////////////////////////////////// + + +DEFINE_ACTION_FUNCTION definalise_hidespl BEGIN + LAF check_label STR_VAR label=dw#definalised_hidespl RET value END + ACTION_IF !value BEGIN + PRINT "Definalising hidespl" + SILENT + LAF make_label STR_VAR label=dw#definalised_hidespl END + // get the information from hidespl + COPY_EXISTING hidespl.2da override + COUNT_2DA_COLS colcount + READ_2DA_ENTRIES_NOW hidespl_array colcount + FOR (i=0;i=4 BEGIN + READ_2DA_ENTRY_FORMER hidespl_array i 3 is_removed + END ELSE BEGIN + is_removed=0 + END + SET $is_removed("%resref%")=is_removed + PATCH_IF is_final BEGIN + SET $final_entry("%resref%")=1 + END + END + BUT_ONLY + // find and add the spells we need to add + ACTION_PHP_EACH final_entry AS key=>discard BEGIN + OUTER_INNER_PATCH "%key%" BEGIN + READ_ASCII 0x0 start (5) + READ_ASCII 0x5 number (2) + END + OUTER_FOR (n=number+1;n<100;n+=1) BEGIN + OUTER_SPRINT resref "%start%%n%" + ACTION_IF (FILE_EXISTS_IN_GAME "%resref%.spl" && !VARIABLE_IS_SET $is_hidden("%resref%")) BEGIN + OUTER_SET $is_hidden("%resref%")=1 + OUTER_SET $is_removed("%resref%")=0 + END + END + END + + // build the new hidespl + + <<<<<<<< .../stratagems-inline/hidespl.2da +2DA V1.0 +0 + IS_HIDDEN IS_FINAL IS_REMOVED >>>>>>>> + + COPY ".../stratagems-inline/hidespl.2da" override + + ACTION_FOR_EACH prefix IN SPIN SPWI SPPR BEGIN + OUTER_FOR (i=0;i<=9;i+=1) BEGIN + OUTER_FOR (j=0;j<=9;j+=1) BEGIN + OUTER_FOR (k=0;k<=9;k+=1) BEGIN + OUTER_SPRINT resref "%prefix%%i%%j%%k%" + ACTION_IF VARIABLE_IS_SET $is_hidden("%resref%") BEGIN + OUTER_SET is_hidden=$is_hidden("%resref%") + OUTER_SET is_removed=$is_removed("%resref%") + APPEND "hidespl.2da" "%resref% %is_hidden% 0 %is_removed%" + END + END + END + END + END + VERBOSE + END + +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// check if a spell is usable by a specialist mage +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION spell_is_unusable + STR_VAR resref="" + kit="" + RET value +BEGIN + ACTION_TO_LOWER kit + ACTION_MATCH "%kit%" WITH + transmuter abjurer necromancer enchanter diviner conjurer invoker illusionist BEGIN + COPY_EXISTING "%resref%.spl" "%workspace%" + LPF "SPL_read_unusable_%kit%" RET value END + BUT_ONLY + END + DEFAULT + OUTER_SET value=0 + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// make an aura power +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +DEFINE_ACTION_FUNCTION make_aura + STR_VAR spell="" + payload="" + effect="" +BEGIN + ACTION_IF "%effect%" STRING_EQUAL_CASE "" BEGIN + LAF find_unique_filename STR_VAR extension=eff RET effect=filename END + END + ACTION_CLEAR_ARRAY patch_data + ACTION_DEFINE_ASSOCIATIVE_ARRAY patch_data BEGIN + add_basic_ability=>null + add_effect_inline=>"opcode=>272 target=>1 timing=>1 parameter1=>1 parameter2=>3 resource=>%effect%" + END + LAF make_spell STR_VAR spell edits=patch_data END + LAF make_casting_effect STR_VAR spell="%payload%" effect END + +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// move the spells in the SPWI926-SPWI949 range into the SPWI0xyz range +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + + +DEFINE_ACTION_FUNCTION remap_level_9_wizard_spells BEGIN + +LAF check_label STR_VAR label=dw#remap_level_9 RET value END +ACTION_IF !value BEGIN + LAF make_label STR_VAR label=dw#remap_level_9 END + + +LAF definalise_hidespl END + +COPY_EXISTING "spell.ids" override + READ_2DA_ENTRIES_NOW spell_ids_contents 2 + FOR (row=1;row=100 BEGIN + PATCH_FAIL "unexpected error in free_ids_slot" + END + SPRINT ids "SPWI0%value_last_3%" +END + +////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION resolve_smtables_entry STR_VAR name="" 2da="" RET value BEGIN + OUTER_SET value="-1" + COPY_EXISTING "smtables.2da" "%workspace%" + REPLACE_EVALUATE "^\([0-9]*\)_%name%" BEGIN + SET value="%MATCH1%" + END + "" + BUT_ONLY + ACTION_IF value<0 BEGIN + COPY_EXISTING "smtables.2da" override + COUNT_2DA_ROWS 2 rowcount + value=rowcount - 1 + INSERT_2DA_ROW rowcount 2 "%value%_%name% %2da%" + PRETTY_PRINT_2DA + BUT_ONLY + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////// +// Streamlined generator for smtable 2das - assumes animations are constant (as is true in all vanilla entries) +////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION generate_smtable STR_VAR 2da="" contents="" hit_animation="" area_hit_animation="" BEGIN + OUTER_SET index=1 + COPY ".../stratagems-inline/blank" "override/%2da%.2da" + OUTER_SPRINT data "2DA V1.0%WNL%0%WNL%%TAB%RESREF HitAnimation AreaHitAnimation%WNL%" + OUTER_WHILE "%contents%" STRING_COMPARE_CASE "" BEGIN + LAF return_first_entry STR_VAR list="%contents%" RET entry contents=list END + OUTER_PATCH_SAVE entry "%entry%" BEGIN + number_to_add=1 + REPLACE_EVALUATE "(\([0-9]+\))" BEGIN + number_to_add="%MATCH1%" + END + "" + END + OUTER_FOR (ind=0;ind>>>>>>> + +OUTER_SPRINT ~offset_readin_lookup_2da~ ~sto_offsets~ +OUTER_SPRINT ~offset_readin_file_ext~ ~STO~ +LAUNCH_ACTION_MACRO read_in_offsets + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// simple data-field edits +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +ACTION_DEFINE_ASSOCIATIVE_ARRAY sto_fields_absolute BEGIN + store_type_code=>"0x8,LONG" + name_string=>"0xc,LONG" + sell_markup=>"0x14,LONG" + buy_markup=>"0x18,LONG" + depreciation_rate=>"0x1c,BYTE" + will_depreciate=>"0x1d,BYTE" + stealing_failure_rate=>"0x20,SHORT" + space=>"0x22,SHORT" + lore=>"0x3c,LONG" + identify_cost=>"0x40,LONG" + rumors=>~0x44,ASCII~ + rumors_donation=>"0x54,ASCII" + price_peasant=>"0x60,LONG" + price_merchant=>"0x64,LONG" + price_noble=>"0x68,LONG" + price_royal=>"0x6c,LONG" +END + +LAF build_simple_data_field_editors STR_VAR lookup_table=sto_fields_absolute function_prefix=STO END + + +ACTION_DEFINE_ASSOCIATIVE_ARRAY sto_fields BEGIN + item_resource => ~0x0,ASCII~ + item_charges_1 => ~0xa,SHORT~ + item_charges_2 => ~0xc,SHORT~ + item_charges_3 => ~0xe,SHORT~ + item_num_in_stock => ~0x14,LONG~ + items_infinite => ~0x18,LONG~ + cure_resource => ~0x0,ASCII~ + item_bought=>"0x0,LONG" + cure=>"0x0,ASCII" + cure_price=>"0x8,LONG" + drinkname_string=>"0x8,LONG" + special_rumor=>"0x0,ASCII" + drink_price=>"0xc,LONG" + intoxication=>"0x10,LONG" // misnomer + rumor_rate=>"0x10,LONG" // misnomer +END + +LAUNCH_ACTION_FUNCTION build_simple_data_field_editors STR_VAR lookup_table=sto_fields offset_base=yes function_prefix=STO END + +ACTION_DEFINE_ASSOCIATIVE_ARRAY sto_bit_fields_absolute BEGIN + room_peasant=>"0x5c,0" + room_merchant=>"0x5c,1" + room_noble=>"0x5c,2" + room_royal=>"0x5c,3" + can_buy=>"0x10,0" + can_sell=>"0x10,1" + can_identify=>"0x10,2" + can_steal=>"0x10,3" + can_buy_cures=>"0x10,4" + can_donate=>"0x10,5" + can_buy_drinks=>"0x10,6" + quality_bit_0=>"0x10,1" + quality_bit_1=>"0x10,2" + fence=>"0x11,4" +END + +LAF build_flag_data_field_editors STR_VAR offset_base=yes lookup_table=sto_bit_fields_absolute function_prefix=STO END + + +ACTION_DEFINE_ASSOCIATIVE_ARRAY sto_bit_fields BEGIN + state_identified => ~0x10,0~ + state_unstealable => ~0x10,1~ + state_stolen => ~0x10,2~ +END + +LAF build_flag_data_field_editors STR_VAR offset_base=yes lookup_table=sto_bit_fields function_prefix=STO END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// More memorable type names +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION STO_store_type + STR_VAR arguments=0 +BEGIN + TO_LOWER arguments + PATCH_MATCH "%arguments%" WITH + 2 inn BEGIN + SET num=2 + END + 1 tavern BEGIN + SET num=1 + END + 3 temple BEGIN + SET num=3 + END + 4 container_iwd BEGIN + SET num=4 + END + 5 container BEGIN + SET num=5 + END + DEFAULT + LPF warning STR_VAR warning="Store type %arguments% is unrecognised; defaulting to 0" END + SET num=0 + END + LPF STO_store_type_code STR_VAR arguments=num END +END + + +DEFINE_PATCH_FUNCTION STO_read_store_type + RET value +BEGIN + LPF STO_read_store_type_code RET num=value END + PATCH_MATCH "%num%" WITH + 2 BEGIN + SPRINT value inn + END + 1 BEGIN + SPRINT value tavern + END + 3 BEGIN + SPRINT value temple + END + 4 BEGIN + SPRINT value container_iwd + END + 5 BEGIN + SPRINT value container + END + 0 BEGIN + SPRINT value store + END + DEFAULT + SPRINT value unknown + END +END + + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Item-removal hook +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION STO_remove_items + STR_VAR arguments="" +BEGIN + PATCH_IF ~%arguments%~ STRING_COMPARE_CASE "" BEGIN + LPF return_first_entry STR_VAR list= ~%arguments%~ RET arguments=list item=entry END + REMOVE_STORE_ITEM ~%item%~ + LPF STO_remove_items STR_VAR arguments END + END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("STO_remove_items") "" + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// General adder syntax: list of item or item(n) +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION add_items_to_store + INT_VAR tv=0 + STR_VAR store="" + items="" + item="" + location="" +BEGIN + ACTION_IF "%store%" STRING_EQUAL "" BEGIN + LAF warning STR_VAR warning="Store unspecified in add_items_to_store" END + END + LAF join STR_VAR list1="%items%" list2="%item%" RET items=list END + ACTION_IF "%items%" STRING_EQUAL "" BEGIN + LAF warning STR_VAR warning="Tried to add empty list of items to store(s) %store%" END + END + LAF return_first_entry STR_VAR list= ~%store%~ RET this_store=entry store=list END + ACTION_IF tv BEGIN + OUTER_SPRINT ~this_store~ ~%tutu_var%%this_store%~ + END + COPY_EXISTING ~%this_store%.sto~ ~override~ + SPRINT ~items_here~ ~%items%~ + WHILE ~%items_here%~ STRING_COMPARE_CASE "" BEGIN + SPRINT item_num 1 + LPF return_first_entry STR_VAR list= ~%items_here%~ RET items_here=list entry=entry END + LPF return_function_and_argument STR_VAR input= ~%entry%~ RET to_add=function item_data=argument END + PATCH_IF ~%item_data%~ STRING_COMPARE_CASE ~~ BEGIN + SPRINT item_num ~%item_data%~ + END + SPRINT input ~ADD_STORE_ITEM %to_add% %location% #1 #0 #0 "IDENTIFIED" #%item_num%~ + LPF patch_reinclude_this STR_VAR input END + END + BUT_ONLY + ACTION_IF "%store%" STRING_COMPARE "" BEGIN + LAF add_items_to_store INT_VAR tv STR_VAR store items location END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// set the names +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION STO_set_name + STR_VAR arguments="" +BEGIN + LPF patch_text_entry INT_VAR loc=0xc STR_VAR function=set_string arguments= ~%arguments%~ END +END + +DEFINE_PATCH_FUNCTION STO_say_name + STR_VAR arguments="" +BEGIN + WRITE_LONG 0xc RESOLVE_STR_REF ((AT arguments)) +END + +DEFINE_PATCH_FUNCTION STO_set_drink + STR_VAR arguments="" +BEGIN + LPF patch_text_entry INT_VAR loc=0x8+offset_base STR_VAR function=set_string arguments= ~%arguments%~ END +END + +DEFINE_PATCH_FUNCTION STO_say_drink + STR_VAR arguments="" +BEGIN + WRITE_LONG (offset_base+0x8) RESOLVE_STR_REF ((AT arguments)) +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// set buy and sell +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +DEFINE_PATCH_FUNCTION STO_will_buy + STR_VAR arguments="" +BEGIN + PATCH_MATCH "%arguments%" WITH + all "ALL" any "ANY" BEGIN + SPRINT arguments "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 33 34 35 36 37" + END + DEFAULT + END + // record the items to add + WHILE "%arguments%" STRING_COMPARE "" BEGIN + LPF return_first_entry STR_VAR list="%arguments%" RET entry=entry arguments=list END + SET $items_bought("%entry%")=1 + END + // collect the existing items + SPRINT entry_type item_purchased + SPRINT file_ext STO + LPM get_offset_array + PHP_EACH offset_array AS int=>offset BEGIN + READ_LONG offset item + SET $items_bought("%item%")=0 + END + // add the items + PHP_EACH items_bought AS item=>val BEGIN + PATCH_IF val BEGIN + LPF apply_patches_inline STR_VAR file_ext=STO editstring="add_entry_inline=>~type=>item_purchased item_bought=>%item%~" END + END + END +END + +DEFINE_PATCH_FUNCTION STO_will_not_buy + STR_VAR arguments="" +BEGIN + PATCH_MATCH "%arguments%" WITH + all "ALL" any "ANY" BEGIN + LPF apply_patches_inline STR_VAR file_ext=STO editstring="delete_entries_inline=>~type=>item_purchased~" END + END + DEFAULT + WHILE "%arguments%" STRING_COMPARE "" BEGIN + LPF return_first_entry STR_VAR list="%arguments%" RET entry=entry arguments=list END + LPF apply_patches_inline STR_VAR file_ext=STO editstring="delete_entries_inline=>~type=>item_purchased match=>item_bought check=>%entry%~" END + END + END +END diff --git a/iwdification/sfo/filetype/lib_ui.tpa b/iwdification/sfo/filetype/lib_ui.tpa new file mode 100644 index 0000000..817fd6d --- /dev/null +++ b/iwdification/sfo/filetype/lib_ui.tpa @@ -0,0 +1,174 @@ +DEFINE_PATCH_FUNCTION UI_alter_object + STR_VAR object="" + object_type="" + object_name_field="name" + patch="" +BEGIN + LPF UI_patch_object_master STR_VAR object object_type object_name_field patch type=alter END +END + +DEFINE_PATCH_FUNCTION UI_analyze_object + STR_VAR object="" + object_type="" + object_name_field="name" + patch="" + RET_ARRAY patch_output +BEGIN + LPF UI_patch_object_master STR_VAR object object_type object_name_field patch type=analyze RET_ARRAY patch_output END +END + +DEFINE_PATCH_FUNCTION UI_return_object // for secondary analysis + STR_VAR object="" + object_type="" + object_name_field="name" + patch="" + RET object_data +BEGIN + LPF UI_patch_object_master STR_VAR object object_type object_name_field patch type=return RET object_data END +END + +DEFINE_PATCH_FUNCTION UI_replace_object + STR_VAR object="" + object_type="" + object_name_field="name" + replace="" +BEGIN + INNER_ACTION BEGIN + COPY - "%replace%" "%workspace%" EVALUATE_BUFFER + READ_ASCII 0x0 insert_data (BUFFER_LENGTH) + SPRINT insert_data "%WNL%%insert_data%%WNL%" + BUT_ONLY + END + LPF UI_patch_object_master STR_VAR object object_type object_name_field type=replace insert_data END +END + +DEFINE_PATCH_FUNCTION UI_insert_into_object + STR_VAR object="" + object_type="" + object_name_field="name" + insert="" +BEGIN + INNER_ACTION BEGIN + COPY - "%insert%" "%workspace%" EVALUATE_BUFFER + READ_ASCII 0x0 insert_data (BUFFER_LENGTH) + SPRINT insert_data "%WNL%%insert_data%%WNL%" + BUT_ONLY + END + LPF UI_patch_object_master STR_VAR object object_type object_name_field type=insert_into insert_data END +END + +DEFINE_PATCH_FUNCTION UI_patch_object_master + STR_VAR object="" + object_type="" + object_name_field="name" + patch="" + type="" + insert_data="" + RET object_data + RET_ARRAY patch_output +BEGIN + SPRINT object_data "" + SPRINT $patch_output("NULL") "" + SET index=0 + WHILE index>=0 BEGIN + SET index=INDEX_BUFFER ("%object_type%" index) + PATCH_IF index>=0 BEGIN + LPF find_parenthesis_range STR_VAR left="{" right="}" index RET start end END + PATCH_IF start<0 BEGIN + SET index = "-1" + END ELSE BEGIN + READ_ASCII start+1 data (end - start - 1) + SET change=0 + INNER_PATCH_SAVE data "%data%" BEGIN + PATCH_IF ( INDEX_BUFFER (~%object_name_field%\( \|%TAB%\)*['"]%object%['"]~) > 0 || "%object%" STRING_EQUAL "") BEGIN + PATCH_MATCH "%type%" WITH + alter BEGIN + SET change=1 + LPF "%patch%" END + END + analyze BEGIN + LPF "%patch%" RET_ARRAY patch_output END + END + insert_into BEGIN + SET change=1 + SET end_here = BUFFER_LENGTH - 1 + INSERT_BYTES end_here (STRING_LENGTH "%insert_data%") + WRITE_ASCIIE end_here "%insert_data%" + END + replace BEGIN + SET change=1 + DELETE_BYTES 0x0 BUFFER_LENGTH + INSERT_BYTES 0x0 (STRING_LENGTH "%insert_data%") + WRITE_ASCIIE 0x0 "%insert_data%" + END + return BEGIN + READ_ASCII 0x0 object_data (BUFFER_LENGTH) + END + DEFAULT + PATCH_FAIL "internal error in UI_patch_object_master: undefined type %type%" + END + END + END + PATCH_IF change BEGIN + READ_ASCII start+1 info_here (end - start - 1) + DELETE_BYTES (start+1) ((end - start) - 1) + INSERT_BYTES (start+1) (STRING_LENGTH "%data%") + WRITE_ASCIIE (start+1) "%data%" + END + PATCH_IF change BEGIN + SET index="-1" + END ELSE BEGIN + SET index=start + STRING_LENGTH "%data%"+2 + END + END + END + END +END + +DEFINE_PATCH_FUNCTION UI_add_function + STR_VAR function="" +BEGIN + INNER_ACTION BEGIN + COPY - "%function%" "%workspace%" EVALUATE_BUFFER + READ_ASCII 0x0 function_data (BUFFER_LENGTH) + SPRINT function_data "%WNL%%function_data%%WNL%" + BUT_ONLY + END + SET insert_point = INDEX_BUFFER ("function ") + INSERT_BYTES insert_point STRING_LENGTH "%function_data%" + WRITE_ASCIIE insert_point "%function_data%" + +END + +DEFINE_ACTION_FUNCTION UI_add_string + INT_VAR tra_entry=0 + STR_VAR string_id="" + string="" +BEGIN + ACTION_IF "%string%" STRING_EQUAL "" BEGIN + OUTER_SPRINT string (AT tra_entry) + END + COPY_EXISTING "L_%EE_LANGUAGE%.lua" override + REPLACE_TEXTUALLY ~uiStrings *= *{~ ~uiStrings = {%WNL% %string_id% = "%string%",~ + BUT_ONLY +END + + +DEFINE_PATCH_FUNCTION UI_get_coordinates + RET_ARRAY patch_output +BEGIN + REPLACE_EVALUATE "bam\(%WNL%\|%LNL%\|%MNL%\|%TAB%\| \)+\([^\(%WNL%\|%LNL%\|%MNL%\|%TAB%\| \)]*\)\(%WNL%\|%LNL%\|%MNL%\)" BEGIN + SPRINT $patch_output("bam") "%MATCH2%" + END + "bam %MATCH2%%WNM" + REPLACE_EVALUATE "[^0-9]*\([0-9]+\)\( \|%TAB%\)+\([0-9]+\)\( \|%TAB%\)+\([0-9]+\)\( \|%TAB%\)+\([0-9]+\)[^0-9]*" + BEGIN + SET $patch_output("xloc")="%MATCH1%" + SET $patch_output("yloc")="%MATCH3%" + SET $patch_output("width")="%MATCH5%" + SET $patch_output("height")="%MATCH7%" + END + "" + +END + diff --git a/iwdification/sfo/filetype/lib_vef.tpa b/iwdification/sfo/filetype/lib_vef.tpa new file mode 100644 index 0000000..2981652 --- /dev/null +++ b/iwdification/sfo/filetype/lib_vef.tpa @@ -0,0 +1,147 @@ + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// overarching clone +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION clone_vef + STR_VAR + vef="" + edits="" + editstring="" + allow_missing="no" + BEGIN + LAUNCH_ACTION_FUNCTION clone_template + STR_VAR file_list= ~%vef%~ + file_ext=~VEF~ + edits + editstring + END +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// overarching edit +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION edit_vef + INT_VAR allow_missing=0 + STR_VAR + vef="" + edits="" + editstring="" + external_file="" + BEGIN + LAUNCH_ACTION_FUNCTION edit_template + INT_VAR allow_missing + STR_VAR file_list= ~%vef%~ + file_ext=~STO~ + edits editstring external_file + + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// overarching install +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION install_vef + INT_VAR allow_missing=0 + STR_VAR + vef="" + edits="" + editstring="" + external_file="" + location="" + locbase="" + BEGIN + LAUNCH_ACTION_FUNCTION install_template + INT_VAR allow_missing + STR_VAR file_list= ~%vef%~ + file_ext=~VEF~ + edits editstring external_file location locbase + + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// overarching make +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION make_vef + + STR_VAR + type="" + vef="" + edits="" + editstring="" + BEGIN + LAUNCH_ACTION_FUNCTION make_template + STR_VAR file_list=~%vef%~ + file_ext=~VEF~ + edits + editstring + build_before= VEF_build + build_after = VEF_postbuild + END +END + + + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// offsets +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +<<<<<<<< vef_offsets.2da +TYPE offset_loc offset_length entrynum_loc entrynum_length entry_length +component 0x8 0x4 0xc 0x4 0xe0 +component2 0x10 0x4 0x14 0x4 0xe0 +>>>>>>>> + +OUTER_SPRINT ~offset_readin_lookup_2da~ ~vef_offsets~ +OUTER_SPRINT ~offset_readin_file_ext~ ~VEF~ +LAUNCH_ACTION_MACRO read_in_offsets + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// simple data-field edits +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +ACTION_DEFINE_ASSOCIATIVE_ARRAY vef_fields BEGIN + ticks_until_start=>~0x0,LONG~ + ticks_until_loop=>~0x8,LONG~ + resource_type=>~0xc,LONG~ + resource=>~0x10,ASCII~ + continuous=>~0x18,LONG~ +END + +LAUNCH_ACTION_FUNCTION build_simple_data_field_editors STR_VAR lookup_table=vef_fields offset_base=yes function_prefix=VEF END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Builders +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION VEF_build +BEGIN + DELETE_BYTES 0x0 BUFFER_LENGTH + INSERT_BYTES 0x0 0x18 + WRITE_ASCII 0x0 "VEF V1.0" + WRITE_LONG 0x8 0x18 + WRITE_LONG 0x10 0x18 +END + +DEFINE_PATCH_FUNCTION VEF_postbuild +BEGIN +END diff --git a/iwdification/sfo/filetype/lib_vvc.tpa b/iwdification/sfo/filetype/lib_vvc.tpa new file mode 100644 index 0000000..7cfdbe4 --- /dev/null +++ b/iwdification/sfo/filetype/lib_vvc.tpa @@ -0,0 +1,193 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// overarching clone +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION clone_vvc + INT_VAR allow_missing=0 + silent=0 + STR_VAR + vvc="" + edits="" + editstring="" + BEGIN + LAUNCH_ACTION_FUNCTION clone_template + INT_VAR allow_missing silent + STR_VAR file_list= ~%vvc%~ + file_ext=~VVC~ + edits + editstring + END +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// overarching edit +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION edit_vvc + INT_VAR allow_missing=0 + silent=0 + STR_VAR + vvc="" + edits="" + editstring="" + BEGIN + LAUNCH_ACTION_FUNCTION edit_template + INT_VAR allow_missing silent + STR_VAR file_list= ~%vvc%~ + file_ext=~VVC~ + edits + editstring + END +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// overarching install +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION install_vvc + INT_VAR + allow_missing=0 + silent=0 + STR_VAR + vvc="" + edits="" + editstring="" + external_file="" + location="" + locbase="" + BEGIN + LAUNCH_ACTION_FUNCTION install_template + INT_VAR allow_missing silent + STR_VAR file_list= ~%vvc%~ + file_ext=~VVC~ + edits editstring external_file location locbase + + END +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// overarching make +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION make_vvc + STR_VAR + vvc="" + edits="" + editstring="" + BEGIN + LAUNCH_ACTION_FUNCTION make_template + STR_VAR file_list= ~%vvc%~ + file_ext=~VVC~ + edits= ~%edits%~ + editstring= ~%editstring%~ + build_before= VVC_build + build_after = VVC_postbuild + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// offsets [none] +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// simple data-field edits +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +ACTION_DEFINE_ASSOCIATIVE_ARRAY vvc_fields BEGIN + anim=>~0x8,ASCII~ + anim0=>~0x8,ASCII~ + x_pos=>~0x28,LONG~ + y_pos=>~0x2c,LONG~ + orientation=>~0x30,LONG~ + frame_rate=>~0x34,LONG~ + num_orient=>~0x38,LONG~ + palette=>~0x44,ASCII~ + z_pos=>~0x4c,LONG~ + ctr_x=>~0x50,LONG~ + ctr_y=>~0x54,LONG~ + brightness=>~0x58,LONG~ + num_frames=>~0x5c,LONG~ + seq_start=>~0x68,LONG~ + seq_middle=>~0x6c,LONG~ + seq_current=>~0x70,LONG~ + continuous=>~0x74,LONG~ + wav_start=>~0x78,ASCII~ + wav_middle=>~0x80,ASCII~ + wav_start0=>~0x78,ASCII~ + wav_middle0=>~0x80,ASCII~ + alpha=>~0x88,ASCII~ + seq_end=>~0x90,LONG~ + wav_end=>~0x94,ASCII~ + wav_end0=>~0x94,ASCII~ +END + +LAUNCH_ACTION_FUNCTION build_simple_data_field_editors STR_VAR lookup_table=vvc_fields function_prefix=VVC END + +ACTION_DEFINE_ASSOCIATIVE_ARRAY vvc_bit_fields BEGIN + transparent=>~0x18,0~ + translucent=>~0x18,1~ + translucent_shadow=>~0x18,2~ + blended=>~0x18,3~ + mirror_x=>~0x18,4~ + mirror_y=>~0x18,5~ + clip=>~0x18,6~ + copy_from_back=>~0x18,7~ + clear_fill=>~0x19,0~ + 3d_blend=>~0x19,1~ + ignore_wall=>~0x19,2~ + ignore_timestop=>~0x19,3~ + ignore_dream=>~0x19,4~ + 2d_blend=>~0x19,5~ + not_light_source=>~0x1a,0~ + light_source=>~0x1a,1~ + internal_brightness=>~0x1a,2~ + timestopped=>~0x1a,3~ + sepia=>~0x1b,2~ + looping=>~0x20,0~ + special_lighting=>~0x20,1~ + modify_for_height=>~0x20,2~ + draw_animation=>~0x20,3~ + custom_palette=>~0x20,4~ + purgeable=>~0x20,5~ + ignore_wallgroups=>~0x20,6~ + mid_level_brighten=>~0x20,7~ + high_level_brighten=>~0x21,0~ + orbit_target=>~0x40,0~ + relative_to_target=>~0x40,1~ + ignore_orientation=>~0x40,3~ +END + +LAF build_flag_data_field_editors STR_VAR lookup_table=vvc_bit_fields function_prefix=VVC END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// builders +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION VVC_build +BEGIN + INSERT_BYTES 0x0 0x1ec + WRITE_ASCII 0x000 ~VVC V1.0~ + LPF VVC_draw_animation STR_VAR arguments=1 END + LPF VVC_frame_rate STR_VAR arguments=15 END + LPF VVC_num_orient STR_VAR arguments=1 END + LPF VVC_num_frames STR_VAR arguments=~-1~ END +END +DEFINE_PATCH_FUNCTION VVC_postbuild BEGIN END diff --git a/iwdification/sfo/filetype/lib_wed.tpa b/iwdification/sfo/filetype/lib_wed.tpa new file mode 100644 index 0000000..a897724 --- /dev/null +++ b/iwdification/sfo/filetype/lib_wed.tpa @@ -0,0 +1,2991 @@ + +//////////////////////////////////////////////// +// Transcribe the wall polygons with the associated +// numbers from one wed file to another, adjusting +// their vertices and bounding boxes by delta. +// +// Polygons must be listed sequentially. +//////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION transcribe_polygons + INT_VAR delta_x=0 + delta_y=0 + stretch_numerator=1 + stretch_denominator=1 + stretch_base_x=0 + stretch_base_y=0 + STR_VAR from_area="" + to_area="" + polygons="" +BEGIN + OUTER_SPRINT polygon_data "" + OUTER_SPRINT vertex_data "" + OUTER_SET vertex_count=0 + OUTER_SET polygon_count=0 + // get the data + COPY_EXISTING "%from_area%.wed" "override" + READ_LONG 0x14 sec_header_off + READ_LONG sec_header_off + 0x4 polygon_off + READ_LONG sec_header_off + 0x8 vertex_off + WHILE "%polygons%" STRING_COMPARE_CASE "" BEGIN + LPF return_first_entry STR_VAR list="%polygons%" RET entry polygons=list END + // get some data + READ_LONG (polygon_off + 0x12 * entry) this_polygon_ind + READ_SHORT (polygon_off + 0x12 * entry +0x4) this_polygon_count + // get the polygon itself + READ_ASCII (polygon_off + 0x12 * entry) this_polygon (0x12) + // adjust it + INNER_PATCH_SAVE this_polygon "%this_polygon%" BEGIN + WRITE_LONG 0x0 vertex_count + READ_SHORT 0xa x + LPF stretch_point INT_VAR x x_0=stretch_base_x numerator=stretch_numerator denominator=stretch_denominator RET x END + WRITE_SHORT 0xa (x + delta_x) + READ_SHORT 0xc x + LPF stretch_point INT_VAR x x_0=stretch_base_x numerator=stretch_numerator denominator=stretch_denominator RET x END + WRITE_SHORT 0xc (x + delta_x) + READ_SHORT 0xe y + LPF stretch_point INT_VAR y y_0=stretch_base_y numerator=stretch_numerator denominator=stretch_denominator RET y END + WRITE_SHORT 0xe (y + delta_y) + READ_SHORT 0x10 y + LPF stretch_point INT_VAR y y_0=stretch_base_y numerator=stretch_numerator denominator=stretch_denominator RET y END + WRITE_SHORT 0x10 (y + delta_y) + END + // get the vertices + READ_ASCII (vertex_off + 0x4*this_polygon_ind) these_vertices (0x4*this_polygon_count) + // adjust them + + INNER_PATCH_SAVE these_vertices "%these_vertices%" BEGIN + FOR (i=0;i0 BEGIN + READ_LONG (polygon_off + 0x12 * (polygon_num - 1) ) last_wall_ind + READ_LONG (polygon_off + 0x12 * (polygon_num - 1) +4 ) last_wall_count + vertex_insert=last_wall_ind + last_wall_count + END ELSE BEGIN + vertex_insert=0 + END + INSERT_BYTES (vertex_off + 0x4 * vertex_insert) (4*vertex_count) + WRITE_ASCIIE (vertex_off + 0x4 * vertex_insert) "%vertex_data%" + // now insert the wall polygons + new_polygon_num=polygon_num + polygon_count + WRITE_LONG sec_header_off new_polygon_num + INSERT_BYTES (polygon_off + 0x12 * polygon_num) (0x12*polygon_count) + WRITE_ASCIIE (polygon_off + 0x12 * polygon_num) "%polygon_data%" + // go through the new polygons and update their indices + FOR (i=polygon_num;i0 BEGIN // read the index of the first door polygon, which should still be around + READ_LONG polygon_off unused_vertex_count + END ELSE BEGIN + SET unused_vertex_count = (BUFFER_LENGTH - vertex_off) / 4 + END + DELETE_BYTES vertex_off (4*unused_vertex_count) + FOR (door_ind=0;door_ind=0 && yloc>=0) BEGIN + LPF point_in_bounds INT_VAR x=xloc y=yloc xmin xmax ymin ymax RET in_bounds END + PATCH_IF !in_bounds BEGIN + delete=1 + END + END + READ_SHORT (offset + 0xc) xloc + READ_SHORT (offset + 0x10) yloc + PATCH_IF (xloc>=0 && yloc>=0) BEGIN + LPF point_in_bounds INT_VAR x=xloc y=yloc xmin xmax ymin ymax RET in_bounds END + PATCH_IF !in_bounds BEGIN + delete=1 + END + END + END + FOR (ind2=0;ind20 BEGIN + vertex_offset = vertex_offset_base - num_doors_deleted * 0x1a - num_door_tile_indices_deleted * 2 - num_door_polygons_deleted * 0x12 + (ind_here - num_deleted_here) * 0x4 + DELETE_BYTES vertex_offset (4*count_here) + + // we do this just to keep the code modular, so we can test this bit works - they're about to be deleted + WRITE_LONG offset (ind_here - num_deleted_here) + WRITE_LONG offset+4 0 + + num_vertices_deleted +=count_here + num_deleted_here += count_here + + END + END + num_open_deleted_here = num_deleted_here + + FOR (ind2=0;ind20 BEGIN + vertex_offset = vertex_offset_base - num_doors_deleted * 0x1a - num_door_tile_indices_deleted * 2 - num_door_polygons_deleted * 0x12 + (ind_here - num_deleted_here) * 0x4 + DELETE_BYTES vertex_offset (4*count_here) + + // we do this just to keep the code modular, so we can test this bit works - they're about to be deleted + WRITE_LONG offset (ind_here - num_deleted_here) + WRITE_LONG offset+4 0 + + num_vertices_deleted +=count_here + num_deleted_here +=count_here + + END + END + + // now delete the actual polygons + + DELETE_BYTES open_poly_off 0x12*open_count + closed_poly_off -=0x12*open_count + DELETE_BYTES closed_poly_off 0x12*closed_count + num_door_polygons_deleted += (closed_count + open_count) + // we do this just to keep the code modular, so we can test this bit works - they're about to be deleted + WRITE_SHORT 0xe+door_offset 0 + WRITE_SHORT 0x10+door_offset 0 + // update the closed-polygon index to allow for deletions (only relevant so that we can test partway through) + WRITE_LONG 0x16 + door_offset closed_poly_off + + + // now delete the door tile indices + + tile_ind_off = door_tile_offset_base + tile_ind_here * 2 + READ_SHORT tile_ind_off - 0x1a* num_doors_deleted data + DELETE_BYTES tile_ind_off - 0x1a* num_doors_deleted (2*tile_count_here) + num_door_tile_indices_deleted +=tile_count_here + WRITE_SHORT (0xc + door_offset) 0 + + + // last but not least, delete the actual door + + DELETE_BYTES door_offset 0x1a + num_doors_deleted +=1 + + + END // end of DELETE loop + + END // end of loop through doors + + // update offsets + + // door tile cell indices + READ_LONG 0x1c door_tile_offset_base + WRITE_LONG 0x1c (door_tile_offset_base - 0x1a* num_doors_deleted) + + // tile indices and tilemaps + READ_LONG 0x8 overlay_count + READ_LONG 0x10 overlay_off + FOR (ind=0;indwidth BEGIN + PATCH_WARN "clip is out of bounds; truncating" + xlen = width - x + END + PATCH_IF (y+ylen)>height BEGIN + PATCH_WARN "clip is out of bounds; truncating" + ylen = height - y + END + // adjust height/width + WRITE_SHORT overlay_off xlen + WRITE_SHORT (overlay_off+2) ylen + // go through the tile structures in the primary layer + FOR (tile_structure_ind=0;tile_structure_ind=0 BEGIN + LPF remap_this_tile INT_VAR tile_number=sec_tile_number x y xlen ylen height width RET value END + PATCH_IF value>=0 BEGIN + WRITE_SHORT (0x4 + tile_structure_off + tile_structure_ind*0xa - bytes_deleted) value + END ELSE BEGIN + PATCH_WARN "secondary tile %sec_tile_number%, at %tile_structure_ind%, appears to be in the height*width space; ignoring" + END + END + END + END + + // adjust the tile lookups for door tiles + // (doors themselves occur directly after + // the secondary header, so don't have to + // be reindexed). And doors have already + // been cropped, so no need to worry about + // bounds + + READ_LONG 0xc door_count + READ_LONG 0x18 door_off + READ_LONG 0x1c door_tile_off + door_tile_off -=bytes_deleted + WRITE_LONG 0x1c door_tile_off + PATCH_IF door_count>0 BEGIN + READ_SHORT (door_off + 0x1a* (door_count - 1) +0xa) ind_here + READ_SHORT (door_off + 0x1a* (door_count - 1) + 0xc) count_here + door_tile_count=ind_here+count_here + FOR (ind=0;ind1 BEGIN + value=1 + END + END +END + + +////////////////////////////////////////// +/// Move the vertices in to the top left +/// corner (x,y are in tiles) +/////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION realign_vertices + INT_VAR x=0 + y=0 +BEGIN + READ_LONG 0x14 sec_header_off + READ_LONG 0x8+sec_header_off vertex_off + offset=vertex_off + WHILE vertex_off0 BEGIN + READ_LONG sec_header_off + 0x4 polygon_off + READ_LONG sec_header_off + 0x8 vertex_off + READ_ASCII polygon_off polygons (0x12*polygon_count) + // check the last polygon to get the vertex count + READ_SHORT (polygon_off + 0x12*(polygon_count - 1)) ind + READ_SHORT (polygon_off + 0x12*(polygon_count - 1) + 4) count_here + SET vertex_count=ind+count_here + READ_ASCII vertex_off vertices (0x4*vertex_count) + LPF clip_polygon_block INT_VAR x xlen y ylen STR_VAR polygons_in="%polygons%" vertices_in="%vertices%" RET polygons_out vertices_out END + LPF insert_polygon_block STR_VAR polygons="%polygons_out%" vertices="%vertices_out%" END + END +END + + + + +////////////////////////////////////////// +/// Given a block of polygons and another +/// of vertices, insert then into a file as +/// its wall group (destructive overwrite) +/////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION insert_polygon_block + STR_VAR polygons="" + vertices="" +BEGIN + LPF delete_wallgroups END + SET polygon_length=STRING_LENGTH "%polygons%" + SET vertex_length=STRING_LENGTH "%vertices%" + SET polygon_count=polygon_length / 0x12 + SET vertex_count=vertex_length / 4 + READ_LONG 0x14 sec_header_off + WRITE_LONG sec_header_off polygon_count + READ_LONG sec_header_off + 0x4 polygon_off + READ_LONG sec_header_off + 0x8 vertex_off + SET vertex_off +=polygon_length + WRITE_LONG sec_header_off + 0x8 vertex_off + READ_LONG sec_header_off + 0x10 polygon_ind_off + SET polygon_ind_off +=polygon_length + WRITE_LONG sec_header_off + 0x10 polygon_ind_off + INSERT_BYTES polygon_off polygon_length + WRITE_ASCIIE polygon_off "%polygons%" + INSERT_BYTES vertex_off vertex_length + WRITE_ASCIIE vertex_off "%vertices%" + // we need to adjust doors to point to the right polygons, and door polygons to point to the right indices + READ_LONG 0xc door_count + READ_LONG 0x18 door_offset + FOR (ind=0;ind0 BEGIN + // get polygon data + INNER_PATCH_SAVE polygons_in "%polygons_in%" BEGIN + READ_LONG 0x0 start_ind + READ_LONG 0x4 count_ind + READ_BYTE 0x8 flags + READ_BYTE 0x9 unknown + READ_SHORT 0xa xmin + READ_SHORT 0xc xmax + READ_SHORT 0xe ymin + READ_SHORT 0x10 ymax + DELETE_BYTES 0x0 0x12 + END + // is the polygon a hovering wall? (The first 2 points in those polygons behave differently) + SET hovering_wall= ( (flags BOR 0b11111011) = 0b11111111) + + // get polygon vertex data + // in string form (assuming there are any vertices) + PATCH_IF count_ind>0 BEGIN + INNER_PATCH "%vertices_in%" BEGIN + PATCH_IF hovering_wall BEGIN + READ_ASCII 4*start_ind hovering_wall_vertices (8) + READ_ASCII (4*start_ind+8) vertices_here (4*count_ind - 8) + END ELSE BEGIN + READ_ASCII 4*start_ind vertices_here (4*count_ind) + END + READ_ASCII 4*start_ind vertices_here (4*count_ind) + READ_ASCII 4*start_ind hovering_wall_vertices (8) + END + END + PATCH_IF hovering_wall && count_ind>0 BEGIN + LPF truncate_wall + INT_VAR xmin=x + ymin=y + xmax=x + xlen + ymax=y + ylen + STR_VAR vertices="%hovering_wall_vertices%" + RET hovering_wall_vertices=vertices in_bounds END + END ELSE BEGIN + SET in_bounds=1 + END + // is the polygon in bounds? + PATCH_IF (xmax>x) &&(ymax>y) && (xmin < (x + xlen)) && (ymin < (y + ylen)) && count_ind>0 BEGIN + + SET bb_ymax=ymax + LPF truncate_polygon + INT_VAR xmin=x + ymin=y + xmax=x + xlen + ymax=y + ylen + bb_ymax + STR_VAR vertices="%vertices_here%" + RET vertices_here=vertices + xmin=bb_xmin + xmax=bb_xmax + ymin=bb_ymin + ymax=bb_ymax + END + // sanity check: are there at least 3 vertices? If not, abort the + // whole thing + PATCH_IF STRING_LENGTH "%vertices_here%" >=12 BEGIN + PATCH_IF hovering_wall BEGIN + SPRINT vertices_here "%hovering_wall_vertices%"^"%vertices_here%" + END + SET count_here=(STRING_LENGTH "%vertices_here%")/4 + SPRINT vertices_out "%vertices_out%"^"%vertices_here%" + SET count_here = (STRING_LENGTH "%vertices_here%") / 4 + INNER_PATCH_SAVE polygons_out "%polygons_out%" BEGIN + SET insert_point=BUFFER_LENGTH + INSERT_BYTES insert_point 0x12 + WRITE_LONG insert_point vertex_count + WRITE_LONG (insert_point + 4) count_here + WRITE_BYTE (insert_point + 8) flags + WRITE_BYTE (insert_point + 9) unknown + WRITE_SHORT (insert_point + 0xa) xmin + WRITE_SHORT (insert_point + 0xc) xmax + WRITE_SHORT (insert_point + 0xe) ymin + WRITE_SHORT (insert_point + 0x10) ymax + END + SET vertex_count += count_here + SET new_polygon_count +=1 + END + END + polygon_count +=1 + END // end of WHILE loop +END + + +////////////////////////////////////////// +/// Return -1 if a tile is to be cropped, +/// or its new number otherwise +/// (x,y) measured from top left +/////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION remap_this_tile + INT_VAR x=0 + xlen=0 + y=0 + ylen=0 + height=0 + width=0 + tile_number=0 + RET value +BEGIN + tile_number_orig=tile_number + // catch 'special' tiles + PATCH_IF tile_number>=height*width BEGIN + SET value=tile_number + (xlen * ylen) - (height * width) + END ELSE BEGIN + // work out the tile's coordinates + SET yloc=0 + WHILE tile_number>=width BEGIN + SET yloc+=1 + SET tile_number -=width + END + SET xloc=tile_number + PATCH_IF (xloc=x+xlen || yloc>=y+ylen) BEGIN + SET value="-1" + END ELSE BEGIN + // assuming we're not deleting it, work out its new value + SET xloc_new =xloc - x + SET yloc_new =yloc - y + SET value=yloc_new*xlen + xloc_new + END + END + // PATCH_PRINT "remap: %tile_number_orig%->%value% (tile was at %xloc%,%yloc%; bounds were (%x%->%x%+%xlen%) x (%y%->%y%+%ylen%))" + +END + +////////////////////////////////////////// +/// Find how many wallgroups a wed should have +////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION count_wallgroups +RET value +BEGIN + READ_LONG 0x10 overlay_off + READ_SHORT overlay_off tiles_x + READ_SHORT (overlay_off+2) tiles_y + LPF divide_round_up INT_VAR numerator=tiles_x denominator=10 RET num_x=value END + LPF divide_round_up INT_VAR numerator=2*tiles_y denominator=15 RET num_y=value END + SET value=num_x * num_y +END + +////////////////////////////////////////// +/// Divide two numbers, rounding up +/// any remainder +////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION divide_round_up + INT_VAR numerator=0 + denominator=0 + RET value +BEGIN + PATCH_IF (numerator / denominator) * denominator = numerator BEGIN + SET value = numerator / denominator + END ELSE BEGIN + SET value = (numerator / denominator) + 1 + END +END + +////////////////////////////////////////// +/// Flip an area along its vertical axis +/// +/// You need to supply (in 'file_loc') +/// a properly-named TIS file and associated +/// PVRZ files, plus (for legacy use) a legacy +/// TIS file with a 'v' name suffix, plus +/// the height,search and light maps +/// +/// DO NOT do the inversion in Paint, as it apparently +/// scrambles transparency layers. Photoshop works. +/// +/// You can also pass the program an array +/// of scripts (in the form $[script_array]("[script]")="") +/// whose coordinates need to be +/// inverted +////////////////////////////////////////// + + +DEFINE_ACTION_FUNCTION flip_area + STR_VAR area="" + file_loc="" + script_array="" +BEGIN + // get the wed file + COPY_EXISTING "%area%.are" override + READ_ASCII 0x8 wed + BUT_ONLY + // edit the wed file + ACTION_IF !FILE_EXISTS_IN_GAME "%wed%.wed" BEGIN + FAIL "The WED file %wed%.wed does not exist" + END + COPY_EXISTING + "%wed%.wed" override + "%wed%n.wed" override + // get the width in pixels of the area + READ_LONG 0x10 overlay_off + READ_SHORT overlay_off num_tiles_x + READ_SHORT overlay_off+2 num_tiles_y + SET width_total=num_tiles_x*0x40 + // get vertex, polygon offsets + READ_LONG 0x14 sec_header_off + READ_LONG (0x8+sec_header_off) initial_vertex_offset + READ_LONG sec_header_off wall_polygon_number + READ_LONG (0x4 + sec_header_off) initial_polygon_offset + // go through polygons + FOR (n=0;n=0 BEGIN + LPF flip_tile INT_VAR height=num_tiles_y width=num_tiles_x tile_number RET new_number END + SET $new_secondary_arr("%new_tile_ind%")=new_number + END ELSE BEGIN + SET $new_secondary_arr("%new_tile_ind%") = "-1" + END + READ_BYTE (offset_old + 6) flags + SET $new_flags_arr("%new_tile_ind%")=flags + // move on to next index + new_tile_ind+=1 + END + END + // write the new tileset + FOR (ind=0;ind=0 BEGIN + SET $sec_tiles("%ind%")=sec_tile + END + READ_BYTE (tilemap_start + ind*0xa + 0x6) overlay_flags + PATCH_IF overlay_flags>0 BEGIN + SET $tile_overlay_flags("%ind%")=overlay_flags + WRITE_BYTE (tilemap_start + ind*0xa + 0x6) 0 + WRITE_SHORT (tilemap_start + ind*0xa + 0x4) "-1" + END + READ_SHORT (tilemap_start + ind*0xa + 0x2) num_tiles + PATCH_IF num_tiles>0 BEGIN + + END + END + + // go through and make changes + PHP_EACH sec_tiles AS primary_ind=>secondary_ind BEGIN + LPF flip_tile INT_VAR height=num_tiles_y width=num_tiles_x tile_number=primary_ind RET new_primary=new_number END + LPF flip_tile INT_VAR height=num_tiles_y width=num_tiles_x tile_number=secondary_ind RET new_secondary=new_number END + WRITE_SHORT (tilemap_start + new_primary*0xa + 0x4) new_secondary + END + PHP_EACH tile_overlay_flags AS primary_ind=>flag BEGIN + LPF flip_tile INT_VAR height=num_tiles_y width=num_tiles_x tile_number=primary_ind RET new_primary=new_number END + flags = $tile_overlay_flags("%primary_ind%") + WRITE_BYTE (tilemap_start + new_primary*0xa + 0x6) flags + END + */ + + // remap doors + + READ_LONG 0xc num_doors + READ_LONG 0x18 door_off + READ_LONG 0x1c door_tile_off + FOR (ind=0;indact_off BEGIN + LPF flip_vertex INT_VAR width_total offset=act_off+0x20 END + LPF flip_vertex INT_VAR width_total offset=act_off+0x24 END + LPF flip_orientation INT_VAR offset=0x34+act_off END + END + // flip regions + GET_OFFSET_ARRAY reg_arr ARE_V10_REGIONS + PHP_EACH reg_arr AS ind=>reg_off BEGIN + LPF flip_bounding_box INT_VAR layout=2 width_total offset=reg_off+0x22 END + LPF flip_vertex INT_VAR width_total offset=reg_off+0x70 END + LPF flip_vertex INT_VAR width_total offset=reg_off+0x84 END + READ_SHORT reg_off+0x2c initial_vertex_index + READ_SHORT reg_off+0x2a vertex_number + LPF invert_vertex_sequence_order INT_VAR initial_vertex_offset=vert_off initial_vertex_index vertex_number width_total END + + END + // flip spawn points + GET_OFFSET_ARRAY spawn_arr ARE_V10_SPAWN_POINTS + PHP_EACH spawn_arr AS ind=>spawn_off BEGIN + LPF flip_vertex INT_VAR width_total offset=spawn_off+0x20 END + END + // flip entrances + GET_OFFSET_ARRAY ent_arr ARE_V10_ENTRANCES + PHP_EACH ent_arr AS ind=>ent_off BEGIN + LPF flip_vertex INT_VAR width_total offset=ent_off+0x20 END + LPF flip_orientation INT_VAR offset=0x24+ent_off END + END + // flip containers + GET_OFFSET_ARRAY cont_arr ARE_V10_CONTAINERS + PHP_EACH cont_arr AS ind=>cont_off BEGIN + LPF flip_vertex INT_VAR width_total offset=cont_off+0x20 END + LPF flip_vertex INT_VAR width_total offset=cont_off+0x34 END + LPF flip_bounding_box INT_VAR layout=2 width_total offset=cont_off+0x38 END + READ_LONG cont_off+0x50 initial_vertex_index + READ_LONG cont_off+0x54 vertex_number + LPF invert_vertex_sequence_order INT_VAR initial_vertex_offset=vert_off initial_vertex_index vertex_number width_total END + END + // flip ambients + GET_OFFSET_ARRAY amb_arr ARE_V10_AMBIENTS + PHP_EACH amb_arr AS ind=>amb_off BEGIN + LPF flip_vertex INT_VAR width_total offset=amb_off+0x20 END + END + // flip doors + GET_OFFSET_ARRAY door_arr ARE_V10_DOORS + PHP_EACH door_arr AS ind=>door_off BEGIN + LPF flip_vertex INT_VAR width_total offset=door_off+0x74 END + LPF flip_vertex INT_VAR width_total offset=door_off+0x90 END + LPF flip_vertex INT_VAR width_total offset=door_off+0x94 END + LPF flip_bounding_box INT_VAR layout=2 width_total offset=door_off+0x38 END + LPF flip_bounding_box INT_VAR layout=2 width_total offset=door_off+0x40 END + READ_LONG door_off+0x2c initial_vertex_index + READ_SHORT door_off+0x30 vertex_number + LPF invert_vertex_sequence_order INT_VAR initial_vertex_offset=vert_off initial_vertex_index vertex_number width_total END + READ_LONG door_off+0x34 initial_vertex_index + READ_SHORT door_off+0x32 vertex_number + LPF invert_vertex_sequence_order INT_VAR initial_vertex_offset=vert_off initial_vertex_index vertex_number width_total END + READ_LONG door_off+0x48 initial_vertex_index + READ_SHORT door_off+0x4c vertex_number + LPF invert_vertex_sequence_order INT_VAR is_searchmap=1 initial_vertex_offset=vert_off initial_vertex_index vertex_number width_total END + READ_LONG door_off+0x50 initial_vertex_index + READ_SHORT door_off+0x4e vertex_number + LPF invert_vertex_sequence_order INT_VAR is_searchmap=1 initial_vertex_offset=vert_off initial_vertex_index vertex_number width_total END + + END + // flip animations + GET_OFFSET_ARRAY anim_arr ARE_V10_ANIMATIONS + PHP_EACH anim_arr AS ind=>anim_off BEGIN + LPF flip_vertex INT_VAR width_total offset=anim_off+0x20 END + END + // flip automap notes + GET_OFFSET_ARRAY auto_arr 0xc4 4 0xc8 4 0 0 0x34 + PHP_EACH auto_arr AS ind=>auto_off BEGIN + LPF flip_vertex INT_VAR width_total offset=auto_off END + END + BUT_ONLY + // copy over the inverted files + + COPY "%file_loc%/%area%sr.bmp" override + COPY "%file_loc%/%area%ht.bmp" override + COPY "%file_loc%/%area%lm.bmp" override + + ACTION_IF FILE_EXISTS_IN_GAME "%file_loc%/%area%ln.bmp" THEN BEGIN + COPY "%file_loc%/%area%ln.bmp" override + END + + ACTION_IF GAME_IS "bg2ee iwdee eet bgee" BEGIN + COPY "%file_loc%/%area%.tis" override + COPY "%file_loc%/%area%N.tis" override IF_EXISTS + ACTION_BASH_FOR "%file_loc%" ".*\.pvrz" BEGIN + COPY "%BASH_FOR_FILESPEC%" override + END + END ELSE BEGIN + COPY "%file_loc%/%area%v.tis" "override/%area%.tis" + COPY "%file_loc%/%area%vn.tis" "override/%area%n.tis" IF_EXISTS + END + + // invert any scripts + ACTION_IF "%script_array%" STRING_COMPARE "" BEGIN + ACTION_PHP_EACH "%script_array%" AS script=>discard BEGIN + COPY_EXISTING "%script%.bcs" override + DECOMPILE_AND_PATCH BEGIN + REPLACE_EVALUATE "\[\([0-9]+\)\.\([0-9]+\)\],\([NSEW]\)+)" BEGIN + SET xnew=width_total - "%MATCH1%" + SET ynew="%MATCH2%" + INNER_PATCH_SAVE orientation "%MATCH3%" BEGIN + REPLACE_TEXTUALLY E Q + REPLACE_TEXTUALLY W E + REPLACE_TEXTUALLY Q W + END + END + "[%xnew%.%ynew%],%orientation%)" + END + BUT_ONLY + END + END + + + + + +END + +////////////////////////////////////////// +/// Take a tile and flip its index L-R +////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION flip_tile + INT_VAR height=0 + width=0 + tile_number=0 + RET new_number +BEGIN + base = (tile_number / width ) * width + residue = tile_number - base + residue = (width - 1) - residue + new_number = base + residue +END + + +////////////////////////////////////////// +/// Take an orientation and flip it L-R +////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION flip_orientation + INT_VAR offset=0 +BEGIN + WRITE_SHORT offset (0x10 - SHORT_AT offset) +END + + +////////////////////////////////////////// +/// Take a vertex and flip it L/R +////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION flip_vertex + INT_VAR width_total=0 + offset=0 + is_searchmap=0 +BEGIN + PATCH_IF is_searchmap BEGIN + width_total = (width_total * 4) / 64 + END + PATCH_IF SHORT_AT offset>=0 BEGIN + WRITE_SHORT offset (width_total - SHORT_AT offset) + END +END + +////////////////////////////////////////// +/// Take a bounding box and flip it L/R +/// +/// Multiple layouts. 1=LRTB, 2=LTRB +/// +////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION flip_bounding_box + INT_VAR width_total=0 + offset=0 + layout=0 +BEGIN + PATCH_MATCH "%layout%" WITH + 1 BEGIN step=2 END + 2 BEGIN step=4 END + DEFAULT + PATCH_FAIL "unknown bounding box layout" + END + READ_SHORT offset left + READ_SHORT (offset+step) right + WRITE_SHORT offset (width_total - right) + WRITE_SHORT (offset+step) (width_total - left) +END + +////////////////////////////////////////// +/// Take the sequence of vertices defining a polygon. +/// Flip each element, then reverse the order, from +/// 0 1 2 3 ... N to 0 N ... 3 2 1 +////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION invert_vertex_sequence_order + INT_VAR initial_vertex_offset=0 + initial_vertex_index=0 + vertex_number=0 + width_total=0 + is_searchmap=0 +BEGIN + // flip individual elements + FOR (n=0;n2 BEGIN + data_length = (vertex_number - 1)*4 + READ_ASCII initial_vertex_offset + 4*(initial_vertex_index + 1) data (data_length) + LPF invert_string INT_VAR block_size=4 STR_VAR string="%data%" RET data_new=string END + WRITE_ASCIIE initial_vertex_offset + 4*(initial_vertex_index + 1) "%data_new%" + END +END + +////////////////////////////////////////// +/// Take a string of M x N elements, treat +/// it as M N-element-long substrings, +/// and invert it +////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION invert_string + INT_VAR block_size=0 + STR_VAR string="" + RET string +BEGIN + SET number=(STRING_LENGTH "%string%") / block_size + SPRINT string_old "%string%" + SPRINT string "" + INNER_PATCH "%string_old%" BEGIN + FOR (n=0;n0) + END + PATCH_IF in_bounds BEGIN + INNER_PATCH_SAVE vertices "XXXXXXXX" BEGIN + WRITE_SHORT 0x0 x1_out + WRITE_SHORT 0x2 y1_out + WRITE_SHORT 0x4 x2_out + WRITE_SHORT 0x6 y2_out + END + END +END + + + +/* + +Truncate a polygon onto a rectangle (and also return its bounding box) + +This is a non-trivial mathematical problem. Naive solutions end up getting confused when corners get cut off, or +when a line between two points crosses the boundary twice. + +Here's my solution: + +- work through consecutive pairs (P1,P2), copying them to a new file +Step 1: +- if P1 is inside, add it +- if P1 is outside, and in a face region (i.e. in bounds one way but not another, add a placeholder token (a 4-character string, 'xmin','ymax' etc) +- if P1 is outside, and in a corner region (i.e. out of bounds in both ways) add the appropriate corner +Step 2: +- add any crossing point(s) between P1 and P2 + +Then go through again. Any transitions between faces get replaced by the associated corner + +To complicate matters, polygons *mostly* need to be listed with the highest-y-value (i.e. lowest) point first. +But this is not *always* true, and sometimes forcing the order breaks the polygon. What the actual rule is, I don't know, +despite an afternoon's research. + +So: the plan is, ain't broke don't fix. *If* the first polygon obeys the rule, *and* it gets truncated, then we'll reorder. Otherwise, not. + +This generates duplicates, so deduplicate it at the end. +*/ + +DEFINE_PATCH_FUNCTION truncate_polygon + INT_VAR xmax=0 + ymax=0 + xmin=0 + ymin=0 + bb_ymax=0 + STR_VAR vertices="" + RET vertices + bb_xmin + bb_xmax + bb_ymin + bb_ymax +BEGIN + // initialise + SPRINT vertices_old "%vertices%" + SPRINT vertices "" + SET bb_xmin=99999 + SET bb_xmax=0 + SET bb_ymin=99999 + SET bb_ymax=0 + SET count=(STRING_LENGTH "%vertices_old%") / 4 + // check if we need to reorder + LPF get_vertex INT_VAR ind=0 STR_VAR vertices="%vertices_old%" RET x y END + PATCH_IF y=bb_ymax BEGIN + LPF find_quadrant INT_VAR x y xmin xmax ymin ymax RET quadrant END + PATCH_IF "%quadrant%" STRING_EQUAL_CASE null BEGIN + try_reordering=0 + END ELSE BEGIN + try_reordering=1 + END + END ELSE BEGIN + try_reordering=0 + END + + // start going through pairs + SET ind=0 + WHILE ind=0 BEGIN + LPF append_to_vertices INT_VAR x=xcross1 y=ycross1 STR_VAR vertices RET vertices END + LPF update_bb INT_VAR x=xcross1 y=ycross1 bb_xmin bb_xmax bb_ymin bb_ymax RET bb_xmin bb_xmax bb_ymin bb_ymax END + END + PATCH_IF xcross2>=0 BEGIN + LPF append_to_vertices INT_VAR x=xcross2 y=ycross2 STR_VAR vertices RET vertices END + LPF update_bb INT_VAR x=xcross2 y=ycross2 bb_xmin bb_xmax bb_ymin bb_ymax RET bb_xmin bb_xmax bb_ymin bb_ymax END + END + ind +=1 + END // end of main WHILE loop + // to handle cyclical cases, append the last four bytes to the beginning, if it's an out-of-bounds point + INNER_PATCH_SAVE vertices "%vertices%" BEGIN + READ_ASCII 0x0 first (4) + READ_ASCII (BUFFER_LENGTH - 4) last (4) + PATCH_MATCH "%first%" WITH + xmin xmax ymin ymax BEGIN + END + DEFAULT + SPRINT first "" + END + END + SPRINT vertices "%vertices%"^"%first%" + // compress direction changes into corners + INNER_PATCH_SAVE vertices "%vertices%" BEGIN + REPLACE_TEXTUALLY "xmaxymax" xypp + REPLACE_TEXTUALLY "ymaxxmax" xypp + REPLACE_TEXTUALLY "xminymax" xymp + REPLACE_TEXTUALLY "ymaxxmin" xymp + REPLACE_TEXTUALLY "xmaxymin" xypm + REPLACE_TEXTUALLY "yminxmax" xypm + REPLACE_TEXTUALLY "xminymin" xymm + REPLACE_TEXTUALLY "yminxmin" xymm + END + // work out corner code + INNER_PATCH_SAVE xymm xxxx BEGIN + WRITE_SHORT 0x0 xmin + WRITE_SHORT 0x2 ymin + END + INNER_PATCH_SAVE xypm xxxx BEGIN + WRITE_SHORT 0x0 xmax + WRITE_SHORT 0x2 ymin + END + INNER_PATCH_SAVE xymp xxxx BEGIN + WRITE_SHORT 0x0 xmin + WRITE_SHORT 0x2 ymax + END + INNER_PATCH_SAVE xypp xxxx BEGIN + WRITE_SHORT 0x0 xmax + WRITE_SHORT 0x2 ymax + END + // substitute them in and remove any residual entries + INNER_PATCH_SAVE vertices "%vertices%" BEGIN + + PATCH_FOR_EACH var IN xymm xymp xypm xypp BEGIN + SPRINT val EVAL "%%var%%" + REPLACE_TEXTUALLY "%var%" "%val%" + END + PATCH_FOR_EACH var IN xmin xmax ymin ymax BEGIN + REPLACE_TEXTUALLY "%var%" "" + END + END + // get rid of duplicates + LPF deduplicate_vertices STR_VAR vertices RET vertices END + PATCH_IF try_reordering BEGIN + LPF order_wall_vertices STR_VAR vertices RET vertices END + END +END + + +DEFINE_PATCH_FUNCTION update_bb + INT_VAR x=0 + y=0 + bb_xmin=0 + bb_xmax=0 + bb_ymin=0 + bb_ymax=0 + RET bb_xmin bb_xmax bb_ymin bb_ymax +BEGIN + bb_xmin=(bb_xminx)? bb_xmax : x + bb_ymin=(bb_yminy)? bb_ymax : y +END + +DEFINE_PATCH_FUNCTION append_to_vertices + INT_VAR x=0 + y=0 + STR_VAR vertices="" + RET vertices +BEGIN + INNER_PATCH_SAVE vertices "%vertices%" BEGIN + SET insert_point=BUFFER_LENGTH + INSERT_BYTES insert_point 4 + WRITE_SHORT insert_point x + WRITE_SHORT (insert_point+2) y + END +END + +DEFINE_PATCH_FUNCTION get_vertex + INT_VAR ind=0 + STR_VAR vertices="" + RET x y +BEGIN + INNER_PATCH "%vertices%" BEGIN + READ_SHORT (4*ind) x + READ_SHORT (4*ind)+2 y + END +END + +DEFINE_PATCH_FUNCTION deduplicate_vertices + STR_VAR vertices="" + RET vertices +BEGIN + INNER_PATCH_SAVE vertices "%vertices%" BEGIN + PATCH_IF BUFFER_LENGTH >=8 BEGIN + SET insert_point=4 + READ_ASCII 0x0 datalast (4) + SET length=BUFFER_LENGTH + WHILE insert_pointymax ) BEGIN + SET ymax=y + // SET xmax=x + SET ind_start=ind + END + END + PATCH_IF ind_start>0 BEGIN + INNER_PATCH_SAVE vertices "%vertices%" BEGIN + SET length=ind_start * 4 + READ_ASCII 0x0 data (length) + DELETE_BYTES 0x0 length + END + SPRINT vertices "%vertices%"^"%data%" + END + // now deal with that edge case + INNER_PATCH_SAVE vertices "%vertices%" BEGIN + READ_SHORT 0x2 y_first + READ_SHORT (BUFFER_LENGTH - 0x2) y_last + PATCH_IF y_last=y_first BEGIN + READ_ASCII (BUFFER_LENGTH - 0x4) last_vertex (4) + DELETE_BYTES (BUFFER_LENGTH - 0x4) 4 + INSERT_BYTES 0x0 4 + WRITE_ASCIIE 0x0 "%last_vertex%" + END + END +END + + + +////////////////////////////////////////// +/// Assess whether a given (x,y) pair is +/// in or out of bounds. +/// +/// Also return where it is if out of bounds +////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION point_in_bounds + INT_VAR x=0 + xmin=0 + xmax=0 + y=0 + ymin=0 + ymax=0 + RET in_bounds + x_in_bounds + y_in_bounds +BEGIN + x_in_bounds=(x>=xmin && x<=xmax ? 1 : 0) || (x<0) + y_in_bounds=(y>=ymin && y<=ymax ? 1 : 0) || (y<0) + in_bounds = x_in_bounds * y_in_bounds +END + + +////////////////////////////////////////// +/// Check if two rectangles overlap +////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION rectangle_overlap + INT_VAR xmin_1=0 + xmax_1=0 + ymin_1=0 + ymax_1=0 + xmin_2=0 + xmax_2=0 + ymin_2=0 + ymax_2=0 + RET overlap +BEGIN + LPF point_in_bounds INT_VAR x=xmin_1 y=ymin_1 xmin=xmin_2 xmax=xmax_2 ymin=ymin_2 ymax=ymax_2 RET in_bounds_1=in_bounds END + LPF point_in_bounds INT_VAR x=xmin_1 y=ymax_1 xmin=xmin_2 xmax=xmax_2 ymin=ymin_2 ymax=ymax_2 RET in_bounds_2=in_bounds END + LPF point_in_bounds INT_VAR x=xmax_1 y=ymin_1 xmin=xmin_2 xmax=xmax_2 ymin=ymin_2 ymax=ymax_2 RET in_bounds_3=in_bounds END + LPF point_in_bounds INT_VAR x=xmax_1 y=ymax_1 xmin=xmin_2 xmax=xmax_2 ymin=ymin_2 ymax=ymax_2 RET in_bounds_4=in_bounds END + SET overlap = in_bounds_1 || in_bounds_2 || in_bounds_3 || in_bounds_4 +END + +////////////////////////////////////////// +/// Find what quadrant a point is in +////////////////////////////////////////// + + +DEFINE_PATCH_FUNCTION find_quadrant + INT_VAR x=0 + xmin=0 + xmax=0 + y=0 + ymin=0 + ymax=0 + RET quadrant +BEGIN + PATCH_IF (yxmax) BEGIN + SPRINT quadrant "xypm" + END ELSE BEGIN + SPRINT quadrant ymin + END + END ELSE + PATCH_IF (y>ymax) BEGIN + PATCH_IF xxmax) BEGIN + SPRINT quadrant "xypp" + END ELSE BEGIN + SPRINT quadrant ymax + END + END ELSE BEGIN + PATCH_IF xxmax) BEGIN + SPRINT quadrant xmax + END ELSE BEGIN + SPRINT quadrant null + END + END +END + + +DEFINE_ACTION_FUNCTION point_in_bounds + INT_VAR x=0 + xmin=0 + xmax=0 + y=0 + ymin=0 + ymax=0 + RET in_bounds + x_in_bounds + y_in_bounds +BEGIN + OUTER_INNER_PATCH "" BEGIN + LPF point_in_bounds + INT_VAR x xmin xmax y ymin ymax + RET in_bounds x_in_bounds y_in_bounds + END + END +END + +//////////////////////////////////////////////////// +/// Function to find when there is a crossing point +/// on a boundary between two points. If there are +/// two, return the closest one to the first point +//////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION find_crossing_points + INT_VAR x1=0 + x2=0 + y1=0 + y2=0 + xmin=0 + xmax=0 + ymin=0 + ymax=0 + RET xcross1 + ycross1 + xcross2 + ycross2 +BEGIN + // find the four crossing points + LPF l_r_crossing_point INT_VAR x1 x2 y1 y2 bdy=xmin RET cr_x_1=xcross cr_y_1=ycross END + LPF l_r_crossing_point INT_VAR x1 x2 y1 y2 bdy=xmax RET cr_x_2=xcross cr_y_2=ycross END + LPF u_d_crossing_point INT_VAR x1 x2 y1 y2 bdy=ymin RET cr_x_3=xcross cr_y_3=ycross END + LPF u_d_crossing_point INT_VAR x1 x2 y1 y2 bdy=ymax RET cr_x_4=xcross cr_y_4=ycross END + // check if they're in bounds and, if so, work out their x^2-distance from the first point + xcross1="-1" + ycross1="-1" + xcross2="-1" + ycross2="-1" + score=99999 + FOR (i=1;i<=4;i+=1) BEGIN + x=$cr_x("%i%") + y=$cr_y("%i%") + LPF point_in_bounds INT_VAR x y xmin xmax ymin ymax RET in_bounds END + PATCH_IF in_bounds BEGIN + this_score=(x - x1)*(x - x1) + PATCH_IF this_scorebdy BEGIN + PATCH_IF x2>bdy BEGIN + SET exists=0 // if both on RHS, no crossing + END ELSE BEGIN // swap over, so (x1,y1) on LHS + SET xtemp=x1 + SET ytemp=y1 + SET x1=x2 + SET y1=y2 + SET x2=xtemp + SET y2=ytemp + END + END ELSE BEGIN + PATCH_IF x20 BEGIN + PATCH_PRINT "attempting to fix by zero-padding" + insert_point=actual_size + INSERT_BYTES insert_point diff + WHILE insert_point= ymax) ) BEGIN + SPRINT row_out "" + row_empty=1 + END ELSE BEGIN + SET length=((xmax - xmin) * multiplier )/ divisor + INNER_PATCH "%row%" BEGIN + DELETE_BYTES 0x0 ((xmin * multiplier) / divisor) + READ_ASCII 0x0 row_out (length) + END + length_round_down = (length / 4) * 4 + PATCH_IF length=length_round_down BEGIN + length_round_up=length + END ELSE BEGIN + length_round_up=length_round_down + 4 + END + pad = length_round_up - length + PATCH_IF pad>0 BEGIN + INNER_PATCH_SAVE row_out "%row_out%" BEGIN + insert_point=BUFFER_LENGTH + INSERT_BYTES insert_point pad + FOR (i=0;iactor_out_of_bounds + delete_trigger=>trigger_out_of_bounds + delete_mapnote=>mapnote_out_of_bounds + delete_container=>container_out_of_bounds + delete_door=>door_out_of_bounds + delete_entrance=>generic_out_of_bounds + delete_animation=>generic_out_of_bounds + delete_ambient=>generic_out_of_bounds + delete_spawn=>generic_out_of_bounds + END + LAF edit_area STR_VAR area edits=all_deletes END + ACTION_DEFINE_ASSOCIATIVE_ARRAY actor_shift BEGIN + actor_x_coord_start=>~actor_x_coord_start in slide_x~ + actor_y_coord_start=>~actor_y_coord_start in slide_y~ + actor_x_coord_dest=>~actor_x_coord_dest in slide_x~ + actor_y_coord_dest=>~actor_y_coord_dest in slide_y~ + END + ACTION_DEFINE_ASSOCIATIVE_ARRAY mapnote_shift BEGIN + mapnote_xloc =>~mapnote_xloc in slide_x~ + mapnote_yloc =>~mapnote_yloc in slide_y~ + END + ACTION_DEFINE_ASSOCIATIVE_ARRAY spawn_shift BEGIN + spawn_xloc =>~spawn_xloc in slide_x~ + spawn_yloc =>~spawn_yloc in slide_y~ + END + ACTION_DEFINE_ASSOCIATIVE_ARRAY entrance_shift BEGIN + entrance_xloc =>~entrance_xloc in slide_x~ + entrance_yloc =>~entrance_yloc in slide_y~ + END + ACTION_DEFINE_ASSOCIATIVE_ARRAY container_shift BEGIN + container_xloc =>~container_xloc in slide_x~ + container_yloc =>~container_yloc in slide_y~ + container_trap_xloc =>~container_trap_xloc in slide_x~ + container_trap_yloc =>~container_trap_yloc in slide_y~ + container_top_left=>~container_top_left in slide_x~ // these are misnomers + container_top_right=>~container_top_right in slide_y~ // these are misnomers + container_bottom_right=>~container_bottom_right in slide_x~ // these are misnomers + container_bottom_left=>~container_bottom_left in slide_y~ // these are misnomers + END + ACTION_DEFINE_ASSOCIATIVE_ARRAY ambient_shift BEGIN + ambient_xloc =>~ambient_xloc in slide_x~ + ambient_yloc =>~ambient_yloc in slide_y~ + END + ACTION_DEFINE_ASSOCIATIVE_ARRAY animation_shift BEGIN + animation_xloc =>~animation_xloc in slide_x~ + animation_yloc =>~animation_yloc in slide_y~ + END + ACTION_DEFINE_ASSOCIATIVE_ARRAY vertex_shift BEGIN + vertex_xloc =>~vertex_xloc in slide_x~ + vertex_yloc =>~vertex_yloc in slide_y~ + END + ACTION_DEFINE_ASSOCIATIVE_ARRAY searchmap_vertex_shift BEGIN + vertex_xloc =>~vertex_xloc in searchmap_slide_x~ + vertex_yloc =>~vertex_yloc in searchmap_slide_y~ + END + ACTION_DEFINE_ASSOCIATIVE_ARRAY main_patch BEGIN + patch_actor=>actor_shift + patch_mapnote=>mapnote_shift + patch_spawn=>spawn_shift + patch_entrance=>entrance_shift + patch_container=>container_shift + patch_ambient=>ambient_shift + patch_animation=>animation_shift + patch_trigger_inline=>~slide_trigger=>null~ + patch_door_inline=>~slide_door=>null~ + patch_door_vertex_open=>vertex_shift + patch_door_vertex_closed=>vertex_shift + patch_door_vertex_open_impeded=>searchmap_vertex_shift + patch_door_vertex_closed_impeded=>searchmap_vertex_shift + patch_trigger_vertex=>vertex_shift + patch_container_vertex=>vertex_shift + + + END + LAF edit_area STR_VAR area edits=main_patch END +END + + +/////////////////////////////////////////////////////////// +//// Take a 4-bit spat out by Photoshop and remap +//// it to the standard 4-bit SR palette. (Use L^2 distance +//// in color space if no exact match) +//// +//// (I have tried to add 8bit=>4bit to this, but it's erratic +//// and not a priority to fix) +///////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION remap_search_map_colors + STR_VAR map="" + reference="" + map_out="" +BEGIN + + // load in the target map colors + COPY "%map%" override + READ_SHORT 0x1c bitcount + READ_LONG 0x0a data_off + READ_LONG 0x2e colors_used + PATCH_IF colors_used=0 BEGIN + SET colors_used=0x10 + END + FOR (ind=0;ind%j%" + END ELSE BEGIN + ACTION_IF distance0 BEGIN + PRINT "nearest match for %i%: %nearest% (distance = %distance_minimum%)" + OUTER_SET $color_map("%i%")=nearest + END + END + + + // now go through the target data + COPY "%map%" "%map_out%" + // set type + + WRITE_SHORT 0x1c 4 + + // insert space for new color block + delta = 0x40 - 4* colors_used + WRITE_SHORT 0x2 (SHORT_AT 0x2 + delta) + WRITE_LONG 0xa (LONG_AT 0xa + delta) + DELETE_BYTES 0x36 (4*colors_used) + INSERT_BYTES 0x36 0x40 + + WRITE_LONG 0x2e 16 + WRITE_LONG 0x32 16 + + WRITE_ASCIIE 0x36 "%color_block%" (0x40) + FOR (ind=0;ind<0x36;ind +=2) BEGIN + READ_SHORT ind data + SPRINT $data_new("%ind%") "%data%" + END + offset=0x76 + length=BUFFER_LENGTH + WHILE offsetpoly_off BEGIN + READ_SHORT 0xa+poly_off bb_l + READ_SHORT 0xc+poly_off bb_r + READ_SHORT 0xe+poly_off bb_t + READ_SHORT 0x10+poly_off bb_b + PATCH_IF (xminbb_l && yminbb_b) BEGIN + SPRINT output "%output%%poly_ind% " + END + END + BUT_ONLY + LAF log_this STR_VAR file="%output_file%" input="%output%" END +END + +DEFINE_ACTION_FUNCTION duplicate_area + STR_VAR area_old="" + area_new="" +BEGIN + + OUTER_INNER_PATCH_SAVE pvrz_old "%area_old%" BEGIN + DELETE_BYTES 0x1 1 + END + + OUTER_INNER_PATCH_SAVE pvrz_new "%area_new%" BEGIN + DELETE_BYTES 0x1 1 + END + + + COPY_EXISTING "%area_old%.are" "override/%area_new%.are" + WRITE_ASCII 0x8 "%area_new%" + + COPY_EXISTING "%area_old%.wed" "override/%area_new%.wed" + WRITE_ASCII 0x24 "%area_new%" + + COPY_EXISTING "%area_old%.tis" "override/%area_new%.tis" + + OUTER_FOR (ind=0;ind<100;ind+=1) BEGIN + ACTION_IF ind<10 BEGIN + OUTER_SPRINT digits "0%ind%" + END ELSE BEGIN + OUTER_SPRINT digits "%ind%" + END + ACTION_IF FILE_EXISTS_IN_GAME "%pvrz_old%%digits%.pvrz" BEGIN + COPY_EXISTING "%pvrz_old%%digits%.pvrz" "override/%pvrz_new%%digits%.pvrz" + END + END + + + COPY_EXISTING "%area_old%sr.bmp" "override/%area_new%sr.bmp" + "%area_old%lm.bmp" "override/%area_new%lm.bmp" + "%area_old%ht.bmp" "override/%area_new%ht.bmp" + + +END + +/////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION add_wed_door + STR_VAR name="" + tiles="" +BEGIN + READ_LONG 0xc door_count + READ_LONG 0x18 door_off + READ_LONG 0x1c door_tilemap_lookup_off + READ_LONG 0x9c wall_poly_off + READ_LONG 0xa0 vertex_off + READ_LONG 0xa4 wallgroup_off + READ_LONG 0xa9 wall_poly_lookup_off + READ_LONG 0x10 overlay_off + READ_LONG 0x8 overlay_count + + // get tile data + + tile_count=0 + PATCH_CLEAR_ARRAY tile_data + WHILE "%tiles%" STRING_COMPARE "" BEGIN + LPF return_first_pair STR_VAR list="%tiles%" RET key value tiles=list END + SPRINT $tile_data("%key%") "%value%" + tile_count +=1 + END + + + // clone last door + + READ_ASCII (door_off + 0x1a* (door_count - 1) ) data (0x1a) + INSERT_BYTES (door_off + 0x1a*door_count) 0x1a + WRITE_ASCIIE (door_off + 0x1a*door_count) "%data%" + WRITE_ASCII (door_off + 0x1a*door_count) "%name%" (8) + READ_SHORT (door_off +0x1a*door_count + 0xc) last_tile_count + READ_SHORT (door_off +0x1a*door_count + 0xa) last_tile_off + new_tile_off=last_tile_off + last_tile_count + WRITE_SHORT (door_off +0x1a*door_count + 0xa) new_tile_off + WRITE_SHORT (door_off +0x1a*door_count + 0xc) tile_count + WRITE_SHORT (door_off +0x1a*door_count + 0xe) 0 + WRITE_SHORT (door_off +0x1a*door_count + 0x10) 0 + + + delta= 0x1a + + // adjust main offsets (assumes doors are first) + + PATCH_FOR_EACH address IN 0x1c 0x9c 0xa0 0xa4 0xa8 BEGIN + WRITE_LONG address ((LONG_AT address)+delta) + END + + + // adjust overlay offsets + + FOR (overlay_ind=0;overlay_inddiscard BEGIN + WRITE_SHORT offset+2*ind tile + ind+=1 + END + + + // adjust offsets again + PATCH_FOR_EACH address IN 0x9c 0xa0 0xa4 0xa8 BEGIN + WRITE_LONG address ((LONG_AT address)+delta2) + END + FOR (overlay_ind=0;overlay_indalt_tile BEGIN + WRITE_SHORT (4 + tilemap_off + 0xa * tile) alt_tile + END + + + + + +END + + diff --git a/iwdification/sfo/filetype/lib_wmp.tpa b/iwdification/sfo/filetype/lib_wmp.tpa new file mode 100644 index 0000000..dde5478 --- /dev/null +++ b/iwdification/sfo/filetype/lib_wmp.tpa @@ -0,0 +1,661 @@ +// this all assumes ONE ENTRY + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// overarching clone +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION clone_worldmap + STR_VAR + worldmap="" + edits="" + editstring="" + BEGIN + LAUNCH_ACTION_FUNCTION clone_template + STR_VAR file_list= ~%worldmap%~ + file_ext=~WMP~ + edits + editstring + END +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// overarching edit +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION edit_worldmap + STR_VAR + worldmap="" + edits="" + editstring="" + BEGIN + LAUNCH_ACTION_FUNCTION edit_template + STR_VAR file_list= ~%worldmap%~ + file_ext=~WMP~ + edits + editstring + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// overarching make +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION make_worldmap + STR_VAR + worldmap="" + edits="" + editstring="" + BEGIN + LAUNCH_ACTION_FUNCTION make_template + STR_VAR file_list= ~%worldmap%~ + file_ext=~WMP~ + edits + editstring + build_before=WMP_build + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// offsets +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +<<<<<<<< area_offsets.2da +TYPE offset_loc offset_length entrynum_loc entrynum_length entry_length +area 0x34 4 0x30 4 0xf0 +link 0x38 4 0x3c 4 0xd8 +>>>>>>>> +OUTER_SPRINT ~offset_readin_lookup_2da~ ~area_offsets~ +OUTER_SPRINT ~offset_readin_file_ext~ ~WMP~ +LAUNCH_ACTION_MACRO read_in_offsets + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// simple data-field edits +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +ACTION_DEFINE_ASSOCIATIVE_ARRAY wmp_fields_absolute BEGIN + width=>"0x18,LONG" + height=>"0x1c,LONG" + icons=>"0x40,ASCII" + global_name_string=>"0x24,LONG" + map=>"0x10,ASCII" +END + +LAUNCH_ACTION_FUNCTION build_simple_data_field_editors STR_VAR lookup_table=wmp_fields_absolute function_prefix=WMP END + +ACTION_DEFINE_ASSOCIATIVE_ARRAY wmp_fields BEGIN + short_name=>"0x0,ASCII" + resource=>"0x8,ASCII" + long_name=>"0x10,ASCII20" + sequence=>"0x34,LONG" + x=>"0x38,LONG" + y=>"0x3c,LONG" + name_string=>"0x40,LONG" + tooltip_string=>"0x44,LONG" + loadscreen=>"0x48,ASCII" + area_link_ind_north=>"0x50,LONG" + area_link_ind_west=>"0x58,LONG" + area_link_ind_south=>"0x60,LONG" + area_link_ind_east=>"0x68,LONG" + area_link_num_north=>"0x54,LONG" + area_link_num_west=>"0x5c,LONG" + area_link_num_south=>"0x64,LONG" + area_link_num_east=>"0x6c,LONG" + link_dest_ind=>"0x0,LONG" + entrance=>"0x4,ASCII20" + link_travtime_div_four=>"0x24,LONG" + random_area_1=>"0x2c,ASCII" + random_area_2=>"0x34,ASCII" + random_area_3=>"0x3c,ASCII" + random_area_4=>"0x44,ASCII" + random_area_5=>"0x4c,ASCII" + random_prob=>"0x54,LONG" + link_entryloc_code=>"0x28,LONG" +END + +LAUNCH_ACTION_FUNCTION build_simple_data_field_editors STR_VAR offset_base=yes lookup_table=wmp_fields function_prefix=WMP END + +ACTION_DEFINE_ASSOCIATIVE_ARRAY wmp_bit_fields BEGIN + visible=>"0x30,0" + visible_from_adjacent=>"0x30,1" + reachable=>"0x30,2" + visited=>"0x30,3" +END + +LAF build_flag_data_field_editors STR_VAR offset_base=yes lookup_table=wmp_bit_fields function_prefix=WMP END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// set both name and tooltip to a strref +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION WMP_both_labels + STR_VAR arguments="" +BEGIN + LPF WMP_name_string STR_VAR arguments END + LPF WMP_tooltip_string STR_VAR arguments END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// set both names and resource to string +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION WMP_quick_resource + STR_VAR arguments="" +BEGIN + LPF WMP_short_name STR_VAR arguments END + LPF WMP_long_name STR_VAR arguments END + LPF WMP_resource STR_VAR arguments END +END +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// set the travel time +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION WMP_travel_time + STR_VAR arguments="" +BEGIN + SET arguments = arguments / 4 + LPF WMP_link_travtime_div_four STR_VAR arguments END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// set the default arrival direction +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION WMP_to_dir + STR_VAR arguments="" +BEGIN + TO_UPPER arguments + PATCH_MATCH "%arguments%" WITH + N NORTH BEGIN SET dir_code=1 END + S SOUTH BEGIN SET dir_code=4 END + E EAST BEGIN SET dir_code=2 END + W WEST BEGIN SET dir_code=8 END + DEFAULT SET dir_code=0 END + LPF WMP_link_entryloc_code STR_VAR arguments="%dir_code%" END +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// find name of an area by number +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION WMP_name_of_area + STR_VAR arguments=0 + RET value +BEGIN + GET_OFFSET_ARRAY area_arr 0x34 4 0x30 4 0 0 0xf0 + SET arr_off = $area_arr("%arguments%") + READ_ASCII arr_off value +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// find number of an area by name +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION WMP_index_of_area + STR_VAR arguments="" + RET value +BEGIN + SET value="-1" + GET_OFFSET_ARRAY area_arr 0x34 4 0x30 4 0 0 0xf0 + PHP_EACH area_arr AS int=>offset_base BEGIN + LPF WMP_read_short_name RET name=value END + PATCH_IF "%name%" STRING_EQUAL_CASE "%arguments%" BEGIN + SET value=int + END + END + PATCH_IF value < 0 BEGIN // maybe we need to look at the longname instead + PHP_EACH area_arr AS int=>offset_base BEGIN + LPF WMP_read_long_name RET name=value END + PATCH_IF "%name%" STRING_EQUAL_CASE "%arguments%" BEGIN + SET value=int + END + END + END + PATCH_IF value < 0 BEGIN // maybe we need to look at the longname instead + LPF warning STR_VAR warning="Cannot find area index for area name %arguments%" END + END +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// update link indices for areas on the assumption that the link "deleted" has been deleted +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION WMP_update_for_link_deletion + INT_VAR deleted=0 +BEGIN + GET_OFFSET_ARRAY area_arr 0x34 4 0x30 4 0 0 0xf0 + PHP_EACH area_arr AS int=>offset_base BEGIN + PATCH_FOR_EACH dir IN north south east west BEGIN + LPF "WMP_read_area_link_ind_%dir%" RET ind=value END + LPF "WMP_read_area_link_num_%dir%" RET num=value END + LPF WMP_link_deletion_update_helper INT_VAR ind num deleted RET ind=ind num=num END + LPF "WMP_area_link_ind_%dir%" STR_VAR arguments="%ind%" END + LPF "WMP_area_link_num_%dir%" STR_VAR arguments="%num%" END + END + END +END + +DEFINE_PATCH_FUNCTION WMP_link_deletion_update_helper + INT_VAR ind=0 + num=0 + deleted=0 + RET ind num +BEGIN + PATCH_IF (ind <= deleted && deleted < ind+num) BEGIN + SET num = num - 1 + END + PATCH_IF (deleted < ind) BEGIN + SET ind = ind - 1 + END + +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Create space for a link in the list at index new_ind +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION WMP_space_for_new_link + INT_VAR new_ind=0 + area_ind=0 + STR_VAR area_dir="" +BEGIN + GET_OFFSET_ARRAY area_arr 0x34 4 0x30 4 0 0 0xf0 + PHP_EACH area_arr AS int=>offset_base BEGIN + PATCH_FOR_EACH dir IN north south east west BEGIN + LPF "WMP_read_area_link_ind_%dir%" RET ind=value END + PATCH_IF new_indind BEGIN // if it's strictly greater, leave it alone + END ELSE BEGIN + // if it's the exit group we're actually adding this to, leave it alone + PATCH_IF !("%dir%" STRING_EQUAL_CASE "%area_dir%" & int=area_ind) BEGIN + // if it's of zero size, leave it where it is; otherwise, increment it + LPF "WMP_read_area_link_num_%dir%" RET num=value END + PATCH_IF num>0 BEGIN + SET ind += 1 + END + END + END + LPF "WMP_area_link_ind_%dir%" STR_VAR arguments="%ind%" END + END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Delete a list of links +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION WMP_delete_link + STR_VAR arguments="" +BEGIN + PATCH_IF "%arguments%" STRING_COMPARE "" BEGIN + LPF return_first_entry STR_VAR list="%arguments%" RET deleted=entry arguments=list END + // physically delete the bytes + SPRINT entry_type link + LPM get_offset_array + PHP_EACH offset_array AS ind=>offset BEGIN + PATCH_IF ind=deleted BEGIN + SET delete_at=offset + END + END + DELETE_BYTES delete_at 0xd8 + // update the number of links + WRITE_LONG 0x3c ((LONG_AT 0x3c) - 1) + // update the area data + LPF WMP_update_for_link_deletion INT_VAR deleted END + // update remaining deletions + LPF WMP_deletion_helper INT_VAR deleted STR_VAR to_delete="%arguments%" RET arguments=to_delete END + // recurse + LPF WMP_delete_link STR_VAR arguments END + END +END + +DEFINE_PATCH_FUNCTION WMP_deletion_helper // updates deletion index to allow for deletions already carried out + INT_VAR deleted=0 + STR_VAR to_delete="" + RET to_delete +BEGIN + SPRINT list "%to_delete%" + SPRINT to_delete "" + WHILE "%list%" STRING_COMPARE "" BEGIN + LPF return_first_entry STR_VAR list RET entry=entry list=list END + PATCH_IF entry>deleted BEGIN + SET entry = entry - 1 + END + SPRINT to_delete "%to_delete% %entry%" + END + +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Delete all links +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION WMP_delete_all_links +BEGIN + READ_LONG 0x3c linknum + WHILE linknum>0 BEGIN + LPF WMP_delete_link STR_VAR arguments=0 END + SET linknum=linknum - 1 + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Get a list of links between 2 areas (identified by name) +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION WMP_find_link_between + STR_VAR arguments="" + RET value +BEGIN + LPF return_first_pair STR_VAR list="%arguments%" RET from=key to=value END + LPF WMP_index_of_area STR_VAR arguments="%from%" RET from_code=value END + LPF WMP_index_of_area STR_VAR arguments="%to%" RET to_code=value END + LPF WMP_find_links_from INT_VAR arguments=from_code RET link_list=value END + SPRINT file_ext WMP + SPRINT value "" + SPRINT entry_type link + LPM get_offset_array + WHILE "%link_list%" STRING_COMPARE "" BEGIN + LPF return_first_entry STR_VAR list="%link_list%" RET link_list=list link=entry END + READ_SHORT $offset_array("%link%") dest + PATCH_IF dest=to_code BEGIN + LPF push STR_VAR head="%link%" tail="%value%" RET value=list END + END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Delete the link(s) between 2 areas (identified by name) +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION WMP_delete_link_between + STR_VAR arguments="" +BEGIN + LPF WMP_find_link_between STR_VAR arguments RET value=value END + LPF WMP_delete_link STR_VAR arguments="%value%" END + +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Edit the link(s) between 2 areas (identified by name) +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION WMP_edit_link_between + STR_VAR arguments="" + RET value +BEGIN + SPRINT patch "" + SPRINT from "" + SPRINT to "" + WHILE "%arguments%" STRING_COMPARE "" BEGIN + LPF return_first_pair STR_VAR list="%arguments%" RET key=key value=value arguments=list END + PATCH_MATCH "%key%" WITH + from BEGIN + SPRINT from "%value%" + END + to BEGIN + SPRINT to "%value%" + END + DEFAULT + SPRINT patch "%key% => %value% %patch%" + END + END + PATCH_IF "%from%" STRING_COMPARE "" && "%to%" STRING_COMPARE "" BEGIN + LPF WMP_find_link_between STR_VAR arguments="%from%=>%to%" RET linklist=value END + SPRINT entry_type link + SPRINT file_ext WMP + LPM get_offset_array + WHILE "%linklist%" STRING_COMPARE "" BEGIN + LPF return_first_entry STR_VAR list="%linklist%" RET link=entry linklist=list END + SET offset_base=$offset_array("%link%") + LPF apply_patches_inline STR_VAR arguments="%patch%" END + END + END ELSE BEGIN + LPF warning STR_VAR warning="Could not find from and to commands to edit link" END + END + SET value=1 + +END +OUTER_SPRINT $SFO_do_not_parse_arguments("WMP_edit_link_between") "" + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Find all links to the area with the given index +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION WMP_find_links_to + INT_VAR arguments=0 + RET value +BEGIN + SPRINT value "" + SPRINT entry_type link + SPRINT file_ext WMP + LPM get_offset_array + PHP_EACH offset_array AS int=>offset_base BEGIN + LPF WMP_read_link_dest_ind RET this_ind=value END + PATCH_IF this_ind=arguments BEGIN + SPRINT value "%value% %int%" + END + END +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Find all links from the area with the given index +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION WMP_find_links_from + INT_VAR arguments=0 + RET value +BEGIN + SPRINT entry_type area + SPRINT file_ext WMP + LPM get_offset_array + SET offset_base=$offset_array("%arguments%") + SPRINT value "" + PATCH_FOR_EACH dir IN north south east west BEGIN + LPF "WMP_read_area_link_ind_%dir%" RET ind=value END + LPF "WMP_read_area_link_num_%dir%" RET num=value END + FOR (i=0;i %value%" + END + END + PATCH_IF (!VARIABLE_IS_SET from_code | !VARIABLE_IS_SET to_code | !VARIABLE_IS_SET dir_from) BEGIN + LPF warning STR_VAR warning="Cannot insert area link: source or destination or direction of travel unspecified" END + END ELSE BEGIN + // insert link + LPF WMP_insert_link_by_codes INT_VAR area_ind=from_code STR_VAR area_dir="%dir_from%" RET offset_base=insert_offset END + // write destination + LPF WMP_link_dest_ind STR_VAR arguments="%to_code%" END + // patch + LPF apply_patches_inline INT_VAR offset_base STR_VAR filename file_ext=WMP editstring END + END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("WMP_insert_link") "" + + +DEFINE_PATCH_FUNCTION WMP_insert_link_by_codes + INT_VAR area_ind=0 + STR_VAR area_dir="" + RET insert_offset +BEGIN + // find link data + SPRINT entry_type area + SPRINT file_ext WMP + LPM get_offset_array + SET offset_base = $offset_array("%area_ind%") + LPF "WMP_read_area_link_ind_%area_dir%" RET ind=value END + LPF "WMP_read_area_link_num_%area_dir%" RET num=value END + // update offsets + SET new_num=num + 1 + LPF "WMP_area_link_num_%area_dir%" STR_VAR arguments="%new_num%" END + LPF WMP_space_for_new_link INT_VAR new_ind=ind area_ind STR_VAR area_dir END + + // physically insert space + READ_LONG 0x38 offset_base + SET link_num=ind+num + SET insert_offset=offset_base + 0xd8 * link_num + INSERT_BYTES insert_offset 0xd8 + WRITE_LONG 0x3c ((LONG_AT 0x3c) + 1) +END +OUTER_SPRINT $SFO_do_not_parse_arguments("WMP_insert_link_by_codes") "" + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Delete an area (identified via short name) or list of areas +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION WMP_delete_area + STR_VAR arguments="" +BEGIN + PATCH_IF "%arguments%" STRING_COMPARE "" BEGIN + SPRINT area_name "%arguments%" + LPF return_first_entry STR_VAR list="%arguments%" RET area_name=entry arguments=list END + // find area code + LPF WMP_index_of_area STR_VAR arguments="%area_name%" RET area_code=value END + // delete links to and from the area + LPF WMP_find_links_from INT_VAR arguments="%area_code%" RET exits_from=value END + LPF WMP_delete_link STR_VAR arguments="%exits_from%" END + LPF WMP_find_links_to INT_VAR arguments="%area_code%" RET exits_to=value END + LPF WMP_delete_link STR_VAR arguments="%exits_to%" END + // update remaining links + SPRINT entry_type link + SPRINT file_ext WMP + LPM get_offset_array + PHP_EACH offset_array AS int=>offset_base BEGIN + LPF WMP_read_link_dest_ind RET dest=value END + PATCH_IF (dest>area_code) BEGIN + SET dest = dest - 1 + LPF WMP_link_dest_ind STR_VAR arguments="%dest%" END + END + END + // physically delete the area + + SPRINT entry_type area + LPM get_offset_array + SET delete_at=$offset_array("%area_code%") + DELETE_BYTES delete_at 0xf0 + + // update offsets + + WRITE_LONG 0x30 ((LONG_AT 0x30) - 1) + + WRITE_LONG 0x38 ((LONG_AT 0x38) - 0xf0) + LPF WMP_delete_area STR_VAR arguments END + END +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Area adder (wrapper for add_entry) +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION insert_area + STR_VAR arguments="" +BEGIN + LPF add_entry_inline INT_VAR at_end=1 STR_VAR arguments="apply_patches=>%arguments% type=>area" filename file_ext=WMP END +END + + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Builder (for completeness, really) +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION WMP_build BEGIN + INSERT_BYTES 0x0 0xc8 + WRITE_ASCII 0x0 "WMP V1.0" + WRITE_LONG 0x8 1 + WRITE_LONG 0xc 0x10 + WRITE_LONG 0x34 0xc8 + WRITE_LONG 0x38 0xc8 +END + diff --git a/iwdification/sfo/general/lib_evaluate.tpa b/iwdification/sfo/general/lib_evaluate.tpa new file mode 100644 index 0000000..7834c2c --- /dev/null +++ b/iwdification/sfo/general/lib_evaluate.tpa @@ -0,0 +1,838 @@ +/////////////////////////////////////////////////////////////////////// +/// Functions needed for evaluating SFO expressions +//////////////////////////////////////////////////////////////////////// + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// wrapper to handle the FP_func nomenclature +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION apply_standard_function + INT_VAR offset_secondary=0 + entry_index=0 + offset_base=0 + STR_VAR func="" + arguments="null" + filename="" + file_ext="" +BEGIN + SPRINT null "null" // guard against 'null' being used as a variable elsewhere + TO_UPPER file_ext + PATCH_TRY + PATCH_SILENT + PATCH_MATCH "%arguments%" WITH + "null" "" BEGIN + LPF ~%file_ext%_%func%~ END + END + DEFAULT + LPF ~%file_ext%_%func%~ STR_VAR arguments END + END + PATCH_VERBOSE + WITH + ~Failure("Unknown function: %file_ext%_%func%")~ + BEGIN + PATCH_MATCH "%arguments%" WITH + "null" "" BEGIN + LPF ~%func%~ END + END + DEFAULT + LPF ~%func%~ STR_VAR arguments END + END + END + DEFAULT + PATCH_PRINT "ERROR: %ERROR_MESSAGE% in apply_standard_function: inputs were func=%func%, arguments=%arguments%" + PATCH_RERAISE + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// wrapper to handle the FP_func nomenclature +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION check_standard_function + INT_VAR offset_secondary=0 + func_or_string=0 + entry_index=0 + offset_base="" + STR_VAR func="" + arguments="" + parameter="" + filename="" + file_ext="" + RET value +BEGIN + PATCH_IF debug_variable=2 BEGIN + PATCH_PRINT "check_standard_function called with offset_secondary=%offset_secondary%, offset_base=%offset_base%, file prefix=%file_ext%, func=%func%, args=%arguments%" + END + TO_UPPER file_ext + PATCH_TRY + PATCH_SILENT + PATCH_MATCH "%arguments%" WITH + null "" BEGIN + LPF ~%file_ext%_read_%func%~ RET value END + END + DEFAULT + LPF ~%file_ext%_read_%func%~ STR_VAR arguments RET value END + END + PATCH_VERBOSE + WITH + ~Failure("Unknown function: %file_ext%_read_%func%")~ + BEGIN + PATCH_TRY + PATCH_SILENT + PATCH_MATCH "%arguments%" WITH + null "" BEGIN + LPF ~%file_ext%_%func%~ RET value END + END + DEFAULT + LPF ~%file_ext%_%func%~ STR_VAR arguments RET value END + END + PATCH_VERBOSE + WITH + ~Failure("Unknown function: %file_ext%_%func%")~ + BEGIN + PATCH_TRY + PATCH_SILENT + PATCH_MATCH "%arguments%" WITH + null "" BEGIN + LPF ~%func%~ RET value END + END + DEFAULT + LPF ~%func%~ STR_VAR arguments RET value END + END + PATCH_VERBOSE + WITH + ~Failure("Unknown function: %func%")~ + BEGIN + PATCH_IF func_or_string BEGIN + PATCH_IF "%func%" STRING_EQUAL_CASE "null" BEGIN + SPRINT value "" + END ELSE + PATCH_IF VARIABLE_IS_SET "SFO_RESERVED_var_%func%" BEGIN + SPRINT value EVALUATE_BUFFER "%SFO_RESERVED_var_%func%%" + END ELSE + PATCH_IF "%func%" STRING_EQUAL "no_change" BEGIN + SPRINT value no_change + END ELSE + PATCH_IF VARIABLE_IS_SET "SFO_RESERVED_%func%" BEGIN + SPRINT value EVALUATE_BUFFER "%SFO_RESERVED_%func%%" + END ELSE + PATCH_IF VARIABLE_IS_SET "%func%" BEGIN + SPRINT value EVALUATE_BUFFER "%%func%%" + END ELSE BEGIN + SPRINT value "%func%" + END + END ELSE BEGIN + PATCH_PRINT "%ERROR_MESSAGE%" + PATCH_RERAISE + END + END + DEFAULT + LPF warning STR_VAR warning= ~Failure %ERROR_MESSAGE% in check_standard_function: inputs were func=%func%, arguments=%arguments%~ END + PATCH_RERAISE + END + + END + DEFAULT + LPF warning STR_VAR warning= ~Failure %ERROR_MESSAGE% in check_standard_function: inputs were func=%func%, arguments=%arguments%~ END + PATCH_RERAISE + END + END + DEFAULT + LPF warning STR_VAR warning= ~Failure %ERROR_MESSAGE% in check_standard_function: inputs were func=%func%, arguments=%arguments%~ END + PATCH_RERAISE + END + PATCH_IF debug_variable=2 BEGIN + PATCH_PRINT "Returning value %value%" + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//// Parse the argument of an expression +//// +//// Here we build a parser in WEIDU, itself being parsed by an OCAML parser! +//// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION evaluate_expression + INT_VAR offset_base=0 + offset_secondary=0 + entry_index=0 + integer=0 + boolean=0 + list_type=0 + subterm=0 + STR_VAR arguments="" + expression="" + filename="" + file_ext="" + RET value +BEGIN + PATCH_IF debug_variable=2 BEGIN + PATCH_PRINT "Attempting to evaluate %expression%..." + END + LPF strip_spaces_from_string STR_VAR string="%expression%" RET expression=string END + PATCH_IF IS_AN_INT expression BEGIN // if it's just a number, don't waste time parsing + SET value=expression + END ELSE + PATCH_IF "%expression%" STRING_EQUAL_CASE "null" BEGIN + SPRINT value "null" + END ELSE + PATCH_IF "%expression%" STRING_EQUAL_CASE "this" BEGIN + SPRINT value "%arguments%" + END ELSE + PATCH_IF !("%expression%" STRING_MATCHES_REGEXP "[A-Za-z0-9#!_-]*$") BEGIN // if it's an ordinary string, don't waste time parsing + LPF check_standard_function INT_VAR offset_secondary entry_index func_or_string=1 offset_base STR_VAR arguments func="%expression%" filename file_ext RET value END + END ELSE BEGIN + INNER_PATCH_SAVE expression "%expression%" BEGIN // make sure we can use list-management techniques + REPLACE_TEXTUALLY " *( *" " ( " + REPLACE_TEXTUALLY " *) *" " ) " + REPLACE_TEXTUALLY " *{ *" " { " + REPLACE_TEXTUALLY " *} *" " } " + REPLACE_TEXTUALLY " *!= *" " = " + REPLACE_TEXTUALLY " *>= *" " >= " + REPLACE_TEXTUALLY " *<= *" " <= " + END + SET in_is_major=0 + // function application takes a little care - "in" needs to be evaluated before brackets (consider " 7 in (this+1)*2" ) but only if it has major scope + PATCH_IF !"%expression%" STRING_CONTAINS_REGEXP " in " BEGIN + LPF has_major_scope STR_VAR list="%expression%" operator="in" RET in_is_major=value left=left right=right END + END + PATCH_IF in_is_major BEGIN + LPF evaluate_expression INT_VAR offset_base offset_secondary entry_index subterm=1 STR_VAR arguments expression="%left%" filename file_ext RET val1=value END + LPF evaluate_expression INT_VAR offset_base offset_secondary entry_index subterm=1 STR_VAR arguments="%val1%" expression="%right%" filename file_ext RET value=value END + END ELSE BEGIN + PATCH_MATCH "%expression%" WITH + + // check if it's literal + + " *{ *literal:[^}]*} *" " *literal:.*" BEGIN + SPRINT value "%expression%" + END + + // after that, brackets have widest scope + + ".*(.*" BEGIN + LPF extract_bounded_part STR_VAR left_bound="(" right_bound=")" string="%expression%" RET left=left middle=middle right=right END + LPF evaluate_expression INT_VAR offset_base offset_secondary entry_index subterm=1 STR_VAR arguments expression="%middle%" filename file_ext RET middle_val=value END + LPF evaluate_expression INT_VAR offset_base offset_secondary entry_index subterm=1 STR_VAR arguments expression="%left% %middle_val% %right%" filename file_ext RET value=value END + END + + + // control flow + + "if.* then .*else .*" BEGIN + LPF extract_bounded_part STR_VAR left_bound="if" right_bound="then" string="%expression%" RET condition=middle rest=right END + LPF evaluate_expression INT_VAR offset_base offset_secondary entry_index boolean=1 subterm=1 STR_VAR arguments expression="%condition%" filename file_ext RET condition_val=value END + LPF extract_bounded_part STR_VAR left_bound="then" right_bound="else" string="then %rest%" RET if_true=middle if_false=right END + PATCH_IF condition_val BEGIN + LPF evaluate_expression INT_VAR offset_base offset_secondary entry_index subterm=1 STR_VAR arguments expression="%if_true%" filename file_ext RET value=value END + END ELSE BEGIN + LPF evaluate_expression INT_VAR offset_base offset_secondary entry_index subterm=1 STR_VAR arguments expression="%if_false%" filename file_ext RET value=value END + END + END + + "\[.*->.*\]" BEGIN + INNER_PATCH_SAVE list "%expression%" BEGIN + DELETE_BYTES 0x0 1 + REPLACE_TEXTUALLY "\]$" "" + END + SET done=0 + WHILE "%list%" STRING_COMPARE "" && !done BEGIN + LPF return_first_pair STR_VAR list arrow="->" RET cond=key result=value list=list END + PATCH_IF !"%cond%" STRING_MATCHES_REGEXP " *default *$" BEGIN + SET done=1 + END ELSE BEGIN + // if it doesn't contain "this", it should be compared to the argument (i.e., gain a tacit, 'this='/'this is' out front) + PATCH_IF "%cond%" STRING_CONTAINS_REGEXP "this" BEGIN + LPF evaluate_expression INT_VAR offset_base offset_secondary entry_index subterm=1 STR_VAR arguments expression="%cond%" filename file_ext RET val1=value END + PATCH_IF "%val1%" STRING_EQUAL_CASE "%arguments%" BEGIN + SET done=1 + END + END ELSE BEGIN // if it does, it should be compared to 1 + LPF evaluate_expression INT_VAR offset_base offset_secondary entry_index boolean=1 subterm=1 STR_VAR arguments expression="%cond%" filename file_ext RET val1=value END + PATCH_IF val1=1 BEGIN + SET done=1 + END + END + END + PATCH_IF done BEGIN + LPF evaluate_expression INT_VAR offset_base offset_secondary entry_index subterm=1 STR_VAR arguments expression="%result%" filename file_ext RET value=value END + END + END + PATCH_IF !done BEGIN + PATCH_FAIL "No condition matched in function %expression%" + END + END + + // lists - are returned unchanged + + "\[[^]]*\]" BEGIN + SPRINT value "%expression%" + END + + // propositional logic + + ".* and .*" BEGIN + LPF split_from_left STR_VAR string="%expression%" splitter="and" RET arg1=left arg2=right END + LPF evaluate_expression INT_VAR offset_base offset_secondary entry_index boolean=1 subterm=1 STR_VAR arguments expression="%arg1%" filename file_ext RET val1=value END + LPF evaluate_expression INT_VAR offset_base offset_secondary entry_index boolean=1 subterm=1 STR_VAR arguments expression="%arg2%" filename file_ext RET val2=value END + SET value=val1 AND val2 + END + ".* or .*" BEGIN + LPF split_from_left STR_VAR string="%expression%" splitter="or" RET arg1=left arg2=right END + LPF evaluate_expression INT_VAR offset_base offset_secondary entry_index boolean=1 subterm=1 STR_VAR arguments expression="%arg1%" filename file_ext RET val1=value END + LPF evaluate_expression INT_VAR offset_base offset_secondary entry_index boolean=1 subterm=1 STR_VAR arguments expression="%arg2%" filename file_ext RET val2=value END + SET value=val1 OR val2 + END + ".*not .*" BEGIN + LPF split_from_left STR_VAR string="%expression%" splitter="not" RET arg=right END + LPF evaluate_expression INT_VAR offset_base offset_secondary entry_index boolean=1 subterm=1 STR_VAR arguments expression="%arg%" filename file_ext RET val1=value END + SET value=NOT val1 + END + + // string comparison + + ".* is .*" BEGIN + LPF split_from_left STR_VAR string="%expression%" splitter="is" RET arg1=left arg2=right END + LPF evaluate_expression INT_VAR offset_base offset_secondary entry_index subterm=1 STR_VAR arguments expression="%arg1%" filename file_ext RET val1=value END + LPF evaluate_expression INT_VAR offset_base offset_secondary entry_index subterm=1 STR_VAR arguments expression="%arg2%" filename file_ext RET val2=value END + + PATCH_IF !("%val1%" STRING_CONTAINS_REGEXP "literal:") BEGIN + INNER_PATCH_SAVE val1 "%val1%" BEGIN + REPLACE_TEXTUALLY "" "" + END + END + PATCH_IF !("%val2%" STRING_CONTAINS_REGEXP "literal:") BEGIN + INNER_PATCH_SAVE val2 "%val2%" BEGIN + REPLACE_TEXTUALLY "" "" + END + END + + SET value= ("%val2%" STRING_EQUAL_CASE "%val1%") + + + END + + // string concatendation + + ".* join_with .*" BEGIN + LPF split_from_left STR_VAR string="%expression%" splitter="join_with" RET arg1=left arg2=right END + LPF evaluate_expression INT_VAR offset_base offset_secondary entry_index subterm=1 STR_VAR arguments expression="%arg1%" filename file_ext RET val1=value END + LPF evaluate_expression INT_VAR offset_base offset_secondary entry_index subterm=1 STR_VAR arguments expression="%arg2%" filename file_ext RET val2=value END + SPRINT value "%val1%%val2%" + END + + // arithmetic comparison: =, !=, >, >=, <, <= + // given the number of errors I keep making, we'll let "=" accept strings too. So much for strong typing. + + // quick sanity check + + ".*=>.*" BEGIN + PATCH_FAIL "'%expression%' contains =>, which is never legal in an SFO expression" + END + + ".*=.*" BEGIN + LPF return_first_entry STR_VAR list="%expression%" separator="=" RET arg1=entry arg2=list END + LPF evaluate_expression INT_VAR offset_base offset_secondary entry_index subterm=1 STR_VAR arguments expression="%arg1%" filename file_ext RET val1=value END + LPF evaluate_expression INT_VAR offset_base offset_secondary entry_index subterm=1 STR_VAR arguments expression="%arg2%" filename file_ext RET val2=value END + PATCH_IF (IS_AN_INT val1) && (IS_AN_INT val2) BEGIN + SET value=(val1 = val2) + END ELSE BEGIN + SET value=("%val1%" STRING_EQUAL_CASE "%val2%") + END + + END + ".*!=.*" BEGIN + LPF split_from_left STR_VAR string="%expression%" splitter="!=" RET arg1=left arg2=right END + LPF evaluate_expression INT_VAR offset_base offset_secondary entry_index integer=1 subterm=1 STR_VAR arguments expression="%arg1%" filename file_ext RET val1=value END + LPF evaluate_expression INT_VAR offset_base offset_secondary entry_index integer=1 subterm=1 STR_VAR arguments expression="%arg2%" filename file_ext RET val2=value END + SET value=(val1 != val2) // if this reminds you of the proof of the Soundness Theorem, go to the head of the class + END + ".*>.*" BEGIN + LPF return_first_entry STR_VAR list="%expression%" separator=">" RET arg1=entry arg2=list END + LPF evaluate_expression INT_VAR offset_base offset_secondary entry_index integer=1 subterm=1 STR_VAR arguments expression="%arg1%" filename file_ext RET val1=value END + LPF evaluate_expression INT_VAR offset_base offset_secondary entry_index integer=1 subterm=1 STR_VAR arguments expression="%arg2%" filename file_ext RET val2=value END + SET value=(val1>val2) + END + ".*>=.*" BEGIN + LPF split_from_left STR_VAR string="%expression%" splitter=">=" RET arg1=left arg2=right END + LPF evaluate_expression INT_VAR offset_base offset_secondary entry_index integer=1 subterm=1 STR_VAR arguments expression="%arg1%" filename file_ext RET val1=value END + LPF evaluate_expression INT_VAR offset_base offset_secondary entry_index integer=1 subterm=1 STR_VAR arguments expression="%arg2%" filename file_ext RET val2=value END + SET value=(val1>=val2) + END + ".*<.*" BEGIN + LPF return_first_entry STR_VAR list="%expression%" separator="<" RET arg1=entry arg2=list END + LPF evaluate_expression INT_VAR offset_base offset_secondary entry_index integer=1 subterm=1 STR_VAR arguments expression="%arg1%" filename file_ext RET val1=value END + LPF evaluate_expression INT_VAR offset_base offset_secondary entry_index integer=1 subterm=1 STR_VAR arguments expression="%arg2%" filename file_ext RET val2=value END + SET value=(val1val2?val1:val2 + END + min BEGIN + SET value=val10 BEGIN // if it isn't, we're done. + PATCH_IF "%right%" STRING_COMPARE "" BEGIN + LPF return_first_entry STR_VAR list="%right%" RET entry=entry right=list END + SPRINT left "%left% %entry%" + PATCH_MATCH "%entry%" WITH + sum plus prod times max min div BEGIN + SET depth +=1 + END + neg iter BEGIN + END + DEFAULT + SET depth = depth - 1 + END + LPF polish_parser INT_VAR depth STR_VAR left right RET left right END + END ELSE BEGIN + PATCH_FAIL ~"%left% %right%" is not a correctly formed argument pair (i.e., you've messed up the syntax of something containing this string)~ + END + END +END + +DEFINE_ACTION_FUNCTION polish_parser + INT_VAR depth=1 + STR_VAR left="" right="" + RET left right +BEGIN + OUTER_INNER_PATCH "" BEGIN + LPF polish_parser INT_VAR depth STR_VAR left right RET left right END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///// See if "operator" in a space-separated list "list" has major scope, i.e. appears outside parentheses. If so, return the two parts +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION has_major_scope + STR_VAR list="" + operator="" + RET value left right +BEGIN + SET depth=0 + SET value=0 + SPRINT left "" + SPRINT right "%list%" + WHILE "%right%" STRING_COMPARE "" && value=0 BEGIN + LPF return_first_entry STR_VAR list="%right%" RET entry=entry right=list END + PATCH_MATCH "%entry%" WITH + "(" "{" BEGIN + SET depth+=1 + SPRINT left "%left% %entry%" + END + ")" "}" BEGIN + SET depth = depth - 1 + SPRINT left "%left% %entry%" + END + "%operator%" BEGIN + PATCH_IF depth=0 BEGIN + SET value=1 + END ELSE BEGIN + SPRINT left "%left% %operator%" + END + END + DEFAULT + SPRINT left "%left% %entry%" + END + END +END + + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///// Take a space-separated list containing a left-bounder (e.g. "("), find the index of the associated right-bounder, and return the expression +///// as three strings +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION extract_bounded_part + STR_VAR left_bound="" + right_bound="" + string="" + RET left middle right +BEGIN + TO_LOWER left_bound + TO_LOWER right_bound + SPRINT left "" + SPRINT middle "" + SPRINT right "" + SPRINT list "%string%" + // find first left_bound + SET found_left=0 + WHILE !found_left BEGIN + LPF return_first_entry STR_VAR list RET entry=entry list=list END + PATCH_IF "%entry%" STRING_EQUAL_CASE "%left_bound%" BEGIN + SET found_left=1 + END ELSE BEGIN + SPRINT left "%left% %entry%" + END + END + SET depth=1 + SET found_right=0 + WHILE !found_right BEGIN + PATCH_IF "%list%" STRING_EQUAL "" BEGIN + PATCH_FAIL "'%left_bound%' in %string% lacks matching '%right_bound%'" + END + LPF return_first_entry STR_VAR list RET entry=entry list=list END + PATCH_MATCH "%entry%" WITH + "%left_bound%" BEGIN + SPRINT middle "%middle% %entry%" + SET depth +=1 + END + "%right_bound%" BEGIN + PATCH_IF depth=1 BEGIN + SET found_right=1 + END ELSE BEGIN + SPRINT middle "%middle% %entry%" + SET depth = depth - 1 + END + END + DEFAULT + SPRINT middle "%middle% %entry%" + END + END + SPRINT right "%list%" + PATCH_IF "%middle%" STRING_EQUAL_CASE "" BEGIN + SPRINT middle null + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///// Is expression Boolean (1 or 0)? If not, fail +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION fail_unless_boolean + STR_VAR expression="" value="" +BEGIN + SET failed=0 + PATCH_IF !(IS_AN_INT value) BEGIN + PATCH_IF "%value%" STRING_COMPARE no_change BEGIN SET failed=1 END + END + PATCH_IF !(value=1 || value=0) BEGIN + PATCH_IF "%value%" STRING_COMPARE no_change BEGIN SET failed=1 END + END + PATCH_IF failed BEGIN + PATCH_IF "%expression%" STRING_EQUAL_CASE "" BEGIN + PATCH_FAIL "%value% is not a Boolean (0 or 1), but one was expected" + END ELSE BEGIN + PATCH_FAIL "%expression% evaluates to %value%, which is not an Boolean (0 or 1), but one is expected." + END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///// Is expression an integer? If not, fail +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION fail_unless_int + STR_VAR expression="" value="" +BEGIN + PATCH_IF !(IS_AN_INT value) BEGIN + PATCH_IF "%value%" STRING_COMPARE no_change BEGIN + PATCH_IF "%expression%" STRING_EQUAL_CASE "" BEGIN + PATCH_FAIL "%value% is not an integer, but one was expected" + END ELSE BEGIN + PATCH_FAIL "%expression% evaluates to %value%, which is not an integer, but one is expected." + END + END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///// Is expression a list (i.e., bounded by []). If not, fail +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION fail_unless_list + STR_VAR expression="" value="" +BEGIN + PATCH_IF "%value%" STRING_MATCHES_REGEXP "\[.*\]$" BEGIN + PATCH_FAIL "%expression% evaluates to %value%, which is not a list, but one is expected." + END +END + diff --git a/iwdification/sfo/general/lib_general.tpa b/iwdification/sfo/general/lib_general.tpa new file mode 100644 index 0000000..84cf25d --- /dev/null +++ b/iwdification/sfo/general/lib_general.tpa @@ -0,0 +1,1317 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// compile SSL +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION ~compile_ssl_to_bcs_core~ INT_VAR skip_bcs=0 STR_VAR script="" variables="" booleans="" location="" locbase="" locabs="" rename_to="" inline="" BEGIN + ACTION_IF !FILE_EXISTS "%workspace%/autolib.slb" BEGIN + COPY ~.../stratagems-inline/blank~ ~%workspace%\autolib.slb~ + END + + LAF check_ini STR_VAR ini=disable_ssl RET disable_ssl=value END + ACTION_IF ~%script%~ STRING_EQUAL_CASE ~~ BEGIN + LAF warning STR_VAR warning="Warning: SSL compilation called with no script" END + END + ACTION_TO_LOWER script + ACTION_TO_LOWER rename_to + ACTION_IF disable_ssl=0 BEGIN + ACTION_IF !VARIABLE_IS_SET ~sslvariables~ BEGIN + OUTER_SPRINT ~sslvariables~ ~~ + END + ACTION_IF ~%variables%~ STRING_COMPARE_CASE ~~ BEGIN + ACTION_IF ~%sslvariables%~ STRING_COMPARE_CASE ~~ BEGIN + OUTER_SPRINT ~sslvariables~ ~%sslvariables%&%variables%~ + END ELSE BEGIN + OUTER_SPRINT sslvariables ~%variables%~ + END + END + ACTION_IF "%booleans%" STRING_COMPARE_CASE "" BEGIN + OUTER_SPRINT booleanstring "-b %booleans%" + END ELSE BEGIN + OUTER_SPRINT booleanstring "" + END + ACTION_IF ~%inline%~ STRING_EQUAL yes BEGIN + COPY ~.../stratagems-inline/%script%.ssl~ ~%workspace%~ + OUTER_SPRINT full_loc ~%workspace%~ + END ELSE BEGIN + + // sanity check + ACTION_IF FILE_EXISTS ~%MOD_FOLDER%\%location%\%script%.ssl~ BEGIN + OUTER_SPRINT full_loc ~%MOD_FOLDER%\%location%~ + END ELSE BEGIN + LAF get_directory STR_VAR location locabs locbase RET full_loc=directory END + ACTION_IF !FILE_EXISTS ~%full_loc%\%script%.ssl~ BEGIN + FAIL ~SCS install error: the SSL file %script%.ssl cannot be found at %full_loc%~ + END + END + + END + ACTION_IF debug_variable=2 BEGIN + LAF warning STR_VAR warning= ~SSL call with variables %sslvariables%, library %ssllibrary%, booleans %booleanstring%~ END + PRINT ~~~~~actual SSL string is ~%MOD_FOLDER%\%ssl_loc%\ssl.exe %full_loc%\%script% "%sslvariables%" -o %workspace%/ssl_out -l %ssllibrary% %workspace%\autolib %booleanstring%~ ~~~~~ + END + DELETE "%workspace%/ssl_out/%script%.baf" + ACTION_IF ~%WEIDU_OS%~ STRING_COMPARE_CASE ~WIN32~ THEN BEGIN + OUTER_INNER_PATCH_SAVE scsargs "%full_loc%/%script%" BEGIN + REPLACE_TEXTUALLY "\" "/" + END + AT_NOW ~chmod 755 %MOD_FOLDER%/%ssl_loc%/ssl.pl~ + AT_NOW ~/usr/bin/perl %MOD_FOLDER%/%ssl_loc%/ssl.pl %scsargs% "%sslvariables%" -o %workspace%/ssl_out -l %ssllibrary% %workspace%/autolib %booleanstring%~ EXACT + END ELSE BEGIN + LAF check_ini STR_VAR ini=Use_Perl_Natively RET value END + ACTION_IF value BEGIN + AT_NOW ~perl %MOD_FOLDER%\%ssl_loc%\ssl.pl %full_loc%\%script% "%sslvariables%" -o %workspace%/ssl_out -l %ssllibrary% %workspace%\autolib %booleanstring%~ + END ELSE BEGIN + AT_NOW ~%MOD_FOLDER%\%ssl_loc%\ssl.exe %full_loc%\%script% "%sslvariables%" -o %workspace%/ssl_out -l %ssllibrary% %workspace%\autolib %booleanstring%~ + END + END + COPY ~%workspace%\ssl_out\%script%.baf~ ~%workspace%\ssl_out~ EVALUATE_BUFFER + PATCH_IF !enhanced_edition BEGIN + LPF ssl_ee_to_vanilla END + END + LPF ssl_hotkey_swap END + LPF implement_line_if END + BUT_ONLY + ACTION_IF skip_bcs=0 BEGIN + ACTION_IF ~%rename_to%~ STRING_COMPARE_CASE ~~ BEGIN + COPY + ~%workspace%\ssl_out\%script%.baf~ ~%workspace%\ssl_out\%rename_to%.baf~ + COMPILE EVALUATE_BUFFER ~%workspace%\ssl_out\%rename_to%.baf~ + END ELSE BEGIN + COMPILE EVALUATE_BUFFER ~%workspace%\ssl_out\%script%.baf~ + END + END + END ELSE BEGIN + LAF warning STR_VAR warning="Warning: SSL compilation disabled" END + END +END + +DEFINE_ACTION_FUNCTION ~ssl_to_bcs~ + STR_VAR script="" location="" locbase="" locabs="" variables="" booleans="" rename_to="" inline="" +BEGIN + // "location" should in normal circumstances be relativised to local_loc, but SSL permits + // it to be relative to MOD_FOLDER (for legacy reasons) + + ACTION_IF ~%script%~ STRING_EQUAL ~~ BEGIN + LAF warning STR_VAR warning="Warning: SSL compiler called with empty argument" END + END + OUTER_WHILE ~%script%~ STRING_COMPARE ~~ BEGIN + LAF return_first_entry STR_VAR list=~%script%~ RET script=list script_to_call=entry END + LAF compile_ssl_to_bcs_core STR_VAR script=~%script_to_call%~ location locbase locabs variables booleans rename_to inline END + END + +END + +DEFINE_ACTION_FUNCTION ~ssl_to_baf~ + STR_VAR script="" location="" locbase="" locabs="" variables="" inline="" rename_to="" booleans="" +BEGIN + ACTION_IF ~%script%~ STRING_EQUAL ~~ BEGIN + LAF warning STR_VAR warning="Warning: SSL compiler called with empty argument" END + END + OUTER_WHILE ~%script%~ STRING_COMPARE ~~ BEGIN + LAF return_first_entry STR_VAR list= ~%script%~ RET script=list script_to_call=entry END + LAF compile_ssl_to_bcs_core INT_VAR skip_bcs=1 STR_VAR script= ~%script_to_call%~ location locbase locabs variables rename_to booleans inline END + END + +END + + +DEFINE_ACTION_FUNCTION ~COMPILE_SSL_TO_BCS~ STR_VAR script="" location="" variables="" rename_to="" inline="" booleans="" BEGIN // legacy name + LAF ssl_to_bcs STR_VAR script location variables rename_to inline booleans END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +DEFINE_PATCH_FUNCTION implement_line_if BEGIN + REPLACE_EVALUATE "LineIf<\([^>]*\)> *<\([^>]*\)>" + BEGIN + PATCH_IF IS_AN_INT MATCH2 BEGIN + PATCH_IF MATCH2 BEGIN + SPRINT output "%MATCH1%" + END ELSE BEGIN + SPRINT output "" + END + END ELSE BEGIN + SPRINT output "" + END + END + "%output%" +END + + +DEFINE_ACTION_FUNCTION compile_ssl_output // largely for debugging + STR_VAR script="" +BEGIN + COPY ~%workspace%\ssl_out\%script%.baf~ ~%workspace%\ssl_out~ EVALUATE_BUFFER + PATCH_IF !enhanced_edition BEGIN + LPF ssl_ee_to_vanilla END + END + LPF implement_line_if END + BUT_ONLY + COMPILE EVALUATE_BUFFER ~%workspace%\ssl_out\%script%.baf~ + + +END + + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// install all the listed files +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION install + INT_VAR overwrite=1 + STR_VAR file="" + files="" + location="" + locbase="" + inline="no" + postfix="" +BEGIN + ACTION_IF ~%file%~ STRING_EQUAL_CASE ~~ BEGIN + ACTION_IF ~%files%~ STRING_EQUAL_CASE ~~ BEGIN + PRINT ~Warning: you've called an install with no argument~ + END ELSE BEGIN + OUTER_SPRINT file ~%files%~ + END + END + PRINT ~Installing file(s) %file%~ + ACTION_IF ~%inline%~ STRING_EQUAL_CASE yes BEGIN + OUTER_SPRINT file_loc ~.../stratagems-inline~ + END ELSE BEGIN + LAF get_directory STR_VAR location locbase RET file_loc=directory END + END + OUTER_WHILE ~%file%~ STRING_COMPARE ~~ BEGIN + LAF return_first_entry STR_VAR list= ~%file%~ RET entry file=list END + ACTION_IF "%entry%" STRING_EQUAL_CASE all BEGIN + ACTION_IF "%postfix%" STRING_EQUAL "" BEGIN + ACTION_BASH_FOR "%file_loc%" ".*" BEGIN + OUTER_SPRINT file "%file% %BASH_FOR_FILE%" + END + END ELSE BEGIN + ACTION_BASH_FOR "%file_loc%" ".*\.%postfix%" BEGIN + OUTER_SPRINT file "%file% %BASH_FOR_RES%" + END + END + END ELSE BEGIN + ACTION_IF "%postfix%" STRING_EQUAL "" BEGIN + OUTER_PATCH_SAVE entry ~%entry%~ BEGIN + SET postfix_start = INDEX_BUFFER (~\.~) +1 + SET postfix_length = BUFFER_LENGTH - postfix_start + READ_ASCII postfix_start postfix_here (~postfix_length~) + DELETE_BYTES (postfix_start - 1) (postfix_length + 1) + END + OUTER_SPRINT entry_full "%entry%.%postfix_here%" + END ELSE BEGIN + OUTER_SPRINT entry_full "%entry%.%postfix%" + OUTER_SPRINT postfix_here "%postfix%" + END + ACTION_IF !overwrite BEGIN + ACTION_MATCH "%postfix_here%" WITH + baf ssl BEGIN + OUTER_SPRINT to_check "%entry%.bcs" + END + d BEGIN + OUTER_SPRINT to_check "%entry%.dlg" + END + DEFAULT + OUTER_SPRINT to_check "%entry_full%" + END + END + ACTION_IF (overwrite OR !FILE_EXISTS_IN_GAME "%to_check%") BEGIN + ACTION_MATCH "%postfix_here%" WITH + baf d BEGIN + COMPILE ~%file_loc%/%entry_full%~ EVALUATE_BUFFER + END + ssl BEGIN + LAF ssl_to_bcs STR_VAR script="%entry%" location locbase END + END + cre BEGIN + COPY ~%file_loc%/%entry_full%~ ~override~ + LPF FJ_CRE_EFF_V2 END + END + DEFAULT + COPY ~%file_loc%/%entry_full%~ ~override~ + END + END ELSE BEGIN + PRINT "Not installing %entry_full% as it is already present" + END + END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Extend a script +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION extend + INT_VAR tv=0 + allow_missing=0 + STR_VAR file="" + files="" + script="" + top="" + bottom="" + location="" + locbase="" + locabs="" + inline="no" + ssl="no" + variables="" +BEGIN + ACTION_IF ~%file%%files%%script%~ STRING_EQUAL_CASE ~~ BEGIN + PRINT ~Warning: you've called an extend with no main file~ + END ELSE BEGIN + OUTER_SPRINT file ~%file%%files%%script%~ + END + ACTION_IF ~%ssl%~ STRING_EQUAL_CASE yes BEGIN + ACTION_FOR_EACH script IN ~%top%~ ~%bottom%~ BEGIN + ACTION_IF ~%script%~ STRING_COMPARE_CASE ~~ BEGIN + LAF ssl_to_baf STR_VAR script location variables inline END + END + END + OUTER_SPRINT file_loc ~%workspace%\ssl_out~ + END ELSE BEGIN + ACTION_IF ~%inline%~ STRING_EQUAL_CASE yes BEGIN + OUTER_SPRINT file_loc ~.../stratagems-inline~ + END ELSE BEGIN + LAF get_directory STR_VAR location locbase locabs RET file_loc=directory END + END + END + OUTER_WHILE ~%file%~ STRING_COMPARE ~~ BEGIN + LAF return_first_entry STR_VAR list= ~%file%~ RET entry file=list END + ACTION_IF tv BEGIN + OUTER_SPRINT entry ~%tutu_var%%entry%~ + END + ACTION_IF ~%top%~ STRING_COMPARE_CASE ~~ BEGIN + EXTEND_TOP ~%entry%.bcs~ ~%file_loc%/%top%.baf~ EVALUATE_BUFFER + END + ACTION_IF ~%bottom%~ STRING_COMPARE_CASE ~~ BEGIN + EXTEND_BOTTOM ~%entry%.bcs~ ~%file_loc%/%bottom%.baf~ EVALUATE_BUFFER + END + END + + +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Compile a script under a different name (syntax is oldname=>newname) +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION compile_rename +STR_VAR file="" + files="" + location="" + locbase="" +BEGIN + ACTION_IF ~%file%~ STRING_EQUAL_CASE ~~ BEGIN + ACTION_IF ~%files%~ STRING_EQUAL_CASE ~~ BEGIN + PRINT ~Warning: you've called a compile_rename with no main file~ + END ELSE BEGIN + OUTER_SPRINT file ~%files%~ + END + END + LAF get_directory STR_VAR location locbase RET file_loc=directory END + OUTER_WHILE ~%file%~ STRING_COMPARE ~~ BEGIN + LAF return_first_pair STR_VAR list= ~%file%~ RET oldscript=key newscript=value file=list END + COPY ~%file_loc%\%oldscript%.baf~ ~%workspace%\%newscript%.baf~ + COMPILE EVALUATE_BUFFER ~%workspace%\%newscript%.baf~ + END + +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Clone a script A=>B and then extend it with another script also called B +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION clone_extend + STR_VAR arguments="" + top="yes" + location="" + locbase="" + inline="no" +BEGIN + ACTION_IF ~%arguments%~ STRING_COMPARE_CASE ~~ BEGIN + LAF return_first_pair STR_VAR list= ~%arguments%~ RET source=key script=value arguments=list END + COPY_EXISTING ~%source%.bcs~ ~override/%script%.bcs~ + ACTION_IF ~%top%~ STRING_EQUAL_CASE ~no~ BEGIN + LAF extend STR_VAR files= ~%script%~ location locbase inline bottom= ~%script%~ END + END ELSE BEGIN + LAF extend STR_VAR files= ~%script%~ location locbase inline top= ~%script%~ END + END + LAF clone_extend STR_VAR arguments top location inline END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// merge two scripts +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +DEFINE_ACTION_FUNCTION merge_scripts + STR_VAR top="" + bottom="" + script="" +BEGIN + COPY_EXISTING "%bottom%.bcs" "%workspace%/%bottom%.baf" + DECOMPILE_BCS_TO_BAF + COPY_EXISTING "%top%.bcs" "override/%script%.bcs" + DECOMPILE_BCS_TO_BAF + APPEND_FILE TEXT "%workspace%/%bottom%.baf" + COMPILE_BAF_TO_BCS + +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// make a textual substitution +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + + +DEFINE_PATCH_FUNCTION swap_text_core + STR_VAR arguments="" +BEGIN + PATCH_IF ~%arguments%~ STRING_COMPARE_CASE ~~ BEGIN + LPF return_first_pair STR_VAR list= ~%arguments%~ RET arguments=list old=key new=value END + PATCH_IF ~%new%~ STRING_EQUAL_CASE ~NULL~ BEGIN + SPRINT ~new~ ~~ + END + REPLACE_TEXTUALLY CASE_INSENSITIVE ~%old%~ ~%new%~ + LPF swap_text_core STR_VAR arguments= ~%arguments%~ END + END +END + +DEFINE_PATCH_FUNCTION swap_text_core2 + STR_VAR arguments="" +BEGIN + PATCH_IF ~%arguments%~ STRING_COMPARE_CASE ~~ BEGIN + LPF return_first_pair STR_VAR list= ~%arguments%~ RET arguments=list old=key new=value END + PATCH_IF ~%new%~ STRING_EQUAL_CASE ~NULL~ BEGIN + SPRINT ~new~ ~~ + END + SET len1=STRING_LENGTH ~%old%~ + SET len2=STRING_LENGTH ~%new%~ + SET len = len1>len2?len1:len2 + REPLACE_TEXTUALLY CASE_INSENSITIVE ~%old%~ ~%new%~ (len) + LPF swap_text_core2 STR_VAR arguments= ~%arguments%~ END + END +END + +DEFINE_ACTION_FUNCTION swap_text + INT_VAR tv=0 + allow_missing=0 + STR_VAR files="" + file="" + swaps="" + postfix="" +BEGIN + OUTER_SPRINT files "%files%%file%" + OUTER_WHILE ~%files%~ STRING_COMPARE_CASE ~~ BEGIN + LAF return_first_entry STR_VAR list= ~%files%~ RET files=list entry=entry END + ACTION_IF tv BEGIN + OUTER_SPRINT ~entry~ ~%tutu_var%%entry%~ + END + ACTION_IF (~%postfix%~ STRING_COMPARE_CASE ~~) BEGIN + OUTER_SPRINT ~entry~ ~%entry%.%postfix%~ + END + ACTION_IF (!allow_missing || FILE_EXISTS_IN_GAME ~%entry%~) BEGIN + OUTER_PATCH ~%entry%~ BEGIN + SET postfix_start = INDEX_BUFFER (~\.~) +1 + SET postfix_length = BUFFER_LENGTH - postfix_start + READ_ASCII postfix_start pf (~postfix_length~) + END + ACTION_TO_LOWER pf + ACTION_MATCH "%pf%" WITH + bcs dlg BEGIN + COPY_EXISTING ~%entry%~ ~override~ + DECOMPILE_AND_PATCH BEGIN + LPF swap_text_core STR_VAR arguments = ~%swaps%~ END + END + BUT_ONLY + END + 2da ids BEGIN + COPY_EXISTING ~%entry%~ ~override~ + LPF swap_text_core STR_VAR arguments = ~%swaps%~ END + BUT_ONLY + END + DEFAULT + COPY_EXISTING ~%entry%~ ~override~ + LPF swap_text_core2 STR_VAR arguments = ~%swaps%~ END + BUT_ONLY + END + END + END +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// output the name of the file +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION log_resource_name STR_VAR arguments="SFOlog" BEGIN + + + TO_LOWER file_ext + PATCH_MATCH ~%file_ext%~ WITH itm BEGIN + READ_STRREF 0xc name + SPRINT output ~%filename% %name%~ + END + cre spl BEGIN + READ_STRREF 0x8 name + SPRINT output ~%filename% %name%~ + END + DEFAULT + SPRINT output ~%filename%~ + END + + INNER_ACTION BEGIN + <<<<<<<< log.txt + >>>>>>>> + + + ACTION_IF !FILE_EXISTS ~%workspace%/%arguments%.txt~ BEGIN + COPY log.txt ~%workspace%/%arguments%.txt~ + END + APPEND_OUTER ~%workspace%/%arguments%.txt~ ~%output%~ + END + +END +OUTER_SPRINT $SFO_do_not_parse_arguments("log_resource_name") "" + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Return the offset of a given entry +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION return_offset + INT_VAR offset_num=0 + STR_VAR file_ext="" + entry_type="" + RET value offset_loc +BEGIN + PATCH_IF "%file_ext%" STRING_EQUAL_CASE "" BEGIN + PATCH_FAIL "You need to specify the file extension for return_offset" + END + PATCH_IF "%entry_type%" STRING_EQUAL_CASE "" BEGIN + PATCH_FAIL "You need to specify the entry type for return_offset" + END + SET offset_loc=$ ~%file_ext%offset_loc~(~%entry_type%~) + SET offset_length=$ ~%file_ext%offset_length~(~%entry_type%~) + PATCH_MATCH offset_length WITH + 2 BEGIN + READ_SHORT offset_loc offset_base + END + 4 BEGIN + READ_LONG offset_loc offset_base + END + DEFAULT + LPF warning STR_VAR warning="warning: unknown length of offset" END + END + SET entry_length=$ ~%file_ext%entry_length~(~%entry_type%~) + SET value=offset_base + offset_num * entry_length +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Increment the offset of a given entry +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION increment_offset + INT_VAR arguments=0 + STR_VAR file_ext="" + entry_type="" + +BEGIN + PATCH_IF "%file_ext%" STRING_EQUAL_CASE "" BEGIN + PATCH_FAIL "You need to specify the file extension for increment_offset" + END + PATCH_IF "%entry_type%" STRING_EQUAL_CASE "" BEGIN + PATCH_FAIL "You need to specify the entry type for increment_offset" + END + SET offset_loc=$ ~%file_ext%offset_loc~(~%entry_type%~) + SET offset_length=$ ~%file_ext%offset_length~(~%entry_type%~) + PATCH_MATCH offset_length WITH + 2 BEGIN + WRITE_SHORT offset_loc ((SHORT_AT offset_loc) + arguments) + END + 4 BEGIN + WRITE_LONG offset_loc ((LONG_AT offset_loc) + arguments) + END + DEFAULT + LPF warning STR_VAR warning="warning: unknown length of offset" END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Return the number of a given entry +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION return_number_entries + STR_VAR file_ext="" + entry_type="" + RET value +BEGIN + PATCH_IF "%file_ext%" STRING_EQUAL_CASE "" BEGIN + PATCH_FAIL "You need to specify the file extension for return_number_entries" + END + PATCH_IF "%entry_type%" STRING_EQUAL_CASE "" BEGIN + PATCH_FAIL "You need to specify the entry type for return_number_entries" + END + SET loc=$ ~%file_ext%entrynum_loc~(~%entry_type%~) + SET length=$ ~%file_ext%entrynum_length~(~%entry_type%~) + PATCH_IF loc="-1" BEGIN + SET value="-1" + END ELSE BEGIN + PATCH_MATCH length WITH + 2 BEGIN + READ_SHORT loc value + END + 4 BEGIN + READ_LONG loc value + END + 0 BEGIN + SET value="-1" + END + DEFAULT + LPF warning STR_VAR warning="warning: unknown length of offset" END + END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Increment the number of a given entry +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION increment_number_entries + INT_VAR arguments=0 + STR_VAR file_ext="" + entry_type="" + +BEGIN + PATCH_IF "%file_ext%" STRING_EQUAL_CASE "" BEGIN + PATCH_FAIL "You need to specify the file extension for increment_number_entries" + END + PATCH_IF "%entry_type%" STRING_EQUAL_CASE "" BEGIN + PATCH_FAIL "You need to specify the entry type for increment_number_entries" + END + SET loc=$ ~%file_ext%entrynum_loc~(~%entry_type%~) + SET length=$ ~%file_ext%entrynum_length~(~%entry_type%~) + PATCH_IF loc="-1" BEGIN + + END ELSE BEGIN + PATCH_MATCH length WITH + 2 BEGIN + WRITE_SHORT loc ((SHORT_AT loc) + arguments) + END + 4 BEGIN + WRITE_LONG loc ((LONG_AT loc) + arguments) + END + 0 BEGIN + END + DEFAULT + LPF warning STR_VAR warning="warning: unknown length of offset" END + END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// count the files of a given type +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION count_files + STR_VAR file_ext="" + tv="no" + RET value +BEGIN + ACTION_IF ~%tv%~ STRING_EQUAL_CASE yes BEGIN + OUTER_SPRINT base ~%tutu_var%~ + END ELSE BEGIN + OUTER_SPRINT base ~~ + END + OUTER_SET value=0 + COPY_EXISTING_REGEXP GLOB ~%base%.*\.%file_ext%~ ~override~ + SET value+=1 + BUT_ONLY +END + + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// clone a list of scripts +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + + +DEFINE_ACTION_FUNCTION clone_script + STR_VAR script="" +BEGIN + ACTION_IF ~%script%~ STRING_COMPARE_CASE ~~ BEGIN + LAF return_first_pair STR_VAR list= ~%script%~ RET script=list old=key new=value END + COPY_EXISTING ~%old%.bcs~ ~override/%new%.bcs~ + LAF clone_script STR_VAR script END + END +END + + + + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////// Apply the function "arguments", which in turn takes arguments INT_VAR offset, (NOT offset_base) +//////////// STR_VAR filename, file_ext, to the offset of every strref in the file. +//////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION apply_to_strrefs + STR_VAR arguments="" filename="" file_ext="" +BEGIN + TO_LOWER file_ext + PATCH_MATCH "%file_ext%" WITH + are BEGIN + SPRINT fixed_loc "" + SPRINT ext_loc "trigger=>0x64 trigger=>0xb8 container=>0x84 door=>0x98 door=>0xb4 mapnote=>0x4" + // special case: the interruption explanation text + READ_LONG 0xc0 offset_base + FOR (i=0;i<10;i+=1) BEGIN + SET offset=offset_base + i * 0x4 + 0x20 + SPRINT fixed_loc "%fixed_loc% %offset%" + END + END + cre BEGIN + SPRINT fixed_loc "0x8 0xc" + SPRINT ext_loc "" + // special case: soundset + FOR (i=0;i<100;i+=1) BEGIN + SET offset=0xa4 + 0x4 * i + SPRINT fixed_loc "%fixed_loc% %offset%" + END + END + dlg BEGIN + SPRINT fixed_loc "" + SPRINT ext_loc "state=>0x0 transition=>0x4 transition=>0x8" + END + itm spl BEGIN + SPRINT fixed_loc "0x8 0xc 0x50 0x54" + SPRINT ext_loc "" + LPF apply_to_strrefs_opcode_helper STR_VAR file_ext RET opcode_loc=opcode_loc END + SPRINT fixed_loc "%fixed_loc% %opcode_loc%" + END + sto BEGIN + SPRINT fixed_loc "0xc" + SPRINT ext_loc "drink=>0x8" + END + wmp BEGIN + SPRINT fixed_loc "0x24" + SPRINT ext_loc "area=>0x40 area=>0x44" + END + wav bam vvc baf bcs 2da BEGIN + SPRINT fixed_loc "" + SPRINT ext_loc "" + END + eff BEGIN + SPRINT fixed_loc "" + SPRINT ext_loc "" + LPF warning STR_VAR warning="apply_to_strref has skipped %filename%.eff, which might be a problem in the vanishingly unlikely event it's got a strref in it" END + END + pro BEGIN + SPRINT fixed_loc "0x30" + SPRINT ext_loc "" + END + DEFAULT + SPRINT fixed_loc "" + SPRINT ext_loc "" + LPF warning STR_VAR warning="apply_to_strref can't patch file %filename%.%file_ext%: filetype not recognised" END + END + WHILE "%fixed_loc%" STRING_COMPARE "" BEGIN + LPF return_first_entry STR_VAR list="%fixed_loc%" RET offset=entry fixed_loc=list END + LPF "%arguments%" INT_VAR offset STR_VAR filename file_ext END + END + WHILE "%ext_loc%" STRING_COMPARE "" BEGIN + LPF return_first_pair STR_VAR list="%ext_loc%" RET entry_type=key offset_ext=value ext_loc=list END + LPM get_offset_array + PHP_EACH offset_array AS int=>offset_base BEGIN + LPF "%arguments%" INT_VAR offset=offset_base+offset_ext STR_VAR filename file_ext END + END + END +END + +DEFINE_PATCH_FUNCTION apply_to_strrefs_opcode_helper + STR_VAR file_ext="" + RET opcode_loc +BEGIN + SPRINT opcode_loc "" + // common + PATCH_FOR_EACH opcode IN 103 139 180 181 BEGIN + SPRINT $opcode_has_strref("%opcode%") "" + END + // game-specific + PATCH_IF GAME_IS "iwd how totlm iwd2" BEGIN + SPRINT $opcode_has_strref("183") "" + END ELSE + PATCH_IF GAME_IS "pst" BEGIN + END ELSE BEGIN // assume it's BG2 + PATCH_FOR_EACH opcode IN 206 253 254 267 290 BEGIN + SPRINT $opcode_has_strref("%opcode%") "" + END + END + PATCH_IF "%file_ext%" STRING_EQUAL_CASE itm BEGIN + SET length=0x38 + END ELSE BEGIN + SET length=0x28 + END + GET_OFFSET_ARRAY eq_eff ITM_V10_GEN_EFFECTS + PHP_EACH eq_eff AS int=>offset BEGIN + READ_SHORT offset opcode + PATCH_IF VARIABLE_IS_SET $opcode_has_strref("%opcode%") BEGIN + SET loc_here=offset + 0x4 + SPRINT opcode_loc "%opcode_loc% %loc_here%" + END + END + GET_OFFSET_ARRAY ab_arr 0x64 4 0x68 2 0 0 length + PHP_EACH ab_arr AS int=>ab_off BEGIN + GET_OFFSET_ARRAY2 eff_arr ab_off ITM_V10_HEAD_EFFECTS + PHP_EACH eff_arr AS int=>offset BEGIN + READ_SHORT offset opcode + PATCH_IF VARIABLE_IS_SET $opcode_has_strref("%opcode%") BEGIN + SET loc_here=offset + 0x4 + SPRINT opcode_loc "%opcode_loc% %loc_here%" + END + END + END +END + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////// Apply the function "arguments" to each strref in the file, treated as a plain text +//////////// file containing BAF script. The function takes argument "strref" and must return "strref_new", which is treated as +//////////// the new value of the strref (return the old value if you just want to log it or something) +//////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION apply_to_strrefs_script + STR_VAR arguments="" +BEGIN + REPLACE_EVALUATE "DisplayString\([A-Za-z]*\)(\([^,]+\),\([0-9]+\))" BEGIN + LPF "%arguments%" STR_VAR strref="%MATCH3%" filename RET strref_new=strref_new END + END + "DisplayString%MATCH1%(%MATCH2%,%strref_new%)" + REPLACE_EVALUATE "AddJournalEntry(\([0-9]+\)" BEGIN + LPF "%arguments%" STR_VAR strref="%MATCH1%" filename RET strref_new=strref_new END + END + "AddJournalEntry(%strref_new%" +END + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////// Apply the function "arguments" to each strref in the file, treated as a 2da +//////////// file. The function takes argument "strref" and must return "strref_new", which is treated as +//////////// the new value of the strref (return the old value if you just want to log it or something) +//////////// +//////////// Note that detection of which numbers in a 2da file are strrefs is of necessity a bit +//////////// heuristic. We assume that +//////////// - no integer lower than 160 is a strref (the actual values from 1-100 in BG2 are +//////////// dialog strings not referenced in 2das) +//////////// - no integer larger than 299999 is a strref (this is way bigger than any actual dlg) +//////////// - no integer in the following 2das is a strref: +//////////// banttimg clearair extanim extspeed happy pplane raisdead randcolr repmodst splashs2 splashsc startare startbp startpos strmod strmodex xpbonus xpcap xplevel xplist +//////////// +//////////// - no integer <10000 in the following is a strref: +//////////// end15fps endmve1 endmve2 endmve3 intro intro15f melissan xnewarea +/////////// - no integer in columns 0-2 of clastext is a strref +//////////// - nothing in hex notation is a strref +//////////// - all other integers are strrefs +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION apply_to_strrefs_2da + STR_VAR arguments="" +BEGIN + SPRINT filename "%SOURCE_RES%" + TO_LOWER filename + PATCH_MATCH "%filename%" WITH + banttimg clascolr clearair extanim extspeed happy pplane raisdead randcolr repmodst splashs2 splashsc startare startbp startpos strmod strmodex xpbonus xpcap xplevel xplist + BEGIN + SET min=0 + SET max=0 + SET col=0 + END + end15fps endmve1 endmve2 endmve3 intro intro15f melissan xnewarea + BEGIN + SET min=10000 + SET max=299999 + SET col=0 + END + clastext + BEGIN + SET min=160 + SET max=299999 + SET col=3 + END + statdesc + BEGIN + SET min=256 + SET max=299999 + SET col=0 + END + DEFAULT + SET min=160 + SET max=299999 + SET col=0 + END + PATCH_IF max>0 BEGIN + COUNT_2DA_COLS colcount + COUNT_2DA_ROWS colcount rowcount + FOR (row=0;row= rowcount BEGIN + READ_2DA_ENTRY (rowcount - 1) 0 3 last_entry + SET stat_num=last_entry + 1 + SET row=rowcount + INSERT_2DA_ROW rowcount 3 "%stat_num% -1 ****" + END ELSE BEGIN + READ_2DA_ENTRY start_row 1 3 entry + PATCH_IF entry<=0 BEGIN + READ_2DA_ENTRY start_row 0 3 stat_num + SET row=start_row + END ELSE BEGIN + SET start_row +=1 + LPF add_to_statdesc_helper INT_VAR start_row rowcount RET stat_num row END + END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///// Find what level a character would be at a given XP level +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION level_at_xp + INT_VAR xp=0 + num_classes=1 + STR_VAR class="" + RET level +BEGIN + // safety check + ACTION_IF num_classes<1 BEGIN + OUTER_SET num_classes=1 + LAF warning STR_VAR warning="num_classes variable in the 'level_at_xp' function set to 0 or negative value. Resetting to 1." END + END + // adjust the XP for multiclassing + OUTER_SET xp=xp / num_classes + // check the table + COPY_EXISTING xplevel.2da override + COUNT_2DA_COLS colcount + LPF get_table_row_coordinate STR_VAR row="%class%" RET rownum END + PATCH_IF rownum<0 BEGIN + LPF warning STR_VAR warning="level_at_xp can't determine the level for class %class% as it isn't in xplevel.2da" END + END ELSE BEGIN + LPF level_at_xp_core INT_VAR xp rownum colcount RET level END + END + BUT_ONLY +END + + + +DEFINE_PATCH_FUNCTION level_at_xp_core + INT_VAR min_level=1 + xp=0 + rownum=0 + colcount=40 + RET level +BEGIN + PATCH_IF min_level >= colcount BEGIN + SET level=min_level + END ELSE BEGIN + READ_2DA_ENTRY rownum (min_level+1) colcount xp_here + PATCH_IF xp_here > xp BEGIN + SET level=min_level + END ELSE BEGIN + SET min_level +=1 + LPF level_at_xp_core INT_VAR min_level xp rownum colcount RET level END + END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///// Find what level a character would be at the level cap +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION level_at_xp_cap + STR_VAR class="" + parent_class="" + RET level +BEGIN + ACTION_IF "%parent_class%" STRING_EQUAL "" BEGIN + OUTER_SPRINT parent_class "%class%" + END + // count the number of classes + OUTER_PATCH_SAVE list "%parent_class%" BEGIN + REPLACE_TEXTUALLY "_" " " + END + LAF length_of_list STR_VAR list RET num_classes=value END + // get the XP cap + LAF read_table_entry INT_VAR colnum=1 STR_VAR file=xpcap row="%parent_class%" RET xp=value END + LAF level_at_xp INT_VAR xp num_classes STR_VAR class RET level END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///// Sort out a SPLPROT entry +///// +///// through stupid design choices, this uses 'value' both as input and output. Too many uses to change now. +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION resolve_splprot_entry + INT_VAR stat=0 + value=0 + relation_number=0 + STR_VAR relation="" + RET value +BEGIN + OUTER_SET splprot_value=value + ACTION_MATCH "%relation%" WITH + equals equal BEGIN + OUTER_SET relation_number=1 + END + greater greater_than BEGIN + OUTER_SET relation_number=3 + END + less less_than BEGIN + OUTER_SET relation_number=2 + END + greater_equal greater_equals BEGIN + OUTER_SET relation_number= 4 + END + less_than_equal less_equal less_than_equals less_than_equals BEGIN + OUTER_SET relation_number=0 + END + not_equal BEGIN + OUTER_SET relation_number=5 + END + "" BEGIN END + DEFAULT + LAF warning STR_VAR warning="unrecognised relation %relation% in resolve_splprot_entry; defaulting to 0" END + OUTER_SET relation_number=0 + END + COPY_EXISTING "splprot.2da" override + READ_2DA_ENTRIES_NOW splprot_array 4 + SET value="-1" + FOR (i=0;i=0 BEGIN + SPRINT top_row "IDS V1.0" + END ELSE BEGIN + COUNT_2DA_ROWS 1 rowcount_1 + PATCH_IF rowcount_1=ids_array BEGIN + SPRINT top_row " " + END ELSE BEGIN + READ_2DA_ENTRY 0 0 1 top_row + END + END + FOR (i=0;imax ? num : max + READ_2DA_ENTRY_FORMER ids_array i 1 val + PATCH_IF "%val%" STRING_COMPARE_CASE DMWW_UNUSED_FOR_DELETION BEGIN + PATCH_IF VARIABLE_IS_SET $ids_entries("%num%") BEGIN + SPRINT temp $ids_entries("%num%") + SPRINT $ids_entries("%num%") "%temp% %val%" + END ELSE BEGIN + SPRINT $ids_entries("%num%") "%val%" + END + END + END + END + BUT_ONLY + COPY ".../stratagems-inline/blank" "override/%ids%.ids" + INSERT_2DA_ROW 0 2 "DW_SORT_IDS_PLACEHOLDER" + SET rowcount=0 + FOR (num=0;num<=max;num+=1) BEGIN + PATCH_IF VARIABLE_IS_SET $ids_entries("%num%") BEGIN + SPRINT list $ids_entries("%num%") + WHILE "%list%" STRING_COMPARE "" BEGIN + LPF return_first_entry STR_VAR list RET entry list END + SPRINT check "%num%--%entry%" + PATCH_IF !VARIABLE_IS_SET "%check%" BEGIN + INSERT_2DA_ROW rowcount 2 "%num% %entry%" + SET rowcount+=1 + SPRINT "%check%" "" + END + END + END + END + REPLACE_TEXTUALLY "DW_SORT_IDS_PLACEHOLDER" "%top_row%" +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///// Read a file into an array +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +DEFINE_ACTION_FUNCTION read_file_into_array + STR_VAR file="" + location="" + locbase="" + locabs="" + inline="no" + RET file_length + RET_ARRAY file_contents +BEGIN + PRINT "Reading in file %file% to array..." + ACTION_IF "%inline%" STRING_EQUAL_CASE "yes" BEGIN + COPY ".../stratagems-inline/%file%" "%workspace%/file_to_read.txt" EVALUATE_BUFFER + END ELSE BEGIN + LAF get_directory STR_VAR location locabs locbase RET full_loc=directory END + ACTION_IF "%full_loc%" STRING_EQUAL_CASE "override" BEGIN + COPY_EXISTING "%file%" "%workspace%/file_to_read.txt" EVALUATE_BUFFER + END ELSE BEGIN + COPY "%full_loc%/%file%" "%workspace%/file_to_read.txt" EVALUATE_BUFFER + END + END + APPEND_OUTER "%workspace%/file_to_read.txt" "" // ensure final line break + OUTER_SPRINT $file_contents("0") "" // make sure the array exists even if file is empty + COPY "%workspace%/file_to_read.txt" "%workspace%" + SET index=0 + REPLACE_EVALUATE "\(.*%WNL%\)" + BEGIN + SPRINT $file_contents("%index%") "%MATCH1%" + index +=1 + END + "" + BUT_ONLY + OUTER_SET file_length=index - 1 + PRINT "...done" +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///// Write an array into a file +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +DEFINE_ACTION_FUNCTION write_array_into_file + STR_VAR file="" + file_contents="" +BEGIN + + PRINT "Outputting array to file %file%..." + OUTER_SPRINT outputstring "" + ACTION_PHP_EACH "%file_contents%" AS ind=>line BEGIN + OUTER_SPRINT outputstring "%outputstring%%line%" + END + COPY ".../stratagems-inline/blank" "%file%" + APPEND_OUTER "%file%" "%outputstring%" KEEP_CRLF + PRINT "...done" +END + +/////////////////////////////////////////////////////////////////////////////// +////Add a sectype with no associated string +//////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION add_silent_sectype + STR_VAR sectype="" + RET sectype_value +BEGIN + ADD_SECTYPE "%sectype%" "" + OUTER_SET sectype_value="%sectype%" + COPY_EXISTING "msectype.2da" override + REPLACE_TEXTUALLY "%sectype%\( \|%TAB%\)+[0-9]+\(%WNL%\|%LNL%\|%MNL%\)" "%sectype% -1" + BUT_ONLY +END + +/////////////////////////////////////////////////////////////////////////////// +////Add an animation +//////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION add_animation_entry + INT_VAR minimum=0 + STR_VAR animation="" + ini="" + location="" + locbase="" + locabs="" +BEGIN + OUTER_INNER_PATCH "" BEGIN + LOOKUP_IDS_SYMBOL_OF_INT check animate minimum + END + ACTION_IF IS_AN_INT check BEGIN + OUTER_SET value=minimum + LAF get_directory STR_VAR location locbase RET file_loc=directory END + LAF hexify INT_VAR in=value pad_length=4 RET out END + OUTER_INNER_PATCH_SAVE out_short "%out%" BEGIN + REPLACE_TEXTUALLY "0x" "" + END + // ACTION_TO_UPPER out + APPEND animate.ids "%out% %animation%" + COPY "%file_loc%/%ini%.ini" "override/%out_short%.ini" EVALUATE_BUFFER + END ELSE BEGIN + OUTER_SET minimum+=1 + LAF add_animation_entry INT_VAR minimum STR_VAR animation ini location locbase locabs END + END +END + +////////////////////////////////////////////////////////// +// Script installation +////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION install_script + STR_VAR script="" location="" locbase="" locabs="" +BEGIN + ACTION_IF "%script%" STRING_EQUAL "" BEGIN + WARN "install_script called with empty argument" + END + LAF get_directory STR_VAR location locbase locabs RET directory END + OUTER_WHILE "%script%" STRING_COMPARE_CASE "" BEGIN + LAF return_first_entry STR_VAR list="%script%" RET entry script=list END + ACTION_IF VARIABLE_IS_SET "%entry%" BEGIN + OUTER_SPRINT resref EVAL "%%entry%%" + COPY "%directory%/%entry%.baf" "override/%resref%.bcs" + EVALUATE_BUFFER + COMPILE_BAF_TO_BCS + END ELSE BEGIN + WARN "Script %entry% is not recognised" + END + END + + +END + + diff --git a/iwdification/sfo/general/lib_interject.tpa b/iwdification/sfo/general/lib_interject.tpa new file mode 100644 index 0000000..9bd2f4f --- /dev/null +++ b/iwdification/sfo/general/lib_interject.tpa @@ -0,0 +1,343 @@ +DEFINE_PATCH_FUNCTION generate_interjection + INT_VAR line_count_here=0 + passback_state_number="-1" + needs_passback=0 + global_passback_say="-1" + STR_VAR condition="" + dialog_main="" + stack="" + stack_base="" + RET stack + passback_state_number +BEGIN + INNER_ACTION BEGIN + OUTER_SPRINT data "" + OUTER_SPRINT marker1 ~Global("DW_substitute_var","GLOBAL",1)~ + OUTER_SPRINT marker2 ~Global("DW_substitute_var","GLOBAL",2)~ + OUTER_SPRINT action_placeholder ~Global("DW_action_placeholder","GLOBAL",1)~ + OUTER_SET block_count=0 + OUTER_FOR (this_line = line_count_here - 1; this_line >=0; this_line = this_line - 1) BEGIN + ACTION_IF this_line = line_count_here - 1 BEGIN + OUTER_SPRINT initial_dialog_temp $ict_array_dialog_temp("%this_line%") + OUTER_SPRINT maybe_marker "%marker1%" + END ELSE BEGIN + OUTER_SPRINT maybe_marker "" + END + OUTER_SPRINT dialog $ict_array_dialog_temp("%this_line%") + OUTER_SPRINT say_strref $ict_array_say_temp("%this_line%") + OUTER_SPRINT do $ict_array_do_temp("%this_line%") + OUTER_SPRINT data "%data%%WNL%APPEND %dialog%%WNL%IF ~%maybe_marker%~ THEN BEGIN block_%block_count% %WNL%SAY #%say_strref%%WNL%" + OUTER_SET block_count +=1 + ACTION_IF this_line=0 BEGIN + OUTER_SPRINT final_do "%do%" + OUTER_SPRINT data "%data%IF ~%marker2%~ THEN EXIT%WNL% END%WNL% END%WNL%" + END ELSE BEGIN + OUTER_SET next_line = this_line - 1 + OUTER_SPRINT next_dialog $ict_array_dialog_temp("%next_line%") + ACTION_IF "%do%" STRING_EQUAL "" BEGIN + OUTER_SPRINT do_line "" + END ELSE BEGIN + OUTER_SPRINT do_line "DO ~%do%~" + END + OUTER_SPRINT data "%data%IF ~~ THEN %do_line% EXTERN %next_dialog% block_%block_count% %WNL%END %WNL%END%WNL%" + END + OUTER_SPRINT last_dialog_temp "%dialog%" + ACTION_IF needs_passback && "%last_dialog_temp%" STRING_COMPARE_CASE "%dialog_main%" BEGIN + ACTION_IF passback_state_number<0 BEGIN + LAF make_passback INT_VAR global_passback_say STR_VAR dialog_main stack_base RET passback_state_number END + END + OUTER_SPRINT base_trans "IF ~~ THEN EXTERN %dialog_main% %passback_state_number%%WNL%" + END ELSE BEGIN + OUTER_SPRINT base_trans "%stack_base%" + END + END + <<<<<<<< .../stratagems-inline/temp.d + %data% + >>>>>>>> + COMPILE ".../stratagems-inline/temp.d" EVALUATE_BUFFER + + + LAF FIND_DLG_BLOCK STR_VAR dialog="%initial_dialog_temp%" match="%marker1%" RET block_number END + LAF EXTRACT_DLG_BLOCK INT_VAR block_number STR_VAR dialog="%initial_dialog_temp%" RET block END + COPY_EXISTING "%initial_dialog_temp%.dlg" override + DECOMPILE_AND_PATCH BEGIN + REPLACE_TEXTUALLY "%marker1%" "" + REPLACE_TEXTUALLY "EXTERN %initial_dialog_temp%" "GOTO" + END + BUT_ONLY + COPY_EXISTING "%last_dialog_temp%.dlg" override + DECOMPILE_AND_PATCH BEGIN + REPLACE_TEXTUALLY "\(%WNL%\|%LNL%\|%MNL%\)" " " + REPLACE_TEXTUALLY "IF ~ *%marker2% *~ THEN EXIT" "%base_trans%%stack%" + REPLACE_TEXTUALLY "%action_placeholder%" "" + REPLACE_TEXTUALLY "EXTERN %last_dialog_temp%" "GOTO" + END + BUT_ONLY + OUTER_SPRINT stack "%stack%IF ~%condition%~ THEN DO ~%action_placeholder%~ EXTERN %initial_dialog_temp% %block_number%%WNL%" + END +END + +DEFINE_PATCH_FUNCTION parse_ict_line + STR_VAR line="" + RET dialog condition say do success +BEGIN + INNER_PATCH "%line%" BEGIN + SET success=0 + SPRINT dialog "" + SPRINT condition "" + SET say_strref=0 + SPRINT do "" + REPLACE_EVALUATE " DO ~\([^~]*\)~" BEGIN + SPRINT do "%MATCH1%" + END + "" + REPLACE_EVALUATE "^ *?~\([^ ~]*\)?~ *IF +~\([^~]*\)~ *THEN @\([0-9]+\)" BEGIN + SET success=1 + SPRINT dialog "%MATCH1%" + SPRINT condition "%MATCH2%" + SPRINT say_strref "%MATCH3%" + END + "" + SET say = RESOLVE_STR_REF (( AT say_strref)) + END +END + +DEFINE_PATCH_FUNCTION parse_ict_command +BEGIN + SET linecount=0 + // evaluate any variables + EVALUATE_BUFFER + // get the header data + REPLACE_EVALUATE "I_C_T[34] +~?\([^ ~]+\)~? +\([^ ]+\) +\([^ %WNL%%LNL%%MNL%]+\)" BEGIN + SPRINT dialog_main "%MATCH1%" + SET dialog_main_state="%MATCH2%" + SPRINT control_var "%MATCH3%" + END + "" + SET global_passback_say="-1" + // look for a global passback (do this before removing commented-out lines) + // it's defined as a condition-free block with the main dialog as its start + REPLACE_EVALUATE "== *~?%dialog_main%~? +@\([0-9]+\)" BEGIN + SET global_passback_say= RESOLVE_STR_REF (( AT "%MATCH1%")) + END + "" + // assess whether we need a passback + LPF assess_main_state_do_commands INT_VAR dialog_main_state STR_VAR dialog_main RET needs_passback do_list END + // get the initial transitions and add a placeholder + LPF process_main_state_transitions INT_VAR dialog_main_state needs_passback STR_VAR dialog_main RET stack_base END + // prepare file for general read + // remove comments + REPLACE_TEXTUALLY "//.*\(%WNL%\|%MNL%\|%LNL%\)" "" + // remove line breaks + REPLACE_TEXTUALLY "\(%WNL%\|%MNL%\|%LNL%\)" " " + // set aside the 'END' block + REPLACE_TEXTUALLY "END$" "%WNL%END" + // get the main entries + REPLACE_EVALUATE "==\([^=]*\)" BEGIN + LPF parse_ict_line STR_VAR line="%MATCH1%" RET dialog condition say do END + SET $ict_array_say("%linecount%")=say + SPRINT $ict_array_dialog("%linecount%") "%dialog%" + SPRINT $ict_array_condition("%linecount%") "%condition%" + SPRINT $ict_array_do("%linecount%") "%do%" + SET linecount +=1 + END + "" + // do the actual processing of the main entries + SET lastline = linecount - 1 + SET passback_state_number="-1" + SPRINT stack "" + SPRINT current_condition $ict_array_condition("%lastline%") + CLEAR_ARRAY ict_array_dialog_temp + CLEAR_ARRAY ict_array_say_temp + CLEAR_ARRAY ict_array_do_temp + SET line_count_here=0 + FOR (this_line=lastline; this_line>=0; this_line = this_line - 1) BEGIN + SPRINT new_condition $ict_array_condition("%this_line%") + PATCH_IF "%new_condition%" STRING_COMPARE_CASE "%current_condition%" BEGIN + LPF generate_interjection INT_VAR needs_passback passback_state_number line_count_here global_passback_say STR_VAR dialog_main stack stack_base condition="%current_condition%" RET passback_state_number stack END + CLEAR_ARRAY ict_array_dialog_temp + CLEAR_ARRAY ict_array_say_temp + CLEAR_ARRAY ict_array_do_temp + SET line_count_here=0 + SPRINT current_condition "%new_condition%" + END + SPRINT $ict_array_dialog_temp("%line_count_here%") $ict_array_dialog("%this_line%") + SPRINT $ict_array_say_temp("%line_count_here%") $ict_array_say("%this_line%") + SPRINT $ict_array_do_temp("%line_count_here%") $ict_array_do("%this_line%") + SET line_count_here +=1 + END + LPF generate_interjection INT_VAR needs_passback passback_state_number line_count_here global_passback_say STR_VAR dialog_main stack stack_base condition="%current_condition%" RET passback_state_number stack END + // put the original interjection in + SPRINT action_placeholder ~Global("DW_action_placeholder","GLOBAL",1)~ + INNER_PATCH_SAVE stack "%stack%" BEGIN + REPLACE_TEXTUALLY ~%action_placeholder%~ ~SetGlobal("%control_var%","GLOBAL",1)%do_list%~ + REPLACE_TEXTUALLY "IF ~\([^~]\)" ~~~~~IF ~Global("%control_var%","GLOBAL",0)\1~~~~~ + END + SPRINT marker ~Global("dw_initial_block_placeholder","GLOBAL",1)~ + INNER_ACTION BEGIN + COPY_EXISTING "%dialog_main%.dlg" override + DECOMPILE_AND_PATCH BEGIN + REPLACE_TEXTUALLY "\(%WNL%\|%LNL%\|%MNL%\)" " " + REPLACE_TEXTUALLY "IF ~ *%marker% *~ THEN EXIT" "%stack%" + READ_ASCII 0x0 data (BUFFER_LENGTH) + END + BUT_ONLY + END +END + +DEFINE_ACTION_FUNCTION compile_with_ict_handling + STR_VAR dialog="" +BEGIN + COPY "%dialog%.d" "%workspace%/temp_dialog.d" + EVALUATE_BUFFER + LPF decomment_code END + LPF handle_ict_blocks END + COMPILE "%workspace%/temp_dialog.d" + + +END + +DEFINE_PATCH_FUNCTION assess_main_state_do_commands + INT_VAR dialog_main_state=0 + STR_VAR dialog_main="" + RET needs_passback + do_list +BEGIN + SET needs_passback=0 + SPRINT do_list null + INNER_ACTION BEGIN + COPY_EXISTING "%dialog_main%.dlg" "%workspace%" + READ_LONG 0x28 action_off + GET_OFFSET_ARRAY state_array 0xc 4 0x8 4 0 0 0x10 + PHP_EACH state_array AS state_ind=>state_off BEGIN + PATCH_IF state_ind=dialog_main_state BEGIN + GET_OFFSET_ARRAY2 response_array state_off 0x14 4 0x8 4 0x4 4 0x20 + PHP_EACH response_array AS response_ind=>response_off BEGIN + READ_BYTE response_off bytes + PATCH_IF (bytes BOR 0b11111011) = 0b11111111 BEGIN + READ_LONG 0x10+response_off action_ind + READ_LONG (0x8*action_ind+action_off) this_action_off + READ_LONG (0x8*action_ind+action_off+4) this_action_length + READ_ASCII this_action_off this_action_text (this_action_length) + PATCH_IF "%do_list%" STRING_EQUAL null BEGIN + SPRINT do_list "%this_action_text%" + END ELSE BEGIN + PATCH_IF "%do_list%" STRING_COMPARE_CASE "%this_action_text%" BEGIN + SET needs_passback=1 + END + END + END ELSE BEGIN + PATCH_IF "%do_list%" STRING_EQUAL null BEGIN + SPRINT do_list "" + END ELSE BEGIN + PATCH_IF "%do_list%" STRING_COMPARE "" BEGIN + SET needs_passback=1 + SPRINT do_list "" + END + END + END + END + END + END + BUT_ONLY + END + PATCH_IF INDEX ( "StartStore" "%do_list%" )>=0 BEGIN + SET needs_passback=1 + END +END + +DEFINE_PATCH_FUNCTION process_main_state_transitions + INT_VAR needs_passback=0 + dialog_main_state=0 + STR_VAR dialog_main="" + RET stack_base +BEGIN + SPRINT stack "" + INNER_ACTION BEGIN + LAF EXTRACT_DLG_BLOCK INT_VAR block_number=dialog_main_state STR_VAR dialog="%dialog_main%" RET block_old=block END + END + INNER_PATCH "%block_old%" BEGIN + REPLACE_TEXTUALLY "\(%WNL%\|%MNL%\|%LNL%\)" " " + REPLACE_EVALUATE "SAY #[0-9]+ +\(IF.*\)END *$" BEGIN + SPRINT stack_base "%MATCH1%" + INNER_PATCH_SAVE stack_base "%stack_base%" BEGIN + REPLACE_TEXTUALLY "GOTO +\([0-9]+\)\([^0-9]\)" "EXTERN %dialog_main% \1\2" + END + END + "" + END + SPRINT marker ~Global("dw_initial_block_placeholder","GLOBAL",1)~ + INNER_PATCH_SAVE block_new "%block_old%" BEGIN + REPLACE_TEXTUALLY "END\(%WNL%\|%LNL%\|%MNL%\| \)*$" "IF ~%marker%~ THEN EXIT %WNL%END%WNL%" + END + INNER_ACTION BEGIN + COPY_EXISTING "%dialog_main%.dlg" override + DECOMPILE_AND_PATCH BEGIN + REPLACE_TEXTUALLY "%block_old%" "%block_new%" + END + BUT_ONLY + END + PATCH_IF !needs_passback BEGIN + INNER_PATCH_SAVE stack_base "%stack_base%" BEGIN + REPLACE_TEXTUALLY "DO ~[^~]*~" "" + END + END +END + +DEFINE_ACTION_FUNCTION make_passback + INT_VAR global_passback_say="-1" + STR_VAR dialog_main="" + stack_base="" + RET passback_state_number +BEGIN + ACTION_IF global_passback_say<0 BEGIN + OUTER_SET global_passback_say = RESOLVE_STR_REF ("") + END + <<<<<<<< .../stratagems-inline/temp.d + APPEND %dialog_main% + IF ~Global("dw_temp_marker","GLOBAL",1)~ THEN BEGIN passback + SAY #%global_passback_say% + %stack_base% + END + END + >>>>>>>> + COMPILE ".../stratagems-inline/temp.d" EVALUATE_BUFFER + LAF FIND_DLG_BLOCK STR_VAR dialog="%dialog_main%" match="dw_temp_marker" RET passback_state_number=block_number END + COPY_EXISTING "%dialog_main%.dlg" override + DECOMPILE_AND_PATCH BEGIN + REPLACE_TEXTUALLY ~Global("dw_temp_marker","GLOBAL",1)~ "" + END + BUT_ONLY +END + +DEFINE_PATCH_FUNCTION decomment_code +BEGIN + SET finished=0 + WHILE INDEX_BUFFER ("/\*")>=0 && !finished BEGIN + SET start=INDEX_BUFFER ("/\*") + SET end=INDEX_BUFFER ("\*/") + PATCH_IF start>=end BEGIN + SET finished=1 + END ELSE BEGIN + READ_ASCII start data (end + 2 - start) + DELETE_BYTES start (end + 2 - start) + END + END + REPLACE_TEXTUALLY "//.*" "" +END + +DEFINE_PATCH_FUNCTION handle_ict_blocks +BEGIN + SET start=INDEX_BUFFER ("I_C_T") + SET end = INDEX_BUFFER (CASE_SENSITIVE "END" start) + PATCH_IF end>start BEGIN + SET finished=0 + READ_ASCII start block (end + 3 - start) + INNER_PATCH "%block%" BEGIN + LPF parse_ict_command END + END + DELETE_BYTES start (end + 3 - start) + LPF handle_ict_blocks END + END + +END \ No newline at end of file diff --git a/iwdification/sfo/general/lib_internal.tpa b/iwdification/sfo/general/lib_internal.tpa new file mode 100644 index 0000000..db6dd29 --- /dev/null +++ b/iwdification/sfo/general/lib_internal.tpa @@ -0,0 +1,1064 @@ +/// +/// SFO_reserved_build_function_control: +/// 0: baseline behaviour: build through reinclude +/// 1: output a text file, also build through reinclude +/// 2: skip entirely + +////////////////////////////////////////////////////////////////////////// +///// +///// Functions should go here only if they are (intended to be) called +///// exclusively within SFO itself +///// +////////////////////////////////////////////////////////////////////////// + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// define a set of simple data-field-editing functions from a table +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +DEFINE_ACTION_FUNCTION build_simple_data_field_editors + STR_VAR lookup_table="" + function_prefix="" + offset_base="" + secondary="no" + +BEGIN + ACTION_IF !VARIABLE_IS_SET SFO_reserved_build_function_control BEGIN + OUTER_SET SFO_reserved_build_function_control=0 + END + ACTION_IF !VARIABLE_IS_SET SFO_reserved_build_function_location BEGIN + OUTER_SPRINT SFO_reserved_build_function_location "%workspace%" + END + + ACTION_IF !(SFO_reserved_build_function_control=2) BEGIN // if it's 2, do nothing + ACTION_PHP_EACH ~%lookup_table%~ AS function => arglist BEGIN + LAUNCH_ACTION_FUNCTION decompose_CSV STR_VAR input= ~%arglist%~ RET offset=argument_0 type=argument_1 END + ACTION_MATCH ~%offset_base%~ + WITH + ~~ no + BEGIN + OUTER_SPRINT ~offset_formula~ ~%offset%~ + END + yes + BEGIN + ACTION_IF "%secondary%" STRING_EQUAL_CASE yes BEGIN + OUTER_SPRINT ~offset_formula~ ~(%offset% + offset_secondary)~ + END ELSE BEGIN + OUTER_SPRINT ~offset_formula~ ~(%offset% + offset_base)~ + END + END + DEFAULT + FAIL "unknown argument for build_simple_data_field_editors" + END + + OUTER_SPRINT arg_string ~STR_VAR arguments="" RET value~ + OUTER_SPRINT simple_arg_string "STR_VAR arguments=~null~ RET value" + OUTER_SPRINT parse_string "" + OUTER_SPRINT parse_string_int ~LPF fail_unless_int STR_VAR value="%arguments%" expression="" END~ + + + ACTION_MATCH ~%type%~ + WITH ~ASCII~ + BEGIN + OUTER_SPRINT ~definition~ + ~DEFINE_PATCH_FUNCTION %function_prefix%_%function% + %arg_string% + BEGIN + %parse_string% + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII %offset_formula% "" (8) + END + DEFAULT + WRITE_ASCIIE %offset_formula% "%percentage%arguments%percentage%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION %function_prefix%_read_%function% + %simple_arg_string% + BEGIN + READ_ASCII %offset_formula% value + END + ~ + END + ~ASCII20~ + BEGIN + OUTER_SPRINT ~definition~ + ~DEFINE_PATCH_FUNCTION %function_prefix%_%function% + %arg_string% + BEGIN + %parse_string% + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII %offset_formula% "" (0x20) + END + DEFAULT + WRITE_ASCIIE %offset_formula% "%percentage%arguments%percentage%" (0x20) + END + SET value=1 + END + + DEFINE_PATCH_FUNCTION %function_prefix%_read_%function% + %simple_arg_string% + BEGIN + READ_ASCII %offset_formula% value (0x20) NULL + END + ~ + END + ~ASCII2~ + BEGIN + OUTER_SPRINT ~definition~ + ~DEFINE_PATCH_FUNCTION %function_prefix%_%function% + %arg_string% + BEGIN + %parse_string% + WRITE_ASCIIE %offset_formula% "%percentage%arguments%percentage%" (0x2) + SET value=1 + END + + DEFINE_PATCH_FUNCTION %function_prefix%_read_%function% + %simple_arg_string% + BEGIN + READ_ASCII %offset_formula% value (0x2) NULL + END + ~ + END + SSHORT SLONG SBYTE BEGIN + OUTER_PATCH_SAVE type_write "%type%" BEGIN + DELETE_BYTES 0x0 1 + END + OUTER_SPRINT ~definition~ ~ + DEFINE_PATCH_FUNCTION %function_prefix%_%function% + %arg_string% + BEGIN + %parse_string_int% + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_%type_write% %offset_formula% arguments + END + SET value=1 + END + + DEFINE_PATCH_FUNCTION %function_prefix%_%function%GT + %arg_string% + BEGIN + %parse_string_int% + PATCH_IF %type%_AT %offset_formula% < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_%type_write% %offset_formula% arguments + END + END + SET value=1 + END + + DEFINE_PATCH_FUNCTION %function_prefix%_%function%LT + %arg_string% + BEGIN + %parse_string_int% + PATCH_IF %type%_AT %offset_formula% > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_%type_write% %offset_formula% arguments + END + END + SET value=1 + END + + DEFINE_PATCH_FUNCTION %function_prefix%_read_%function% %simple_arg_string% BEGIN READ_%type% %offset_formula% value END + ~ + END + DEFAULT + OUTER_SPRINT ~definition~ ~ + DEFINE_PATCH_FUNCTION %function_prefix%_%function% + %arg_string% + BEGIN + %parse_string_int% + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_%type% %offset_formula% arguments + END + SET value=1 + END + + DEFINE_PATCH_FUNCTION %function_prefix%_%function%GT + %arg_string% + BEGIN + %parse_string_int% + PATCH_IF %type%_AT %offset_formula% < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_%type% %offset_formula% arguments + END + END + SET value=1 + END + + DEFINE_PATCH_FUNCTION %function_prefix%_%function%LT + %arg_string% + BEGIN + %parse_string_int% + PATCH_IF %type%_AT %offset_formula% > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_%type% %offset_formula% arguments + END + END + SET value=1 + END + + DEFINE_PATCH_FUNCTION %function_prefix%_read_%function% + %simple_arg_string% + BEGIN + READ_%type% %offset_formula% value + END + ~ + END + ACTION_IF SFO_reserved_build_function_control<2 BEGIN + LAUNCH_ACTION_FUNCTION action_reinclude_this STR_VAR input= ~%definition%~ END + END + ACTION_IF SFO_reserved_build_function_control=1 BEGIN + ACTION_IF !FILE_EXISTS "%SFO_reserved_build_function_location%/SFO_autofunc.tpa" BEGIN + COPY ".../stratagems-inline/blank" "%SFO_reserved_build_function_location%/SFO_autofunc.tpa" + END + <<<<<<<< .../stratagems-inline/func_to_add.tpa + %definition% + >>>>>>>> + APPEND_OUTER "%SFO_reserved_build_function_location%/SFO_autofunc.tpa" " %definition%" + END + END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// define a set of simple data-field-editing functions using IDS lookup from a table +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +DEFINE_ACTION_FUNCTION build_IDS_data_field_editors + STR_VAR lookup_table="" + function_prefix="" + offset_base="" + secondary="no" + +BEGIN + + ACTION_IF !VARIABLE_IS_SET SFO_reserved_build_function_control BEGIN + OUTER_SET SFO_reserved_build_function_control=0 + END + ACTION_IF !VARIABLE_IS_SET SFO_reserved_build_function_location BEGIN + OUTER_SPRINT SFO_reserved_build_function_location "%workspace%" + END + ACTION_IF !(SFO_reserved_build_function_control=2) BEGIN // if it's 2, do nothing + OUTER_SPRINT arg_string ~STR_VAR arguments="" RET value~ + OUTER_SPRINT simple_arg_string "%arg_string%" + OUTER_SPRINT parse_string "" + + + + ACTION_PHP_EACH ~%lookup_table%~ AS function => arglist BEGIN + LAF decompose_CSV STR_VAR input= ~%arglist%~ RET offset=argument_0 type=argument_1 idsfile=argument_2 END + ACTION_MATCH ~%offset_base%~ + WITH + ~~ no + BEGIN + OUTER_SPRINT ~offset~ ~%offset%~ + END + yes + BEGIN + OUTER_SPRINT ~offset~ ~(%offset% + offset_base)~ + END + DEFAULT + FAIL "unknown argument for offset_base in build_IDS_data_field_editors" + END + ACTION_IF ~%type%~ STRING_EQUAL_CASE ~LONG_REVERSED~ THEN BEGIN + OUTER_SPRINT definition ~ + DEFINE_PATCH_FUNCTION %function_prefix%_%function% %arg_string% BEGIN + %parse_string% + PATCH_IF "%arguments%" STRING_COMPARE_CASE "no_change" BEGIN + SET ids_value = IDS_OF_SYMBOL (%idsfile% "%arguments%") + PATCH_IF ids_value>0 BEGIN + LPF reverse_long INT_VAR input=ids_value RET ids_value=output END + WRITE_LONG %offset% ids_value + END ELSE BEGIN + PATCH_FAIL "Tried to set nonexistent %idsfile% entry %arguments%" + END + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION %function_prefix%_read_%function% %simple_arg_string% BEGIN + READ_LONG %offset% value_ids + LPF reverse_long INT_VAR input=value_ids RET value_ids=output END + LOOKUP_IDS_SYMBOL_OF_INT value %idsfile% value_ids + END + + ~ + END ELSE BEGIN + OUTER_SPRINT ~definition~ ~ + DEFINE_PATCH_FUNCTION %function_prefix%_%function% %arg_string% BEGIN + %parse_string% + PATCH_IF "%arguments%" STRING_COMPARE_CASE "no_change" BEGIN + SET ids_value = IDS_OF_SYMBOL (%idsfile% "%arguments%") + PATCH_IF ids_value>0 BEGIN + WRITE_%type% %offset% ids_value + END ELSE BEGIN + PATCH_FAIL "Tried to set nonexistent %idsfile% entry %arguments%" + END + SET value=1 + END + END + + DEFINE_PATCH_FUNCTION %function_prefix%_read_%function% %simple_arg_string% BEGIN + READ_%type% %offset% value_ids + LOOKUP_IDS_SYMBOL_OF_INT value %idsfile% value_ids + END + + ~ + END + ACTION_IF ~%secondary%~ STRING_EQUAL_CASE ~yes~ BEGIN + OUTER_PATCH_SAVE ~definition~ ~%definition%~ BEGIN + REPLACE_TEXTUALLY ~offset_base~ ~offset_secondary~ + END + END + ACTION_IF SFO_reserved_build_function_control<2 BEGIN + LAUNCH_ACTION_FUNCTION action_reinclude_this STR_VAR input= ~%definition%~ END + END + ACTION_IF SFO_reserved_build_function_control=1 BEGIN + ACTION_IF !FILE_EXISTS "%SFO_reserved_build_function_location%/SFO_autofunc.tpa" BEGIN + COPY ".../stratagems-inline/blank" "%SFO_reserved_build_function_location%/SFO_autofunc.tpa" + END + <<<<<<<< .../stratagems-inline/func_to_add.tpa + %definition% + >>>>>>>> + APPEND_OUTER "%SFO_reserved_build_function_location%/SFO_autofunc.tpa" " %definition%" + END + END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// define a set of simple data-field-editing functions using flags +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +DEFINE_ACTION_FUNCTION build_flag_data_field_editors + STR_VAR lookup_table="" + function_prefix="" + offset_base="" + secondary="" + +BEGIN + ACTION_IF !VARIABLE_IS_SET SFO_reserved_build_function_control BEGIN + OUTER_SET SFO_reserved_build_function_control=0 + END + ACTION_IF !VARIABLE_IS_SET SFO_reserved_build_function_location BEGIN + OUTER_SPRINT SFO_reserved_build_function_location "%workspace%" + END + ACTION_IF !(SFO_reserved_build_function_control=2) BEGIN // if it's 2, do nothing + + + OUTER_SPRINT arg_string ~STR_VAR arguments="" RET value~ + OUTER_SPRINT simple_arg_string "%arg_string%" + OUTER_SPRINT parse_string_boolean ~LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END~ + + + + ACTION_PHP_EACH ~%lookup_table%~ AS function => arglist BEGIN + LAF decompose_CSV STR_VAR input= ~%arglist%~ RET offset=argument_0 bit=argument_1 END + ACTION_MATCH ~%offset_base%~ + WITH + ~~ no + BEGIN + OUTER_SPRINT ~offset~ ~%offset%~ + END + yes + BEGIN + OUTER_SPRINT ~offset~ ~(%offset% + offset_base)~ + END + DEFAULT + FAIL "unknown argument for offset_base in build_flag_data_field_editors (function prefix is %function_prefix%; lookup table is %lookup_table%)" + END + // input is in NI conventions counting 0-7, so bit N is 2^N + OUTER_SET one_code=2**bit + OUTER_SET zero_code=0xff - one_code + OUTER_SPRINT ~definition~ ~ + DEFINE_PATCH_FUNCTION %function_prefix%_%function% %arg_string% BEGIN + %parse_string_boolean% + PATCH_IF arguments=0 BEGIN + WRITE_BYTE %offset% (BYTE_AT %offset% BAND %zero_code%) + END ELSE BEGIN + WRITE_BYTE %offset% (BYTE_AT %offset% BOR %one_code%) + END + SET value=1 + + END + + DEFINE_PATCH_FUNCTION %function_prefix%_read_%function% %simple_arg_string% BEGIN + PATCH_IF (BYTE_AT %offset% BAND %one_code%) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + ~ + ACTION_IF ~%secondary%~ STRING_EQUAL_CASE ~yes~ BEGIN + OUTER_PATCH_SAVE ~definition~ ~%definition%~ BEGIN + REPLACE_TEXTUALLY ~offset_base~ ~offset_secondary~ + END + END + ACTION_IF SFO_reserved_build_function_control<2 BEGIN + LAUNCH_ACTION_FUNCTION action_reinclude_this STR_VAR input= ~%definition%~ END + END + ACTION_IF SFO_reserved_build_function_control=1 BEGIN + ACTION_IF !FILE_EXISTS "%SFO_reserved_build_function_location%/SFO_autofunc.tpa" BEGIN + COPY ".../stratagems-inline/blank" "%SFO_reserved_build_function_location%/SFO_autofunc.tpa" + END + <<<<<<<< .../stratagems-inline/func_to_add.tpa + %definition% + >>>>>>>> + APPEND_OUTER "%SFO_reserved_build_function_location%/SFO_autofunc.tpa" " %definition%" + END + END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// template for general clone +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION clone_template + INT_VAR + allow_missing=0 + silent=0 + tv=0 + STR_VAR + file_list="" + file_ext="" + edits="" + editstring="" +BEGIN + LAF edit_sanity_check STR_VAR edits editstring task="cloning %file_list%" END + ACTION_IF !"%file_list%" STRING_MATCHES_REGEXP " *$" BEGIN + FAIL "Clone_%file_ext% cannot have an empty argument" + END + PRINT ~SFO: Cloning %file_ext% file(s) %file_list% and applying patch(es)...~ + SILENT + OUTER_SET SFO_RESERVED_object_index = 0 + OUTER_WHILE !(~%file_list%~ STRING_EQUAL ~~) BEGIN + LAF return_first_pair + STR_VAR list= ~%file_list%~ + RET filename_old=key + filename_new=value + file_list=list + END + + ACTION_IF allow_missing BEGIN + ACTION_IF FILE_EXISTS_IN_GAME ~%filename_old%.%file_ext%~ BEGIN + OUTER_SET proceed=1 + END ELSE BEGIN + OUTER_SET proceed=0 + PRINT "File %filename_old%.%file_ext% does not exist, so clone aborted" + END + END ELSE BEGIN + OUTER_SET proceed=1 + END + ACTION_IF proceed=1 BEGIN + COPY_EXISTING ~%filename_old%.%file_ext%~ ~override/%filename_new%.%file_ext%~ + PATCH_IF "%file_ext%" STRING_EQUAL_CASE CRE BEGIN + LPF FJ_CRE_EFF_V2 END + END + PATCH_IF debug_variable=2 BEGIN + LPF warning STR_VAR warning= ~Patching %SOURCE_RES%~ END + PATCH_SILENT + END + LPF apply_patches + INT_VAR really_no_default=1 + STR_VAR edits + filename= ~%filename_old%~ + file_ext + END + LPF apply_patches_inline + INT_VAR really_no_default=1 + STR_VAR editstring + filename= ~%filename_old%~ + file_ext + END + // BUT_ONLY // no BUT_ONLY here - we want a clone regardless + END + OUTER_SET SFO_RESERVED_object_index +=1 + END + VERBOSE + PRINT ~...done~ +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// template for general edit +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + + + +DEFINE_ACTION_FUNCTION edit_template + INT_VAR + silent=0 + SFO_RESERVED_object_index=0 + allow_missing=0 + stop_after_match=0 + tv=0 + STR_VAR + file_list="" + file_ext="" + edits="" + editstring="" + external_file="" + location="" + locbase="" + locabs="" + RET value // 1 if any successful edit is made +BEGIN + OUTER_SET value=0 + ACTION_MATCH "%location%%locabs%%locbase%" WITH + "" BEGIN + OUTER_SPRINT file_loc null + END + DEFAULT + LAF get_directory STR_VAR location locbase locabs RET file_loc=directory END + END + LAF edit_sanity_check STR_VAR edits editstring task="editing %file_list%" END + ACTION_IF !"%file_list%%external_file%" STRING_MATCHES_REGEXP " *$" BEGIN + FAIL "Edit_%file_ext% cannot have an empty argument" + END + ACTION_IF !"%edits%%editstring%" STRING_COMPARE "" BEGIN + LAF warning STR_VAR warning="edit_template of type %file_ext% called for %file_list% with no arguments" END + END + ACTION_IF ~%external_file%~ STRING_COMPARE_CASE ~~ BEGIN + LAF read_in_list STR_VAR file=~%external_file%~ RET extra=list END + OUTER_SPRINT ~file_list~ ~%file_list% %extra%~ + END + ACTION_IF (~%edits%~ STRING_EQUAL_CASE ~~ && ~%editstring%~ STRING_EQUAL_CASE ~~) BEGIN + OUTER_SPRINT edits patch_data + END + ACTION_IF !silent BEGIN + PRINT ~SFO: Applying patch(es) to %file_ext% file(s) %file_list%... ~ + END + SILENT + OUTER_WHILE !(~%file_list%~ STRING_EQUAL ~~ || (stop_after_match && value)) BEGIN + LAF return_first_entry + STR_VAR list= ~%file_list%~ + RET file_list=list filename=entry + END + ACTION_IF tv BEGIN + OUTER_SPRINT ~filename~ ~%tutu_var%%filename%~ + END + ACTION_IF "%file_loc%" STRING_EQUAL_CASE "null" BEGIN + ACTION_IF FILE_EXISTS_IN_GAME ~%filename%.%file_ext%~ BEGIN + ACTION_TRY + COPY_EXISTING ~%filename%.%file_ext%~ ~override/%filename%.%file_ext%~ + PATCH_IF (SOURCE_SIZE>0x1) BEGIN + PATCH_IF "%file_ext%" STRING_EQUAL_CASE cre BEGIN + LPF CRE_read_effect_type RET value=value END + PATCH_IF value=0 BEGIN + LPF FJ_CRE_EFF_V2 END + END + END + LPF apply_patches STR_VAR edits filename file_ext RET value_here=value END + LPF apply_patches_inline STR_VAR editstring filename file_ext RET value_here2=value END + SET value=value || value_here || value_here2 + END + BUT_ONLY + WITH DEFAULT + WARN "Failed to patch %filename%.%file_ext%; error message was %ERROR_MESSAGE%" + LAF warning STR_VAR warning="Failed to patch %filename%.%file_ext%; error message was %ERROR_MESSAGE%" END + END + END ELSE BEGIN + ACTION_IF !allow_missing BEGIN + FAIL "You are trying to edit %filename%.%file_ext%, which does not exist in the game" + END + END + END ELSE BEGIN + ACTION_IF FILE_EXISTS "%file_loc%/%filename%.%file_ext%" BEGIN + ACTION_TRY + COPY "%file_loc%/%filename%.%file_ext%" "%file_loc%" + PATCH_IF (SOURCE_SIZE>0x1) BEGIN + PATCH_IF "%file_ext%" STRING_EQUAL_CASE CRE BEGIN + LPF FJ_CRE_EFF_V2 END + END + LPF apply_patches STR_VAR edits filename file_ext RET value_here=value END + LPF apply_patches_inline STR_VAR editstring filename file_ext RET value_here2=value END + SET value=value || value_here || value_here2 + END + + BUT_ONLY + WITH DEFAULT + WARN "Failed to patch %filename%.%file_ext%; error message was %ERROR_MESSAGE%" + LAF warning STR_VAR warning="Failed to patch %filename%.%file_ext%; error message was %ERROR_MESSAGE%" END + END + END ELSE BEGIN + ACTION_IF !allow_missing BEGIN + FAIL "You are trying to edit %file_loc%/%filename%.%file_ext%, which does not exist" + END + END + END + OUTER_SET SFO_RESERVED_object_index +=1 + END + VERBOSE + ACTION_IF !silent BEGIN + PRINT ~...done~ + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// template for general install +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +DEFINE_ACTION_FUNCTION install_template + INT_VAR allow_missing=0 + tv=0 + silent=0 + STR_VAR + file_list="" + file_ext="" + edits="" + editstring="" + external_file="" + location="" + locbase="" + locabs="" + destination="override" +BEGIN + LAF edit_sanity_check STR_VAR edits editstring task="installing %file_list%" END + ACTION_IF !"%file_list%" STRING_MATCHES_REGEXP " *$" BEGIN + FAIL "Install_%file_ext% cannot have an empty argument" + END + LAF get_directory STR_VAR location locbase locabs RET file_loc=directory END + ACTION_IF ~%external_file%~ STRING_COMPARE_CASE ~~ BEGIN + LAF read_in_list STR_VAR file=~%external_file%~ RET extra=list END + OUTER_SPRINT ~file_list~ ~%file_list% %extra%~ + END + ACTION_IF !silent BEGIN + PRINT ~SFO: Installing and patching %file_ext% file(s) %file_list%... ~ + END + SILENT + OUTER_INNER_PATCH_SAVE file_list "%file_list%" BEGIN + REPLACE_TEXTUALLY " +=> +" "=>" + END + OUTER_SET SFO_RESERVED_object_index = 0 + OUTER_WHILE !(~%file_list%~ STRING_EQUAL ~~) BEGIN + LAF return_first_entry STR_VAR list=~%file_list%~ RET file_list=list filedata=entry END + ACTION_IF !("%filedata%" STRING_CONTAINS_REGEXP "=>") BEGIN + LAF return_first_pair STR_VAR list="%filedata%" RET filename=key filename_out=value END + END ELSE BEGIN + OUTER_SPRINT filename "%filedata%" + OUTER_SPRINT filename_out "%filedata%" + END + ACTION_IF tv BEGIN + OUTER_SPRINT ~filename_out~ ~%tutu_var%%filename_out%~ + END ELSE BEGIN + OUTER_SPRINT filename_out "%filename_out%" + END + ACTION_IF FILE_EXISTS ~%file_loc%/%filename%.%file_ext%~ BEGIN + COPY ~%file_loc%/%filename%.%file_ext%~ ~%destination%/%filename_out%.%file_ext%~ + PATCH_IF (SOURCE_SIZE>0x1) BEGIN + PATCH_IF "%file_ext%" STRING_EQUAL_CASE CRE BEGIN + LPF FJ_CRE_EFF_V2 END + END + LPF apply_patches STR_VAR edits filename file_ext END + LPF apply_patches_inline STR_VAR editstring filename file_ext END + END + // BUT_ONLY // should be installed regardless! + END ELSE BEGIN + ACTION_IF !allow_missing BEGIN + FAIL "You are trying to install %file_loc%/%filename%.%file_ext%, which does not exist" + END + END + OUTER_SET SFO_RESERVED_object_index +=1 + END + VERBOSE + PRINT ~...done~ + +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// template for general regexp +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION regexp_template + INT_VAR tv=0 + STR_VAR + file_ext="" + edits="" + editstring="" + glob="yes" + +BEGIN + LAF edit_sanity_check STR_VAR edits editstring task="patching all %file_ext% files" END + ACTION_IF tv BEGIN + OUTER_SPRINT ~initial~ ~%tutu_var%~ + ACTION_IF VARIABLE_IS_SET ~file_count_%file_ext%_tv~ BEGIN + OUTER_SET count= ~file_count_%file_ext%_tv~ + END ELSE BEGIN + OUTER_SET count=0 + END + END ELSE BEGIN + OUTER_SPRINT ~initial~ ~~ + ACTION_IF VARIABLE_IS_SET ~file_count_%file_ext%~ BEGIN + OUTER_SET count= ~file_count_%file_ext%~ + END ELSE BEGIN + OUTER_SET count=0 + END + END + PRINT ~SFO: Applying patch(es) to all %file_ext% files...~ + SILENT + ACTION_IF ~%glob%~ STRING_EQUAL_CASE ~yes~ BEGIN + OUTER_SET counter=0 + OUTER_SET report=0 + COPY_EXISTING_REGEXP GLOB ~%initial%.*\.%file_ext%~ ~override~ + PATCH_IF (SOURCE_SIZE>0x1) THEN BEGIN + PATCH_IF "%file_ext%" STRING_EQUAL_CASE CRE BEGIN + LPF FJ_CRE_EFF_V2 END + END + SPRINT filename ~%SOURCE_RES%~ + PATCH_IF debug_variable=2 BEGIN + LPF warning STR_VAR warning= ~Trying to patch %filename%...~ END + PATCH_SILENT + END + LPF apply_patches STR_VAR edits filename file_ext END + LPF apply_patches_inline STR_VAR editstring filename file_ext END + END + SET counter=counter+1 + PATCH_IF counter=100 BEGIN + SET counter=0 + SET report=report+100 + PATCH_IF count>0 BEGIN + PATCH_PRINT ~Patched %report% / %count% files~ + END ELSE BEGIN + PATCH_PRINT ~Patched %report% files~ + END + PATCH_SILENT + END + BUT_ONLY + + END ELSE BEGIN + +COPY_EXISTING_REGEXP ~%initial%.*\.%file_ext%~ ~override~ + PATCH_IF (SOURCE_SIZE>0x1) THEN BEGIN + SPRINT filename ~%SOURCE_RES%~ + PATCH_IF debug_variable=2 BEGIN + LPF warning STR_VAR warning= ~Trying to patch %filename%...~ END + PATCH_SILENT + END + LPF apply_patches STR_VAR edits filename file_ext END + LPF apply_patches_inline STR_VAR editstring filename file_ext END + END + BUT_ONLY + + + END + VERBOSE + PRINT ~...done~ +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// template for general new thing +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION make_template + STR_VAR + file_list="" + file_ext="" + edits="" + editstring="" + build_before="" + build_after="" +BEGIN + LAF edit_sanity_check STR_VAR edits editstring task="making %file_list%" END + PRINT ~SFO: Creating %file_ext% file(s) %file_list%...~ + SILENT + OUTER_SET SFO_RESERVED_object_index = 0 + OUTER_WHILE !(~%file_list%~ STRING_EQUAL ~~) BEGIN + LAF return_first_entry + STR_VAR list= ~%file_list%~ + RET file_list=list filename=entry + END + <<<<<<<< blank + >>>>>>>> + COPY ~blank~ ~override/%filename%.%file_ext%~ + DELETE_BYTES 0x0 BUFFER_LENGTH + LPF ~%build_before%~ END + LPF apply_patches + INT_VAR really_no_default=1 + STR_VAR edits filename file_ext + END + LPF apply_patches_inline + INT_VAR really_no_default=1 + STR_VAR editstring filename file_ext + END + PATCH_IF ~%build_after%~ STRING_COMPARE_CASE ~~ BEGIN + LPF ~%build_after%~ END + END + BUT_ONLY // + OUTER_SET SFO_RESERVED_object_index +=1 + END + VERBOSE + PRINT ~...done~ +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// define the PATCH_MAKE_PATCH and MAKE_PATCH pseudocommands +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION define_make_patch BEGIN + REPLACE_TEXTUALLY PATCH_MAKE_PATCH ~PATCH_CLEAR_ARRAY patch_data PATCH_DEFINE_ASSOCIATIVE_ARRAY patch_data BEGIN~ + REPLACE_TEXTUALLY MAKE_PATCH ~ACTION_CLEAR_ARRAY patch_data ACTION_DEFINE_ASSOCIATIVE_ARRAY patch_data BEGIN~ +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// define the PUSH pseudocommand +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION define_push BEGIN + REPLACE_TEXTUALLY "PUSH ~\([^ ~]+\)~ " ~SPRINT "\1" "%\1% "^~ + REPLACE_TEXTUALLY "PUSH \([^ ~]+\)" ~SPRINT "\1" "%\1% "^~ + REPLACE_TEXTUALLY "PUSH_RANDOM \([^ ]+\) (\([^)]+\))" ~LPF internal_push_random STR_VAR list="%\1%" to_add="\2" RET \1=list END~ +END + +DEFINE_PATCH_FUNCTION internal_push_random STR_VAR list="" to_add="" RET list BEGIN + SET counter=0 + WHILE "%to_add%" STRING_COMPARE "" BEGIN + SET counter +=1 + LPF return_first_entry STR_VAR list="%to_add%" RET entry to_add=list END + SPRINT $temparray("%counter%") "%entry%" + END + SET choice=RANDOM(1 counter) + SPRINT temp $temparray("%choice%") + PATCH_MATCH "%temp%" WITH + null "*" BEGIN END + DEFAULT + INNER_PATCH_SAVE temp "%temp%" BEGIN + REPLACE_TEXTUALLY "+" " " + END + SPRINT list "%list% %temp%" + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// break a comma-separated value string into its components +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +DEFINE_ACTION_FUNCTION decompose_CSV + STR_VAR + input="" + RET + argument_0 + argument_1 + argument_2 + argument_3 + argument_4 + argument_5 + argument_6 + argument_7 + argument_8 + argument_9 +BEGIN + OUTER_SPRINT ~input~ ~%input%~ + OUTER_INNER_PATCH_SAVE ~output_csv~ ~ACTION_DEFINE_ARRAY temp_array BEGIN %input% END~ BEGIN + REPLACE_TEXTUALLY ~,~ ~ ~ + END + <<<<<<<< temp_file + %output_csv% + >>>>>>>> + COPY + temp_file ~%workspace%/temp_file2~ EVALUATE_BUFFER + REINCLUDE ~%workspace%/temp_file2~ + OUTER_FOR (i=0;i<10;i=i+1) BEGIN + ACTION_IF (VARIABLE_IS_SET $temp_array( ~%i%~)) AND $temp_array( ~%i%~) STRING_COMPARE_CASE ~~ AND $temp_array( ~%i%~) STRING_COMPARE_CASE ~ ~ BEGIN + OUTER_SPRINT ~argument_%i%~ $temp_array(~%i%~) + OUTER_SPRINT ~temp~ $argument(~%i%~) + END ELSE BEGIN + OUTER_SPRINT ~argument_%i%~ ~null~ + END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// as a patch, take ~key=>value~ and return key and value +///////////// (Obsolete: use return_first_pair) +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION process_arrow + STR_VAR input="" + RET key + value +BEGIN + PATCH_IF ~%input%~ STRING_COMPARE "" BEGIN + SPRINT ~output~ ~ACTION_DEFINE_ASSOCIATIVE_ARRAY temp_assoc BEGIN %input% END~ + INNER_ACTION BEGIN + <<<<<<<< temp_file + %output% + >>>>>>>> + COPY + temp_file ~%workspace%/temp_file2~ EVALUATE_BUFFER + REINCLUDE ~%workspace%/temp_file2~ + END + PHP_EACH temp_assoc AS key => value BEGIN + END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// as a patch, take ~key value~ and return key and value +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION process_pair + STR_VAR input="" + RET key + value +BEGIN + PATCH_IF ~%input%~ STRING_COMPARE "" BEGIN + SPRINT ~output~ ~ACTION_DEFINE_ARRAY temp_array BEGIN %input% END~ + INNER_ACTION BEGIN + <<<<<<<< temp_file + %output% + >>>>>>>> + COPY + temp_file ~%workspace%/temp_file2~ EVALUATE_BUFFER + REINCLUDE ~%workspace%/temp_file2~ + END + SPRINT ~key~ $temp_array(0) + SPRINT ~value~ $temp_array(1) + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// as a patch, take a list of key=>value s separated by spaces, break it down, and for each entry INCLUDE a string (should usually be a function call) with and set to their values +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION process_list_of_arrows + STR_VAR filename="" + input="" + instruction="" +BEGIN + PATCH_IF ~%input%~ STRING_COMPARE "" BEGIN + SPRINT ~output~ ~ACTION_DEFINE_ASSOCIATIVE_ARRAY temp_assoc BEGIN %input% END~ + INNER_ACTION BEGIN + <<<<<<<< temp_file + %output% + >>>>>>>> + COPY + temp_file ~%workspace%/temp_file2~ EVALUATE_BUFFER + REINCLUDE ~%workspace%/temp_file2~ + END + PHP_EACH temp_assoc AS key => value BEGIN + INNER_PATCH_SAVE instruction2 ~%instruction%~ BEGIN + REPLACE_TEXTUALLY ~~ ~%key%~ + REPLACE_TEXTUALLY ~~ ~%value%~ + END + LAUNCH_PATCH_FUNCTION patch_reinclude_this STR_VAR input=~%instruction2%~ END + + END + END + +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// as a patch, process a list of space-separated integers and run a function on each +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION process_integer_list + STR_VAR list="" + function="" +BEGIN + INNER_PATCH_SAVE ~list~ ~%list%~ BEGIN + REPLACE_TEXTUALLY ~\(-[0-9]+\)~ ~"\1"~ + END + SPRINT ~list~ ~PATCH_FOR_EACH entry IN %list% BEGIN LPF %function% STR_VAR arguments= "%entry%" END END~ + LPF patch_reinclude_this STR_VAR input=~%list%~ END + + + +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// as a patch, process a list of space-separated strings and run a function on each, inputing it into the field "field" +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION process_string_list + STR_VAR list="" + function="" + field="arguments" +BEGIN + SPRINT ~list~ ~PATCH_FOR_EACH entry IN %list% BEGIN LPF %function% STR_VAR %field%= "%percentage%entry%percentage%" END END~ + INNER_ACTION BEGIN + <<<<<<<< temp_file + %list% + >>>>>>>> + COPY + temp_file ~%workspace%/temp_file2~ EVALUATE_BUFFER + END + PATCH_REINCLUDE ~%workspace%/temp_file2~ + + +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// find the next alphanumeric sequence after the current one (e.g., 6a=>6b, zz=>000) +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +DEFINE_ACTION_FUNCTION alphanumeric_advance STR_VAR arguments="" RET value BEGIN + OUTER_PATCH_SAVE value "%arguments%" BEGIN + SET index=BUFFER_LENGTH - 1 + SET done=0 + WHILE !done BEGIN + PATCH_IF index<0 BEGIN + INSERT_BYTES 0x0 1 + WRITE_ASCII 0x0 "0" + SET done=1 + END ELSE BEGIN + READ_ASCII index here (1) + SPRINT here_new $alphanumeric_next("%here%") + WRITE_ASCIIE index "%here_new%" + PATCH_IF "%here_new%" STRING_EQUAL "0" BEGIN + SET index -= 1 + END ELSE BEGIN + SET done=1 + END + END + END + END +END + + + diff --git a/iwdification/sfo/general/lib_iterate.tpa b/iwdification/sfo/general/lib_iterate.tpa new file mode 100644 index 0000000..cff154b --- /dev/null +++ b/iwdification/sfo/general/lib_iterate.tpa @@ -0,0 +1,901 @@ +///// this set of routines processes a list of resources to collect all resources +///// needed to enable them. +///// +///// +///// The string to_check contains all the resources left to check separated by spaces and the +///// routines should be called initially with the starting resources in this list. +///// +///// The variable $iter_has_checked("%resource%") is set if we've already checked it. +///// +///// For opcodes, we don't iterate through resources in 206 (etc) as they're not really required +///// by the spell and may not exist. But we do allow a function "immunity_func" to be called on +///// the resource name (e.g., to log it). + +DEFINE_PATCH_FUNCTION check_adder + STR_VAR to_check="" + value="" + suffix="" + RET to_check +BEGIN + PATCH_IF "%suffix%" STRING_EQUAL "" BEGIN PATCH_FAIL "No suffix in check_adder (argument is %value%)" END + PATCH_IF ("%value%" STRING_COMPARE "" & "%value%" STRING_COMPARE_CASE "none") BEGIN + SPRINT to_check "%to_check% %value%.%suffix%" + END +END + +DEFINE_PATCH_FUNCTION iter_opcode + INT_VAR opcode=0 + param2=0 + STR_VAR to_check="" + resref="" + source="" + source_ext="" + immunity_func="" + entry="" // dummy + RET to_check +BEGIN + PATCH_IF GAME_IS ~bg2 tob tutu tutu_totsc bgee bg2ee iwdee eet~ BEGIN + PATCH_MATCH "%opcode%" WITH + 336 BEGIN + INNER_ACTION BEGIN + COPY_EXISTING_REGEXP "%resref%.*\.vvc" "%workspace%" + SPRINT to_check "%to_check% %SOURCE_RES%.vvc" + BUT_ONLY + END + END + 15 44 BEGIN + PATCH_IF param2=3 BEGIN + SPRINT to_check "%to_check% clssplab.2da" // Cat's Grace/Strength externalisation + END + END + 335 BEGIN + SPRINT to_check "%to_check% 7eyes.2da" // seven eyes INNER_ACTION BEGIN + INNER_ACTION BEGIN + ACTION_IF "%immunity_func%" STRING_COMPARE_CASE "" BEGIN + LAF "%immunity_func%" STR_VAR resref resref_ext="SPL" source source_ext END + END + END + END + 67 135 151 BEGIN SPRINT to_check "%to_check% %resref%.cre" + END + 82 BEGIN SPRINT to_check "%to_check% %to_check% %resref%.bcs" END + 111 122 143 255 BEGIN SPRINT to_check "%to_check% %resref%.itm" END + 146 147 148 171 232 251 326 335 340 341 361 366 BEGIN SPRINT to_check "%to_check% %resref%.spl" END + 172 206 BEGIN + + END + 318 321 324 BEGIN + INNER_ACTION BEGIN + ACTION_IF "%immunity_func%" STRING_COMPARE_CASE "" BEGIN + ACTION_IF FILE_EXISTS_IN_GAME "%resref%.itm" BEGIN + LAF "%immunity_func%" STR_VAR resref resref_ext="ITM" source source_ext END + END ELSE BEGIN + LAF "%immunity_func%" STR_VAR resref resref_ext="SPL" source source_ext END + END + END + END + END + 177 272 248 249 283 BEGIN SPRINT to_check "%to_check% %resref%.eff" END + 174 BEGIN SPRINT to_check "%to_check% %resref%.wav" END + 215 BEGIN SPRINT to_check "%to_check% %resref%.vvc" END + 311 BEGIN LPF iter_wish STR_VAR to_check RET to_check=to_check END END + 331 BEGIN + INNER_ACTION BEGIN + COPY_EXISTING smtables.2da override + READ_2DA_ENTRY (param2 + 1) 1 2 monsum_table + BUT_ONLY + END + SPRINT to_check "%to_check% %monsum_table%.2da" + LPF log_this STR_VAR file=smtable_entries.2da input="%param2% %monsum_table%" repeat=no END + END + 214 BEGIN // select spell + SPRINT to_check "%to_check% %resref%.sda" + END + 333 BEGIN + PATCH_IF "%resref%" STRING_EQUAL "" BEGIN + SPRINT to_check "%to_check% %source%b.spl" + END ELSE BEGIN + SPRINT to_check "%to_check% %resref%.spl" + END + END + 192 BEGIN LPF iter_fam STR_VAR to_check RET to_check=to_check END END + 127 BEGIN + PATCH_IF "%resref%" STRING_COMPARE "" BEGIN + SPRINT to_check "%to_check% %resref%.2da" + END ELSE BEGIN + LPF iter_opcode_monsum INT_VAR param2 STR_VAR to_check 2dalist="MONSUM01 MONSUM02 MONSUM03 ANISUM01 ANISUM02 MONSUM01 MONSUM02 MONSUM03 ANISUM01 ANISUM02" RET to_check=to_check END + END + END + 78 BEGIN // disease, specifically on 'mold touch' mode + PATCH_IF param2=11 || param2=12 BEGIN + PATCH_IF "%resref%" STRING_COMPARE "" BEGIN + SPRINT to_check "%to_check% %resref%.spl" + END ELSE BEGIN + SPRINT to_check "%to_check% %SOURCE_RES%B.spl" + END + END + END + DEFAULT END + END ELSE + PATCH_IF GAME_IS ~iwd how totlm~ BEGIN + PATCH_MATCH "%opcode%" WITH + + 67 135 151 259 410 411 BEGIN SPRINT to_check "%to_check% %resref%.cre" END + 82 BEGIN SPRINT to_check "%to_check% %to_check% %resref%.bcs" END + 111 122 143 BEGIN SPRINT to_check "%to_check% %resref%.itm" END + 146 147 148 171 BEGIN SPRINT to_check "%to_check% %resref%.spl" END + 174 BEGIN SPRINT to_check "%to_check% %resref%.wav" END + 127 BEGIN + PATCH_IF "%resref%" STRING_COMPARE "" BEGIN + SPRINT to_check "%to_check% %resref%.2da" + END ELSE BEGIN + LPF iter_opcode_monsum INT_VAR param2 STR_VAR to_check 2dalist="MONSUM01 MONSUM02 MONSUM03 ANISUM01 ANISUM02 MONSUM01 MONSUM02 MONSUM03 ANISUM01 ANISUM02" RET to_check=to_check END + END + END + 240 BEGIN + LPF iter_opcode_monsum INT_VAR param2 STR_VAR to_check 2dalist="MSUMMO1 MSUMMO2 MSUMMO3 MSUMMO4 MSUMMO5 MSUMMO6 MSUMMO7 ASUMMO1 ASUMMO2 ASUMMO3 GINSECT CDOOM MSUMMOM" RET to_check=to_check END + END + 243 BEGIN + LPF iter_opcode_monsum INT_VAR param2 STR_VAR to_check 2dalist="ADEAD ADEADL" RET to_check=to_check END + END + 246 BEGIN + LPF iter_opcode_monsum INT_VAR param2 STR_VAR to_check 2dalist="SLIZARD STROLLS SSHADOW ISTALKE CFELEMW CEELEMW CWELEMW CFELEMP CEELEMP CWELEMP CEELEMM" RET to_check=to_check END + END + 248 BEGIN + LPF iter_opcode_monsum INT_VAR param2 STR_VAR to_check 2dalist="SMONSTE DSMONST SHADES" RET to_check=to_check END + END + 262 BEGIN + SPRINT to_check "%to_check% pomimg.cre" + END + 293 BEGIN + SPRINT to_check "%to_check% spin164.spl" + END + 294 BEGIN + SPRINT to_check "%to_check% spin166.spl" + END + 295 BEGIN + SPRINT to_check "%to_check% spin179.spl" + END + DEFAULT END + END ELSE BEGIN + PATCH_FAIL "Resource_iterate does not support your game" + END +END + +DEFINE_PATCH_FUNCTION iter_opcode_monsum + INT_VAR param2=0 + STR_VAR to_check="" 2dalist="" +RET to_check +BEGIN + SET count=0 + WHILE "%2dalist%" STRING_COMPARE "" BEGIN + LPF return_first_entry STR_VAR list="%2dalist%" RET entry=entry 2dalist=list END + SPRINT $mon_2da("%count%") "%entry%" + SET count +=1 + END + SPRINT this_2da $mon_2da("%param2%") + SPRINT to_check "%to_check% %this_2da%.2da" +END + + +DEFINE_PATCH_FUNCTION iter_2da // checks 2da files used by monster summoning + STR_VAR to_check="" + entry="" + immunity_func="" // dummmy + RET to_check +BEGIN + PATCH_MATCH "%entry%" WITH + "clssplab.2da" "7eyes.2da" BEGIN END + DEFAULT + COUNT_2DA_COLS colcount + PATCH_IF colcount=4 BEGIN + COUNT_2DA_ROWS 4 rowcount + FOR (i=0;ioffset_base BEGIN + LPF ARE_read_crefile RET value=value END + LPF check_adder STR_VAR to_check value suffix=cre RET to_check=to_check END + LPF ARE_read_dialog RET value=value END + LPF check_adder STR_VAR to_check value suffix=dlg RET to_check=to_check END + PATCH_FOR_EACH script IN override default race class general specifics BEGIN + LPF "ARE_read_script_%script%" RET value=value END + LPF check_adder STR_VAR to_check value suffix=bcs RET to_check=to_check END + END + END + SPRINT entry_type trigger + LPM get_offset_array + PHP_EACH offset_array AS int=>offset_base BEGIN + LPF ARE_read_trigger_script RET value=value END + LPF check_adder STR_VAR to_check value suffix=bcs RET to_check=to_check END + LPF ARE_read_destination RET value=value END + LPF check_adder STR_VAR to_check value suffix=are RET to_check=to_check END + END + SPRINT entry_type spawn + LPM get_offset_array + PHP_EACH offset_array AS int=>offset_base BEGIN + FOR (i=1;i<=10;i+=1) BEGIN + LPF "ARE_read_spawn_creature%i%" RET value=value END + LPF check_adder STR_VAR to_check value suffix=cre RET to_check=to_check END + END + END + READ_LONG AREoffset_loc_restspawn offset_base + PATCH_IF offset_base>0 BEGIN + FOR (i=1;i<=10;i+=1) BEGIN + LPF "ARE_read_restspawn_creature%i%" RET value=value END + LPF check_adder STR_VAR to_check value suffix=cre RET to_check=to_check END + END + END + SPRINT entry_type container + LPM get_offset_array + PHP_EACH offset_array AS int=>offset_base BEGIN + LPF ARE_read_container_script RET value=value END + LPF check_adder STR_VAR to_check value suffix=bcs RET to_check=to_check END + END + SPRINT entry_type door + LPM get_offset_array + PHP_EACH offset_array AS int=>offset_base BEGIN + LPF ARE_read_door_script RET value=value END + LPF check_adder STR_VAR to_check value suffix=bcs RET to_check=to_check END + LPF ARE_read_door_dialog RET value=value END + LPF check_adder STR_VAR to_check value suffix=dlg RET to_check=to_check END + END + SPRINT entry_type item + LPM get_offset_array + PHP_EACH offset_array AS int=>offset_secondary BEGIN + LPF ARE_read_item_resource RET value=value END + LPF check_adder STR_VAR to_check value suffix=itm RET to_check=to_check END + END + SPRINT entry_type animation + LPM get_offset_array + PHP_EACH offset_array AS int=>offset_base BEGIN + LPF ARE_read_animation_resource RET value=value END + LPF check_adder STR_VAR to_check value suffix=bam RET to_check=to_check END + END + SPRINT entry_type ambient + LPM get_offset_array + PHP_EACH offset_array AS int=>offset_base BEGIN + FOR (i=1;i<=10;i+=1) BEGIN + LPF "ARE_read_ambient_sound%i%" RET value=value END + LPF check_adder STR_VAR to_check value suffix=wav RET to_check=to_check END + END + END +END + + +DEFINE_PATCH_FUNCTION iter_spl // just check all the opcodes and the BAMs, and the projectile + STR_VAR to_check="" + immunity_func="" + entry="" // dummy + RET to_check +BEGIN + SPRINT source "%SOURCE_RES%" + READ_ASCII 0x3a value + LPF check_adder STR_VAR to_check value suffix=bam RET to_check END + GET_OFFSET_ARRAY ab_array 0x64 4 0x68 2 0 0 0x28 + PHP_EACH ab_array AS int=>ab_off BEGIN + READ_ASCII (ab_off+0x4) value + LPF check_adder STR_VAR to_check value suffix=bam RET to_check END + READ_SHORT (ab_off + 0x26) proj + PATCH_IF proj>1 BEGIN + SET proj -=1 + LOOKUP_IDS_SYMBOL_OF_INT value projectl proj + PATCH_IF !IS_AN_INT value BEGIN + LPF check_adder STR_VAR to_check value suffix=pro RET to_check END + END + END + GET_OFFSET_ARRAY2 eff_array ab_off ITM_V10_HEAD_EFFECTS + PHP_EACH eff_array AS int2=>offset BEGIN + READ_SHORT offset opcode + READ_ASCII (offset+0x14) resref + READ_LONG (offset+0x8) param2 + LPF iter_opcode INT_VAR opcode param2 STR_VAR immunity_func source source_ext=SPL resref to_check RET to_check=to_check END + END + END + GET_OFFSET_ARRAY gen_eff_array SPL_V10_GEN_EFFECTS + PHP_EACH gen_eff_array AS int=>offset BEGIN + READ_SHORT offset opcode + READ_ASCII (offset+0x14) resref + READ_LONG (offset+0x8) param2 + LPF iter_opcode INT_VAR opcode param2 STR_VAR immunity_func source source_ext=SPL resref to_check RET to_check=to_check END + END +END + +DEFINE_PATCH_FUNCTION iter_pro // check the BAM, WAV and VVC files, and any secondary projectile + STR_VAR to_check="" + entry="" // dummy + immunity_func="" // dummmy + RET to_check +BEGIN + PATCH_FOR_EACH wav_off IN 0x10 0x18 BEGIN + READ_ASCII wav_off value + LPF check_adder STR_VAR to_check value suffix=wav RET to_check END + END + PATCH_IF BUFFER_LENGTH >0x100 BEGIN // projectile data + PATCH_FOR_EACH bam_off IN 0x104 0x10c 0x136 0x13e 0x146 BEGIN + READ_ASCII bam_off value + LPF check_adder STR_VAR to_check value suffix=bam RET to_check END + END + END + PATCH_IF BUFFER_LENGTH >0x200 BEGIN // area effect data + PATCH_FOR_EACH wav_off IN 0x208 0x238 BEGIN + READ_ASCII wav_off value + LPF check_adder STR_VAR to_check value suffix=wav RET to_check END + END + PATCH_FOR_EACH anim_off IN 0x21c 0x228 0x230 0x238 BEGIN + READ_ASCII anim_off value + INNER_ACTION BEGIN + ACTION_IF FILE_EXISTS_IN_GAME "%value%.vvc" BEGIN + OUTER_SPRINT suffix vvc + END ELSE BEGIN + OUTER_SPRINT suffix bam + END + END + LPF check_adder STR_VAR to_check value suffix RET to_check END + END + PATCH_FOR_EACH proj_off IN 0x214 0x21a BEGIN + READ_SHORT proj_off proj + SET proj -=1 + PATCH_MATCH "%proj%" WITH + 0 1 79 BEGIN END + DEFAULT + LOOKUP_IDS_SYMBOL_OF_INT value projectl proj + PATCH_IF !IS_AN_INT value BEGIN + LPF check_adder STR_VAR to_check value suffix=pro RET to_check END + END + END + END + END + + + +END + +DEFINE_PATCH_FUNCTION iter_itm // just check all the opcodes, the BAMs, and whether it's a bag + STR_VAR to_check="" + entry="" // dummy + immunity_func="" + RET to_check +BEGIN + SPRINT source "%SOURCE_RES%" + PATCH_FOR_EACH bam_off IN 0x3a 0x44 0x58 BEGIN + READ_ASCII bam_off value + LPF check_adder STR_VAR to_check value suffix=bam RET to_check END + END + + READ_SHORT 0x1c cat + PATCH_IF (cat=36 || cat=58) BEGIN // risk the odd false positive + SPRINT to_check "%to_check% %SOURCE_RES%.sto" + END + GET_OFFSET_ARRAY geneff_array ITM_V10_GEN_EFFECTS + PHP_EACH geneff_array AS int=>offset BEGIN + READ_SHORT offset opcode + READ_ASCII (offset+0x14) resref + LPF iter_opcode INT_VAR opcode STR_VAR immunity_func source source_ext=ITM resref to_check RET to_check=to_check END + END + GET_OFFSET_ARRAY ab_array 0x64 4 0x68 2 0 0 0x38 + PHP_EACH ab_array AS int=>ab_off BEGIN + READ_ASCII (ab_off+0x4) value + READ_SHORT (ab_off + 0x36) proj + PATCH_IF proj>1 BEGIN + SET proj -=1 + LOOKUP_IDS_SYMBOL_OF_INT value projectl proj + PATCH_IF !IS_AN_INT value BEGIN + LPF check_adder STR_VAR to_check value suffix=pro RET to_check END + END + END + LPF check_adder STR_VAR to_check value suffix=bam RET to_check END + GET_OFFSET_ARRAY2 eff_array ab_off ITM_V10_HEAD_EFFECTS + PHP_EACH eff_array AS int2=>offset BEGIN + READ_SHORT offset opcode + READ_LONG (offset+0x8) param2 + READ_ASCII (offset+0x14) resref + LPF iter_opcode INT_VAR opcode param2 STR_VAR immunity_func source source_ext=ITM resref to_check RET to_check=to_check END + END + END +END + +DEFINE_PATCH_FUNCTION iter_item_random + STR_VAR item="" + entry="" // dummy + immunity_func="" // dummmy + to_check="" + RET to_check +BEGIN + SET random=0 + TO_LOWER item + PATCH_IF GAME_IS "iwd totlm how" BEGIN + PATCH_IF VARIABLE_IS_SET $random_item( "%item%") BEGIN + SPRINT list $random_item("%item%") + SET random=1 + END + END ELSE BEGIN + PATCH_IF !"%item%" STRING_CONTAINS_REGEXP "rnd\(tre\|scr\|mag\)" BEGIN + INNER_PATCH "%item%" BEGIN + READ_ASCII 0x0 filestart (6) + READ_ASCII 0x6 code (2) + END + PATCH_MATCH "%filestart%" WITH + rndmag BEGIN + SPRINT 2da rndmagic + END + rndscr BEGIN + SPRINT 2da rndscrol + END + rndtre BEGIN + SPRINT 2da rndtreas + END + DEFAULT END + INNER_ACTION BEGIN + COPY_EXISTING "%2da%.2da" "%workspace%" + LPF read_rest_of_line INT_VAR row=code - 1 col=2 colmin=3 RET list=list END + BUT_ONLY + END + SET random=1 + END + END + PATCH_IF random BEGIN + WHILE "%list%" STRING_COMPARE "" BEGIN + LPF return_first_entry STR_VAR list RET entry=entry list=list END + INNER_PATCH_SAVE entry "%entry%" BEGIN + REPLACE_TEXTUALLY "\*[0-9]+" "" + END + SPRINT to_check "%to_check% %entry%.itm" + END + END +END + +DEFINE_PATCH_FUNCTION iter_eff + STR_VAR to_check="" + entry="" // dummy + immunity_func="" + RET to_check +BEGIN + READ_LONG 0x10 opcode + READ_LONG 0x20 param2 + READ_ASCII 0x30 resref + LPF iter_opcode INT_VAR opcode param2 STR_VAR immunity_func resref to_check RET to_check=to_check END +END + +DEFINE_PATCH_FUNCTION iter_cre + STR_VAR to_check="" + immunity_func="" // dummmy + entry="" // dummy + RET to_check +BEGIN + // scripts + FOR (i=0;i<5;i+=1) BEGIN + READ_ASCII (0x248 + 0x8 * i) script + PATCH_IF ("%script%" STRING_COMPARE "" && "%script%" STRING_COMPARE_CASE "none") BEGIN + SPRINT to_check "%to_check% %script%.bcs" + END + END + // dialog + PATCH_IF GAME_IS "iwd how totlm" BEGIN + READ_ASCII 0x334 dialog + END ELSE BEGIN + READ_ASCII 0x2cc dialog + END + PATCH_IF ("%dialog%" STRING_COMPARE "" && "%dialog%" STRING_COMPARE_CASE "none") BEGIN + SPRINT to_check "%to_check% %dialog%.dlg" + END + // spells known + PATCH_IF GAME_IS "iwd how totlm" BEGIN + GET_OFFSET_ARRAY splk_arr 0x308 4 0x30c 4 0 0 0xc + END ELSE BEGIN + GET_OFFSET_ARRAY splk_arr 0x2a0 4 0x2a4 4 0 0 0xc + END + PHP_EACH splk_arr AS int=>off BEGIN + READ_ASCII off spell + SPRINT to_check "%to_check% %spell%.spl" + END + // spells memorized + PATCH_IF GAME_IS "iwd how totlm" BEGIN + GET_OFFSET_ARRAY splm_arr 0x318 4 0x31c 4 0 0 0xc + END ELSE BEGIN + GET_OFFSET_ARRAY splm_arr 0x2b0 4 0x2b4 4 0 0 0xc + END + PHP_EACH splm_arr AS int=>off BEGIN + READ_ASCII off spell + SPRINT to_check "%to_check% %spell%.spl" + END + // items + PATCH_IF GAME_IS "iwd how totlm" BEGIN + GET_OFFSET_ARRAY itm_arr 0x324 4 0x328 4 0 0 0x14 + END ELSE BEGIN + GET_OFFSET_ARRAY itm_arr 0x2bc 4 0x2c0 4 0 0 0x14 + END + PHP_EACH itm_arr AS int=>off BEGIN + READ_ASCII off item + SPRINT to_check "%to_check% %item%.itm" + END +END + +DEFINE_PATCH_FUNCTION iter_script + STR_VAR to_check="" + entry="" // dummy + RET to_check +BEGIN + REPLACE_EVALUATE CASE_INSENSITIVE ~\(CreateItem\|GiveItemCreate\)("\([^"]+\)"~ BEGIN + SPRINT to_check "%to_check% %MATCH2%.itm" + END + ~%MATCH1%("%MATCH2%"~ + REPLACE_EVALUATE CASE_INSENSITIVE ~\(CreateCreature\|CreateCreatureObject\|CreateCreatureObjectDoor\|CreateCreatureObjectOffScreen\|CreateCreatureObjectCopy\|CreateCreatureObjectOffset\|CreateCreatureCopyPoint\|CreateCreatureObjectEffect\|CreateCreatureObjectCopyEffect\)("\([^"]+\)"~ BEGIN + SPRINT to_check "%to_check% %MATCH2%.cre" + END + ~%MATCH1%("%MATCH2%"~ + REPLACE_EVALUATE CASE_INSENSITIVE ~CreateCreatureAtLocation(\([^,]+\),\([^,]+\),"\([^"]+\)")~ BEGIN + SPRINT to_check "%to_check% %MATCH3%.cre" + END + ~CreateCreatureAtLocation(%MATCH1%,%MATCH2%,"%MATCH3%")~ + REPLACE_EVALUATE CASE_INSENSITIVE ~AddSpecialAbility("\([^"]+\)")~ BEGIN + SPRINT to_check "%to_check% %MATCH1%.spl" + END + ~AddSpecialAbility("%MATCH1%")~ + REPLACE_EVALUATE CASE_INSENSITIVE ~\([a-z0-9]+RES\)("\([^"]+\)"~ BEGIN + SPRINT to_check "%to_check% %MATCH2%.spl" + END + ~%MATCH1%("%MATCH2%"~ + REPLACE_EVALUATE CASE_INSENSITIVE ~\(ChangeCurrentScript\|SetAIScript\|StartCutScene\)("\([^"]+\)"~ BEGIN + LPF check_adder STR_VAR to_check value="%MATCH2%" suffix=bcs RET to_check=to_check END + END + ~%MATCH1%("%MATCH2%"~ + REPLACE_EVALUATE CASE_INSENSITIVE ~\(StartDialog\|SetDialog\)("\([^"]+\)"~ BEGIN + LPF check_adder STR_VAR to_check value="%MATCH2%" suffix=dlg RET to_check=to_check END + END + ~%MATCH1%("%MATCH2%"~ + REPLACE_EVALUATE CASE_INSENSITIVE ~StartStore("\([^"]+\)"~ BEGIN + SPRINT to_check "%to_check% %MATCH1%.sto" + END + ~StartStore("%MATCH1%"~ + REPLACE_EVALUATE CASE_INSENSITIVE ~\(LeaveAreaLUA\|LeaveAreaLUAPanic\|MoveBetweenAreas\|RevealAreaOnMap\|MoveBetweenAreasEffect\|EscapeAreaObjectMove\|LeaveAreaLUAEntry\|LeaveAreaLUAPanicEntry\)("\([^"]+\)"~ BEGIN + SPRINT to_check "%to_check% %MATCH2%.are" + END + ~%MATCH1%("%MATCH2%"~ +END + +DEFINE_PATCH_FUNCTION iter_bcs + STR_VAR to_check="" + entry="" // dummy + immunity_func="" // dummmy + RET to_check +BEGIN + PATCH_IF "%SOURCE_RES%" STRING_COMPARE_CASE sarvie01 BEGIN // I OFFICIALLY DON'T CARE why this doesn't compile + DECOMPILE_AND_PATCH BEGIN + LPF iter_script STR_VAR to_check RET to_check=to_check END + END + END +END + + +DEFINE_PATCH_FUNCTION iter_dlg + STR_VAR to_check="" + entry="" // dummy + immunity_func="" // dummmy + RET to_check +BEGIN +// DECOMPILE_AND_PATCH BEGIN // don't bother - dialog scripts aren't compiled + LPF iter_script STR_VAR to_check RET to_check=to_check END + // END +END + +DEFINE_PATCH_FUNCTION iter_ini + STR_VAR to_check="" + entry="" // dummy + immunity_func="" // dummmy + RET to_check +BEGIN + COUNT_2DA_ROWS 3 rowcount + FOR (i=0;ioffset_base BEGIN + LPF STO_read_item_resource RET value=value END + SPRINT to_check "%to_check% %value%.itm" + END + SPRINT entry_type cure + LPM get_offset_array + PHP_EACH offset_array AS int=>offset_base BEGIN + LPF STO_read_cure_resource RET value=value END + SPRINT to_check "%to_check% %value%.spl" + END +END + +DEFINE_PATCH_FUNCTION iter_wmp + STR_VAR to_check="" + entry="" // dummy + immunity_func="" // dummmy + RET to_check +BEGIN + SPRINT file_ext WMP + SPRINT entry_type area + LPM get_offset_array + PHP_EACH offset_array AS int=>offset_base BEGIN + LPF WMP_read_resource RET value=value END + SPRINT to_check "%to_check% %value%.are" + END + SPRINT entry_type link + LPM get_offset_array + PHP_EACH offset_array AS int=>offset_base BEGIN + FOR (i=1;i<=5;i+=1) BEGIN + LPF "WMP_read_random_area_%i%" RET value=value END + LPF check_adder STR_VAR to_check value suffix=are RET to_check=to_check END + END + END +END + +DEFINE_PATCH_FUNCTION iter_wish + STR_VAR to_check="" + RET to_check +BEGIN + FOR (i=1;i<=9;i+=1) BEGIN + SPRINT to_check "%to_check% spwish0%i%" + END + FOR (i=10;i<=25;i+=1) BEGIN + SPRINT to_check "%to_check% spwish%i%" + END +END + +DEFINE_PATCH_FUNCTION iter_vvc + STR_VAR to_check="" + entry="" // dummy + immunity_func="" // dummmy + RET to_check +BEGIN + PATCH_FOR_EACH snd_off IN 0x78 0x80 0x94 BEGIN + READ_ASCII snd_off value + LPF check_adder STR_VAR to_check value suffix=wav RET to_check END + END + PATCH_FOR_EACH bam_off IN 0x8 BEGIN + READ_ASCII bam_off value + LPF check_adder STR_VAR to_check value suffix=bam RET to_check END + END +END + +DEFINE_PATCH_FUNCTION iter_fam + STR_VAR to_check="" + RET to_check +BEGIN + SPRINT to_check "%to_check% fampsd.cre famfer.cre famimp.cre famrab.cre famdust.cre famfair.cre famcat.cre famquas.cre" +END + + + +DEFINE_ACTION_FUNCTION iter_resource + INT_VAR include_spells=0 + skip_payload_on_ignore=0 + STR_VAR to_check="" + func="" + ignore_func="" + immunity_func="" + RET output +BEGIN + ACTION_IF include_spells BEGIN + LAF return_spell_baseline RET list END + OUTER_SPRINT to_check "%to_check% %list%" + END + OUTER_SET counter=0 + OUTER_SET hundreds=0 + OUTER_SPRINT output "" + + // read in a list of random item resources + ACTION_IF GAME_IS "iwd totlm how" BEGIN + COPY_EXISTING rndtres.2da "%workspace%" + COUNT_2DA_ROWS 3 rowcount + FOR (i=0;i value pairs (or key->value pairs), return the first entries, and strip them from the list +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +DEFINE_PATCH_FUNCTION return_first_pair + STR_VAR list="" + arrow="=>" + RET list + key + value + +BEGIN + INNER_PATCH_SAVE list ~%list%~ BEGIN REPLACE_TEXTUALLY ~%arrow%~ ~ %arrow% ~ END + // we can now treat the list as an ordinary list. Return the first entry, discard the second (which should be =>), return the third + LPF return_first_entry STR_VAR list RET list=list key=entry END + LPF return_first_entry STR_VAR list RET list=list discard=entry END + PATCH_IF ~%discard%~ STRING_COMPARE_CASE ~%arrow%~ BEGIN + LPF warning STR_VAR warning= "Warning: it looks as if some entry that should be a key%arrow%value list, isn't (~list~ is currently %list%, key=%key%)" END + END + LPF return_first_entry STR_VAR list RET list=list value=entry END + PATCH_IF debug_variable=2 BEGIN + PATCH_PRINT "Returning key=%key%, value=%value%; rest of list is %list%" + END +END + +DEFINE_ACTION_FUNCTION return_first_pair + STR_VAR list="" + RET key + value + list +BEGIN + OUTER_INNER_PATCH ~~ BEGIN + LPF return_first_pair STR_VAR list RET list=list key=key value=value END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// load a file (which should be a 1-column array) and turn col 1 into a white-space-separated list +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_DIMORPHIC_FUNCTION read_in_list + INT_VAR col=0 + existing=0 + first_row=0 + STR_VAR file="" + location="" + locbase="" + locabs="" + force_case="" + RET list + RET_ARRAY array +BEGIN + ACTION_CLEAR_ARRAY array + ACTION_IF existing BEGIN + COPY_EXISTING ~%file%~ ~%workspace%~ + LPF read_in_list_core INT_VAR col first_row STR_VAR force_case RET list RET_ARRAY array END + BUT_ONLY + END ELSE BEGIN + LAF get_directory STR_VAR location locbase locabs RET file_loc=directory END + OUTER_SPRINT file "%file_loc%/%file%" + COPY ~%file%~ ~%workspace%~ + LPF read_in_list_core INT_VAR col first_row STR_VAR force_case RET list RET_ARRAY array END + BUT_ONLY + END +END + +DEFINE_PATCH_FUNCTION read_in_list_core INT_VAR col=0 first_row=0 STR_VAR force_case="" RET list RET_ARRAY array +BEGIN + SPRINT list "" + COUNT_2DA_COLS colcount + READ_2DA_ENTRIES_NOW 2da_data colcount + FOR (i=first_row;i<2da_data;i+=1) BEGIN + READ_2DA_ENTRY_FORMER 2da_data i col entry + PATCH_MATCH "%force_case%" WITH + lower BEGIN + TO_LOWER entry + END + upper BEGIN + TO_UPPER entry + END + DEFAULT + END + SPRINT list ~%list% %entry%~ + SPRINT $array("%entry%") "" + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Write a space-separated list to a one-column file located in workspace +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION write_list + STR_VAR list="" + file="" + locabs="%data_loc%" + location="" + locbase="" +BEGIN + OUTER_WHILE "%list%" STRING_COMPARE "" BEGIN + LAF return_first_entry STR_VAR list RET entry=entry list=list END + LAF log_this STR_VAR input="%entry%" file location locabs locbase END + END +END + +DEFINE_PATCH_FUNCTION write_list + STR_VAR list="" + file="" + locabs="%data_loc%" + location="" + locbase="" +BEGIN + INNER_ACTION BEGIN + LAF write_list STR_VAR file list location locbase locabs END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// load a file (which should be a 2-column array or a 3-column array with => separator, or a list of x=>y pairs) and turn col 1-2 into an associative array list ("key1=>value1 key2=>value2" etc) +///////////// +///////////// Alternatively get it back as a bona fide assoc array +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION read_in_assoc_array + STR_VAR file="" + location="" + locbase="" + locabs="" + force_case="" + + RET list + RET_ARRAY array +BEGIN + LAF get_directory STR_VAR location locbase locabs RET file_loc=directory END + OUTER_SPRINT file "%file_loc%/%file%" + COPY ~%file%~ ~%workspace%~ + REPLACE_TEXTUALLY "=>" " " + SPRINT list "" + COUNT_2DA_ROWS 1 rowcount + FOR (i=0;i%value%~ + SPRINT $array("%key%") "%value%" + END + PATCH_IF rowcount=0 BEGIN + SPRINT $array("UNDEFINED") "" + END + BUT_ONLY +END + +DEFINE_PATCH_FUNCTION read_in_assoc_array + STR_VAR file="" + location="" + locbase="" + locabs="" + RET list + RET_ARRAY array +BEGIN + INNER_ACTION BEGIN + LAF read_in_assoc_array STR_VAR file location locabs locbase RET list RET_ARRAY array END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// count a list +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION length_of_list + STR_VAR list="" + RET value +BEGIN + // if it has no elements, return 0 + PATCH_IF "%list%" STRING_EQUAL "" BEGIN + SET value=0 + END ELSE BEGIN // if not, strip an element; it's got one more than that! + LPF return_first_entry STR_VAR list RET list2=list END + LPF length_of_list STR_VAR list="%list2%" RET val1=value END + SET value=val1+1 + END +END + + +DEFINE_ACTION_FUNCTION length_of_list + STR_VAR list="" + RET value +BEGIN + OUTER_PATCH "" BEGIN + LPF length_of_list STR_VAR list RET value=value END + END +END + +DEFINE_PATCH_FUNCTION count_list + STR_VAR list="" + RET value +BEGIN + LPF length_of_list STR_VAR list RET value=value END +END + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////// check if element is in list (case-insensitive, no regexp) +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION element_in_list + STR_VAR element="" + list="" + RET value +BEGIN + SET value=0 + PATCH_IF "%list%" STRING_COMPARE "" BEGIN + LPF return_first_entry STR_VAR list RET entry=entry list=list END + PATCH_IF "%entry%" STRING_EQUAL_CASE "%element%" BEGIN + SET value=1 + END ELSE BEGIN + LPF element_in_list STR_VAR element list RET value=value END + END + END +END + +DEFINE_ACTION_FUNCTION element_in_list + STR_VAR element="" + list="" + RET value +BEGIN + OUTER_INNER_PATCH "" BEGIN + LPF element_in_list STR_VAR element list RET value=value END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///// Take a space-separated list containing "splitter", and return the strings to left and right of its first (or last) appearence +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION split_from_left + STR_VAR string="" + splitter="" + RET left + right +BEGIN + SET found=0 + SPRINT right "%string%" + SPRINT left "" + WHILE !found BEGIN + PATCH_IF "%right%" STRING_EQUAL "" BEGIN + PATCH_FAIL "%string% does not contain any instances of %splitter%, so I can't split_from_left on it" + END ELSE BEGIN + LPF return_first_entry STR_VAR list="%right%" RET entry=entry right=list END + PATCH_IF "%entry%" STRING_EQUAL_CASE "%splitter%" BEGIN + SET found=1 + END ELSE BEGIN + SPRINT left "%left% %entry%" + END + END + END +END + +DEFINE_ACTION_FUNCTION split_from_left + STR_VAR string="" + splitter="" + RET left + right +BEGIN + OUTER_PATCH "" BEGIN + LPF split_from_left STR_VAR string splitter RET left=left right=right END + END +END + +DEFINE_PATCH_FUNCTION split_from_right + STR_VAR string="" + splitter="" + RET left + right +BEGIN + LPF invert_list STR_VAR list="%string%" RET string=list END + LPF split_from_left STR_VAR string splitter RET right=left left=right END // watch closely + LPF invert_list STR_VAR list="%left%" RET left=list END + LPF invert_list STR_VAR list="%right%" RET right=list END +END + +DEFINE_ACTION_FUNCTION split_from_right + STR_VAR string="" + splitter="" + RET left + right +BEGIN + OUTER_PATCH "" BEGIN + LPF split_from_right STR_VAR string splitter RET left=left right=right END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///// Take a space-separated list; return it in reverse order +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION invert_list + STR_VAR list="" + RET list +BEGIN + SPRINT list_out "" + WHILE "%list%" STRING_COMPARE "" BEGIN + LPF return_first_entry STR_VAR list RET entry=entry list=list END + SPRINT list_out "%entry% %list_out%" + END + SPRINT list "%list_out%" +END + +DEFINE_ACTION_FUNCTION invert_list + STR_VAR list="" + RET list +BEGIN + OUTER_PATCH "" BEGIN + LPF invert_list STR_VAR list RET list=list END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///// Add the first 'number_to_add' elements from 'elements' to 'list' (from front); returns 'elements' with remaining elements in +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION add_elements_to_list + INT_VAR number_to_add=0 + STR_VAR list="" + elements="" + RET list +BEGIN + PATCH_IF (number_to_add>0 && "%elements%" STRING_COMPARE "") BEGIN + LPF return_first_entry STR_VAR list="%elements%" RET entry elements=list END + LPF push STR_VAR head="%entry%" tail="%list%" RET list END + SET number_to_add -=1 + LPF add_elements_to_list INT_VAR number_to_add STR_VAR list elements RET list END + END +END + +DEFINE_ACTION_FUNCTION add_elements_to_list + INT_VAR number_to_add=0 + STR_VAR list="" + elements="" + RET list +BEGIN + OUTER_PATCH "" BEGIN + LPF add_elements_to_list INT_VAR number_to_add STR_VAR list elements RET list END + END +END + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// return a random entry from a list (or "" if the list is empty) +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION return_random_entry + STR_VAR list="" + RET entry +BEGIN + LPF length_of_list STR_VAR list RET length=value END + PATCH_IF length=0 BEGIN + SPRINT entry "" + END ELSE BEGIN + SET element=RANDOM (1 length) + WHILE element>0 BEGIN + LPF return_first_entry STR_VAR list RET entry list END + SET element = element - 1 + END + END +END + +DEFINE_ACTION_FUNCTION return_random_entry + STR_VAR list="" + RET entry +BEGIN + OUTER_PATCH "" BEGIN + LPF return_random_entry STR_VAR list RET entry END + END +END diff --git a/iwdification/sfo/general/lib_macro.tpa b/iwdification/sfo/general/lib_macro.tpa new file mode 100644 index 0000000..6610e7e --- /dev/null +++ b/iwdification/sfo/general/lib_macro.tpa @@ -0,0 +1,1156 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// set some hardcoded data +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +OUTER_SET maximum_character_level = 40 + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// read in the offsets for a file type (this has to be a macro as it's reading in content) +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_MACRO read_in_offsets +BEGIN + LOCAL_SET i=0 + LOCAL_SET entry_type=0 + LOCAL_SET offset=0 + LOCAL_SET offset_length=0 + LOCAL_SET num=0 + LOCAL_SET num_length=0 + LOCAL_SET entry_length=0 + COPY ~%offset_readin_lookup_2da%.2da~ ~%offset_readin_lookup_2da%.2da~ + READ_2DA_ENTRIES_NOW offset_entry_array 5 + FOR (i=1;idiscard BEGIN + ACTION_IF FILE_EXISTS_IN_GAME "%file%.2da" BEGIN + COPY_EXISTING "%file%.2da" override + COUNT_2DA_COLS colcount + READ_2DA_ENTRIES_NOW pdialog_contents colcount + FOR (i=0;i=6 BEGIN + READ_2DA_ENTRY_FORMER pdialog_contents i 4 25post + READ_2DA_ENTRY_FORMER pdialog_contents i 5 25join + TO_UPPER 25post + TO_UPPER 25join + SPRINT ~%npc%_25POSTJOIN~ ~%25post%~ + SPRINT ~%npc%_25JOINED~ ~%25join%~ + END + END + END + BUT_ONLY + + + END + END // end of loop through all pdialogs + + END // end of 'do this once' loop +END // end of macro +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// read in spellslots in use +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_MACRO read_in_spells_in_use BEGIN + LOCAL_SPRINT array_to_read spell.ids + LOCAL_SPRINT read_array_location "%workspace%" + LOCAL_SPRINT array_name spellname_array + COPY_EXISTING spell.ids "%workspace%" + LAM read_in_assoc_array + ACTION_PHP_EACH spellname_array AS code=>ids BEGIN + ACTION_IF !~%code%~ STRING_EQUAL_CASE IDS BEGIN // avoid irrelevant first line on EE installs + OUTER_SPRINT $ids_in_use("%code%") "" + OUTER_SPRINT $idscode("%ids%") "%code%" + END + END + OUTER_SET spells_in_use_read_in=1 +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// read in the spell codes +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_MACRO ~read_in_spellcodes~ BEGIN + + LOCAL_SPRINT filename "" + LOCAL_SET spellcode=0 + LOCAL_SET level=0 + LOCAL_SPRINT spelltype "" + ACTION_IF !VARIABLE_IS_SET macro_spellcode_skip_scrolls BEGIN + OUTER_SET macro_spellcode_skip_scrolls=0 + END + ACTION_IF !VARIABLE_IS_SET macro_spellcodes_read BEGIN + OUTER_SET macro_spellcodes_read=0 + END + + ACTION_IF !macro_spellcodes_read BEGIN + OUTER_SET macro_spellcodes_read=1 + + ACTION_IF debug_variable=3 BEGIN + PRINT "Beginning macro pass through spell.ids; press a key to continue" + ACTION_READLN blook + SILENT + END + + COPY_EXISTING ~spell.ids~ ~override~ + READ_2DA_ENTRIES_NOW ~unique_macro_spell_array~ 2 + FOR (i=0;i<~unique_macro_spell_array~;i=i+1) BEGIN + READ_2DA_ENTRY_FORMER ~unique_macro_spell_array~ i 0 ~spellcode_base~ + PATCH_IF !~%spellcode_base%~ STRING_EQUAL_CASE ~IDS~ BEGIN + INNER_PATCH_SAVE ~spellcode~ ~%spellcode_base%~ BEGIN + READ_ASCII 0x1 ~level~ (1) + SET level -= 1 + DELETE_BYTES 0 1 + INSERT_BYTES 0 4 + PATCH_IF (~spellcode_base~<2000) BEGIN + WRITE_ASCII 0x0 ~SPPR~ (4) + SPRINT ~spelltype~ ~priest~ + END ELSE + PATCH_IF (~spellcode_base~<3000) BEGIN + WRITE_ASCII 0x0 ~SPWI~ (4) + SPRINT ~spelltype~ ~wizard~ + END ELSE + PATCH_IF (~spellcode_base~<4000) BEGIN + WRITE_ASCII 0x0 ~SPIN~ (4) + SPRINT ~spelltype~ ~innate~ + SET level=0 + END ELSE + PATCH_IF (~spellcode_base~<5000) BEGIN + WRITE_ASCII 0x0 ~SPCL~ (4) + SPRINT ~spelltype~ ~innate~ + SET level=0 + END + END + + PATCH_MATCH "%spellcode%" WITH // special cases handle inconsistent vBG2/BG2EE/BP conventions for remove/dispel magic + SPWI302 BEGIN + SPRINT spell_ID WIZARD_DISPEL_MAGIC + SET WIZARD_REMOVE_MAGIC_LEVEL=2 + END + SPWI326 BEGIN + SPRINT spell_ID WIZARD_TRUE_DISPEL_MAGIC + END + DEFAULT + READ_2DA_ENTRY_FORMER ~unique_macro_spell_array~ i 1 ~spell_ID~ + END + SPRINT $sfo_spell_resrefs("%spell_ID%") "%spellcode%" + SPRINT ~%spell_ID%~ ~%spellcode%~ + SET ~%spell_ID%_LEVEL~=~level~ + SET ~RESREF_%spellcode%_LEVEL~=level + SPRINT ~%spell_ID%_TYPE~ ~%spelltype%~ + SPRINT ~RESREF_%spellcode%_TYPE~ ~%spelltype%~ + PATCH_IF !macro_spellcode_skip_scrolls BEGIN // we use this rather than just SYMBOL_OF_IDS because of the possibility of multiple entries in spell.ids + + PATCH_IF VARIABLE_IS_SET $spellcode_map("%spellcode_base%") BEGIN + SPRINT temp $spellcode_map("%spellcode_base%") + SPRINT $spellcode_map("%spellcode_base%") "%temp% %spell_ID%" + END ELSE BEGIN + SPRINT $spellcode_map("%spellcode_base%") "%spell_ID%" + END + END + END + END + BUT_ONLY + ACTION_IF debug_variable=3 BEGIN + PRINT "Adding bespoke spell variables; press a key to continue" + ACTION_READLN blook + SILENT + END + + <<<<<<<< .../stratagems-inline/extra_spells.2da + CLERIC_CHROMATIC_ORB SPDR101 0 priest + CLERIC_WEB SPDR201 1 priest + CLERIC_LIGHTNING_BOLT SPDR301 2 priest + CLERIC_IMPROVED_INVISIBILITY SPDR401 3 priest + CLERIC_CHAOS SPDR501 4 priest + CLERIC_CHAIN_LIGHTNING SPDR601 5 priest + PSIONIC_SUPERIOR_INVISIBILITY SPIN544 0 innate + DARK_MOON_BLINDNESS SPDM101 0 innate + DARK_MOON_BLUR SPDM102 0 innate + DARK_MOON_FROZEN_FIST SPDM105 0 innate + DARK_MOON_MIRROR_IMAGE SPDM106 0 innate + DARK_MOON_VAMPIRIC_TOUCH SPDM108 0 innate + DWARVEN_DEFENDER_DEFENSIVE_STANCE SPDWD02 0 innate + >>>>>>>> + + + COPY ~.../stratagems-inline/extra_spells.2da~ ~override~ + READ_2DA_ENTRIES_NOW temp_array 4 + FOR (i=0;i=0 || INDEX_BUFFER (CASE_INSENSITIVE SPPR)>=0) BEGIN + LPM log_scroll_main + END + END + BUT_ONLY + END + END + BUT_ONLY + + ACTION_IF !VARIABLE_IS_SET "WIZARD_DISPEL_MAGIC_SCROLL" BEGIN + OUTER_SPRINT "WIZARD_DISPEL_MAGIC_SCROLL" "%WIZARD_REMOVE_MAGIC_SCROLL%" + END + END // end of scrolls + + // now get HLAs - HLA data supersedes what is inferred from spells + + ACTION_IF FILE_EXISTS "%data_loc_root%/dw_shared/dw#hla_feat.2da" BEGIN + COPY "%data_loc_root%/dw_shared/dw#hla_feat.2da" "%workspace%" + READ_2DA_ENTRIES_NOW dw#hla_feat 3 + FOR (i=0;iab_off BEGIN + GET_OFFSET_ARRAY2 fx_arr ab_off ITM_V10_HEAD_EFFECTS + PHP_EACH fx_arr AS fx_ind=>fx_off BEGIN + READ_SHORT fx_off opcode + PATCH_IF (opcode=146 || opcode=147 || opcode=148) & !success BEGIN + READ_ASCII (0x14 + fx_off) resref + INNER_PATCH_SAVE code "%resref%" BEGIN + READ_ASCII 0x0 start (4) + PATCH_MATCH "%start%" WITH + SPWI SPIN SPCL SPPR BEGIN + SET success=1 + REPLACE_TEXTUALLY SPPR 1 + REPLACE_TEXTUALLY SPWI 2 + REPLACE_TEXTUALLY SPIN 3 + REPLACE_TEXTUALLY SPCL 4 + END + DEFAULT + SET success=0 + END + END + PATCH_IF !IS_AN_INT code BEGIN + SET success=0 + END + PATCH_IF success BEGIN + SPRINT list $spellcode_map("%code%") + WHILE "%list%" STRING_COMPARE_CASE "" BEGIN + LPF return_first_entry STR_VAR list RET spellname=entry list END + TO_UPPER spellname + SPRINT ~%spellname%_SCROLL~ ~%filename%~ + PATCH_MATCH "%spellname%" WITH + "WIZARD_.*" BEGIN + SPRINT $arcane_scroll_list("%spellname%") "%filename%" + END + DEFAULT + END + END + END + END + END + END +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// read in the spell codes and spell details in bulk for CLAB data +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_MACRO ~read_in_clab_spelldata~ BEGIN + LOCAL_SET i=0 + LOCAL_SET j=0 + LOCAL_SET colcount=0 + LOCAL_SET rowcount=0 + LOCAL_SET parameter1=0 + LOCAL_SET parameter2=0 + LOCAL_SET opcode=0 + LOCAL_SET offset_base=0 + LOCAL_SPRINT resource_here "" + LOCAL_SPRINT resource "" + LOCAL_SPRINT tempadd "" + LOCAL_SPRINT tempremove "" + SILENT + COPY_EXISTING_REGEXP GLOB "clab.*\.2da" "%workspace%" + COUNT_2DA_COLS colcount + COUNT_2DA_ROWS colcount rowcount + FOR (i=0;ioffset_secondary BEGIN + READ_BYTE offset_secondary+0xc timing + PATCH_IF timing=9 BEGIN // we only care about instant/permanent effects + READ_SHORT offset_secondary opcode + READ_LONG offset_secondary+0x4 parameter1 + READ_LONG offset_secondary+0x8 parameter2 + READ_ASCII offset_secondary+0x14 resource + PATCH_IF "%resource%" STRING_COMPARE "" BEGIN + SPRINT resource_drop "%resource_drop% %resource%" + SPRINT tempadd "%tempadd% add_effect_inline=>~parameter1=>%parameter1% parameter2=>%parameter2% resource=>%resource% opcode=>%opcode% timing=>9 target=>2~" + END ELSE BEGIN + PATCH_MATCH "%opcode%" WITH + 101 142 169 267 BEGIN + SPRINT temp EVALUATE_BUFFER "%%opcode%_sec%" + SPRINT "%opcode%_sec" "%temp% %parameter2%" + SPRINT tempadd "%tempadd% add_effect_inline=>~parameter1=>%parameter1% parameter2=>%parameter2% resource=>null opcode=>%opcode% timing=>9 target=>2~" + END + DEFAULT + SPRINT tempadd "%tempadd% add_effect_inline=>~parameter1=>%parameter1% parameter2=>%parameter2% resource=>null opcode=>%opcode% timing=>9 target=>2~" + SPRINT opcode_drop "%opcode_drop% %opcode%" + END + END + END + END + BUT_ONLY + END // end of ACTION_IF + END // end of INNER_ACTION + PATCH_IF "%opcode_drop%" STRING_COMPARE_CASE "" BEGIN + SPRINT tempremove "delete_effect=>~opcode is_in [%opcode_drop%]~" + END + PATCH_FOR_EACH opcode IN 101 142 169 267 BEGIN + SPRINT list EVALUATE_BUFFER "%%opcode%_sec%" + PATCH_IF "%list%" STRING_COMPARE_CASE "" BEGIN + SPRINT tempremove "%tempremove% delete_effect=>~opcode=%opcode% and parameter2 is_in [%list%]~" + END + END + PATCH_IF "%resource_drop%" STRING_COMPARE_CASE "" BEGIN + SPRINT tempremove "%tempremove% delete_effect=>~resource is_in [%resource_drop%]~" + END + SPRINT "RESREF_%spell%_KIT_EFFECTS_ADD" "%tempadd%" + SPRINT "RESREF_%spell%_KIT_EFFECTS_REMOVE" "%tempremove%" + END // end of PATCH_IF + END + DEFAULT + END + END + END + BUT_ONLY + +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +DEFINE_PATCH_FUNCTION log_scroll +BEGIN + LPF ITM_read_resource RET spell=value END + LPF log_this STR_VAR file=scroll_map.txt input= ~%spell% %filename%~ END +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// read in the saving throws +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_MACRO ~read_in_saving_throws~ BEGIN + ACTION_IF !VARIABLE_IS_SET ~macro_read_in_saving_throws~ BEGIN + // start by defining a map from core class to saving throw file + ACTION_CLEAR_ARRAY class_file_save_map + ACTION_DEFINE_ASSOCIATIVE_ARRAY class_file_save_map BEGIN + MAGE => WIZ + FIGHTER => WAR + CLERIC => PRS + THIEF => ROG + BARD => ROG + PALADIN => WAR + DRUID => PRS + RANGER => WAR + MONK => MONK + SORCERER => WIZ + END + + // read in the base saving throws + + ACTION_FOR_EACH core_type IN WIZ WAR PRS ROG MONK BEGIN + COPY_EXISTING ~SAVE%core_type%.2da~ ~override~ + READ_2DA_ENTRIES_NOW save_array_temp 20 + SET index=1 + PATCH_FOR_EACH type IN death wand polymorph breath spell BEGIN + FOR (level=1;level<=maximum_character_level;level=level+1) BEGIN + READ_2DA_ENTRY_FORMER save_array_temp index level savenum + SET $saving_throw_value_base(~%core_type%~ ~%level%~ ~%type%~)=savenum + END + SET index = index + 1 + END + BUT_ONLY + END + OUTER_SPRINT ~macro_read_in_saving_throws~ ~~ + END + + +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// read in thac0 +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_MACRO ~read_in_thac0~ BEGIN + LOCAL_SET entry=0 + LOCAL_SET row=0 + LOCAL_SET column=0 + LOCAL_SET thac0_num=0 + ACTION_IF !VARIABLE_IS_SET ~macro_read_in_thac0~ BEGIN + COPY_EXISTING ~thac0.2da~ ~%workspace%~ + READ_2DA_ENTRIES_NOW thac0_table_read 25 + FOR (row=1;row 4 + FIGHTER => 10 + CLERIC => 8 + THIEF => 6 + BARD => 6 + PALADIN => 10 + DRUID => 8 + RANGER => 10 + SORCERER => 4 + MONK => 8 + BARBARIAN => 12 + END + ACTION_DEFINE_ASSOCIATIVE_ARRAY hp_hardcoded_array_mod BEGIN + MAGE => 1 + FIGHTER => 3 + CLERIC => 2 + THIEF => 2 + BARD => 2 + PALADIN => 3 + DRUID => 2 + RANGER => 3 + SORCERER => 1 + MONK => 2 + BARBARIAN => 3 + END + ACTION_PHP_EACH hp_hardcoded_array_dice AS class => dice BEGIN + OUTER_SET runningtotal=0 + OUTER_SET modifier = $hp_hardcoded_array_mod(~%class%~) + ACTION_IF ~%class%~ STRING_EQUAL MAGE OR ~%class%~ STRING_EQUAL_CASE SORCERER BEGIN + OUTER_SET dicemax=10 + END ELSE BEGIN + OUTER_SET dicemax=9 + END + OUTER_FOR (i=1;i<=dicemax;i=i+1) BEGIN + OUTER_SET $class_hp_maximum(~%class%~ ~%i%~)=i * dice + OUTER_SET $class_hp_minimum(~%class%~ ~%i%~)=i + END + OUTER_FOR (i=dicemax + 1;i<41;i=i+1) BEGIN + OUTER_SET $class_hp_maximum(~%class%~ ~%i%~)= (i - dicemax)*modifier + dicemax * dice + OUTER_SET $class_hp_minimum(~%class%~ ~%i%~)= (i - dicemax)*modifier + dicemax + END + END + + END + OUTER_SPRINT read_in_hit_point_levels ~~ + + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// read in item types +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_MACRO read_in_item_types +BEGIN + ACTION_DEFINE_ASSOCIATIVE_ARRAY item_location_map BEGIN + 1 => amulet + 2 => armor + 3 => belt + 4 => boots + 5 => quiver + 6 => gloves + 7 => helmet + 10 => ring + 12 => shield + 14 => quiver + 15 => two-handed + 16 => weapon + 17 => weapon + 18 => weapon + 19 => weapon + 20 => weapon + 21 => weapon + 22 => weapon + 23 => weapon + 24 => weapon + 25 => weapon + 26 => weapon + 27 => weapon + 28 => weapon + 29 => weapon + 30 => two-handed + 31 => quiver + 32 => cloak + 35 => qitem + 41 => shield + 44 => weapon + 47 => shield + 49 => shield + 53 => shield + 57 => two-handed + 60 => armor + 61 => armor + 62 => armor + 63 => armor + 64 => armor + 65 => armor + 66 => armor + 69 => weapon + 72 => helmet + 73 => gloves + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// read in proficiencies for each weapon +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_MACRO read_in_proficiencies BEGIN + ACTION_IF !VARIABLE_IS_SET proficiencies_read_in BEGIN + OUTER_SET proficiencies_read_in=1 + COPY_EXISTING weapprof.2da ~%workspace%~ + REPLACE_TEXTUALLY ~NAME_REF~ ~BLOOK NAME_REF~ // just to make column entries match up + READ_2DA_ENTRIES_NOW MACRO_weapprof_data 10 + COUNT_2DA_COLS MACRO_colcount + FOR (i=1;iHELMET + 1=>ARMOR + 2=>SHIELD + 3=>GLOVES + 4=>LRING + 5=>RRING + 6=>AMULET + 7=>BELT + 8=>BOOTS + 9=>WEAPON1 + 10=>WEAPON2 + 11=>WEAPON3 + 12=>WEAPON4 + 13=>QUIVER1 + 14=>QUIVER2 + 15=>QUIVER3 + 16=>QUIVER4 + 17=>CLOAK + 18=>QUICKITEM1 + 19=>QUICKITEM2 + 20=>QUICKITEM3 + 21=>INV1 + 22=>INV2 + 23=>INV4 + 24=>INV5 + 25=>INV6 + 26=>INV7 + 27=>INV8 + 28=>INV9 + 29=>INV10 + 30=>INV11 + 31=>INV12 + 32=>INV13 + 33=>INV14 + 34=>INV15 + 35=>INV16 + 36=>MAGICWEAPON + END + ACTION_PHP_EACH item_slot_map_back AS slotnum=>slotname BEGIN + OUTER_SET $item_slot_map( ~%slotname%~)=slotnum + END + END +END + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// get an offset array (as stipulated in the values of ~entry_type~ and ~file_ext~) and fill offset_array with it +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_MACRO get_offset_array BEGIN + + LOCAL_SET offset_loc=0 + LOCAL_SET offset_length=0 + LOCAL_SET entrynum_loc=0 + LOCAL_SET entrynum_length=0 + LOCAL_SET entry_length=0 + LOCAL_SET temp=0 + LOCAL_SET entrynum=0 + PATCH_CLEAR_ARRAY offset_array + TO_UPPER file_ext + SET offset_loc=$ ~%file_ext%offset_loc~(~%entry_type%~) + SET offset_length=$ ~%file_ext%offset_length~(~%entry_type%~) + SET entrynum_loc=$ ~%file_ext%entrynum_loc~(~%entry_type%~) + SET entrynum_length=$ ~%file_ext%entrynum_length~(~%entry_type%~) + SET entry_length=$ ~%file_ext%entry_length~(~%entry_type%~) + PATCH_IF entrynum_loc>0 BEGIN + GET_OFFSET_ARRAY offset_array offset_loc offset_length entrynum_loc entrynum_length 0 0 entry_length + END ELSE BEGIN + PATCH_MATCH offset_length WITH + 1 BEGIN + READ_BYTE offset_loc offset_start + END + 2 BEGIN + READ_SHORT offset_loc offset_start + END + DEFAULT + READ_LONG offset_loc offset_start + END + SET entrynum=0 - entrynum_loc + FOR (i=0;i>>>>>>> + COPY + temp_file ~%workspace%/temp_file~ EVALUATE_BUFFER + END + PATCH_REINCLUDE ~%workspace%/temp_file~ + + +END + +DEFINE_ACTION_MACRO action_reinclude_this BEGIN + <<<<<<<< temp_file + %input% + >>>>>>>> + COPY + temp_file ~%workspace%/temp_file~ EVALUATE_BUFFER + REINCLUDE ~%workspace%/temp_file~ + + +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/// read in a row of a table into a string of variables (the table lives in 2da_array, we look at 2da_row, and read in var_list) +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_MACRO read_in_2da_row +BEGIN + LOCAL_SET col=0 + LOCAL_SPRINT list ~%var_list%~ + LOCAL_SPRINT input "" + PATCH_SILENT + WHILE ~%list%~ STRING_COMPARE_CASE "" BEGIN + LPF return_first_entry STR_VAR list RET list=list entry=entry END + SPRINT input ~READ_2DA_ENTRY_FORMER 2da_array %2da_row% %col% %entry%~ + LAUNCH_PATCH_MACRO patch_reinclude_this + col=col+1 + END + PATCH_VERBOSE +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// read in a file as an associative array (file is array_to_read, array is array_name) +///////////// +///////////// read_array_location says where the array is; if it is blank, use the default. +///////////// Other variables: read_array_backwards, read_array_column, read_array_is_inline +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_MACRO read_in_assoc_array BEGIN + ACTION_IF !VARIABLE_IS_SET read_array_location BEGIN + OUTER_SPRINT read_array_location "" + END + ACTION_IF "%read_array_is_inline%" STRING_EQUAL_CASE "yes" BEGIN + OUTER_SPRINT read_array_location ".../stratagems-inline" + END ELSE BEGIN + ACTION_IF "%read_array_location%" STRING_EQUAL_CASE "" BEGIN + LAF get_directory RET location=directory END + OUTER_SPRINT read_array_location "%location%" + END + END + ACTION_IF !VARIABLE_IS_SET read_array_column BEGIN + OUTER_SET read_array_column=1 + END + ACTION_IF ("%read_array_backwards%" STRING_EQUAL_CASE yes) BEGIN + OUTER_SET array_loc_0=read_array_column + OUTER_SET array_loc_1=0 + END ELSE BEGIN + OUTER_SET array_loc_0=0 + OUTER_SET array_loc_1=read_array_column + END + COPY - "%read_array_location%/%array_to_read%" "%workspace%" + REPLACE_TEXTUALLY "=>" " " + COUNT_2DA_ROWS 2 array_rowcount + FOR (array_row=0;array_row1 BEGIN + COUNT_2DA_COLS colcount + COUNT_2DA_ROWS colcount rowcount_campaign + FOR (i=0;i0 BEGIN + SET offset_loc=$ "%file_ext%offset_loc"("%predecessor%") + SET offset_len=$ "%file_ext%offset_length"("%predecessor%") + LPF get_field_value INT_VAR loc=offset_loc length=offset_len RET offset=value END + SET entry_length=$ "%file_ext%entry_length"("%predecessor%") + LPF return_lowest_secondary_index INT_VAR offset_base=offset+(num_entries - 1)*entry_length STR_VAR entry_type="%predecessor%" secondary_type RET ind=value END + LPF return_secondary_entry_count INT_VAR offset_base=offset+(num_entries - 1)*entry_length STR_VAR entry_type="%predecessor%" secondary_type RET num=value END + SET value=ind+num + END ELSE BEGIN + LPF return_first_secondary_index STR_VAR entry_type="%predecessor%" secondary_type RET value END + END + END + END +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// return secondary type index and number of entries +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION return_secondary_data + INT_VAR offset_base=0 + ind_to_return=0 + STR_VAR entry_type="" + secondary_type="" + RET index + number +BEGIN + PATCH_IF !VARIABLE_IS_SET "lookup_%file_ext%_%entry_type%_%secondary_type%_ind_loc_%ind_to_return%" BEGIN + SET index="-1" + SET number=0 + END ELSE BEGIN + SET ind_loc="lookup_%file_ext%_%entry_type%_%secondary_type%_ind_loc_%ind_to_return%" + SET ind_len="lookup_%file_ext%_%entry_type%_%secondary_type%_ind_length_%ind_to_return%" + SET num_loc="lookup_%file_ext%_%entry_type%_%secondary_type%_num_loc_%ind_to_return%" + SET num_len="lookup_%file_ext%_%entry_type%_%secondary_type%_num_length_%ind_to_return%" + LPF get_field_value INT_VAR loc=ind_loc+offset_base length=ind_len RET index=value END + LPF get_field_value INT_VAR loc=num_loc+offset_base length=num_len RET number=value END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// update secondary type index and number of entries +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION increment_secondary_data + INT_VAR offset_base=0 + ind_to_write=0 + index=99999 + number=99999 + STR_VAR entry_type="" + secondary_type="" +BEGIN + PATCH_IF VARIABLE_IS_SET "lookup_%file_ext%_%entry_type%_%secondary_type%_ind_loc_%ind_to_write%" BEGIN + SET ind_loc="lookup_%file_ext%_%entry_type%_%secondary_type%_ind_loc_%ind_to_write%" + SET ind_len="lookup_%file_ext%_%entry_type%_%secondary_type%_ind_length_%ind_to_write%" + SET num_loc="lookup_%file_ext%_%entry_type%_%secondary_type%_num_loc_%ind_to_write%" + SET num_len="lookup_%file_ext%_%entry_type%_%secondary_type%_num_length_%ind_to_write%" + LPF get_field_value INT_VAR loc=ind_loc+offset_base length=ind_len RET index_old=value END + LPF get_field_value INT_VAR loc=num_loc+offset_base length=num_len RET number_old=value END + PATCH_IF !(index=99999) BEGIN + LPF set_field_value INT_VAR loc=ind_loc+offset_base length=ind_len arguments=index_old+index END + END + PATCH_IF !(number=99999) BEGIN + LPF set_field_value INT_VAR loc=num_loc+offset_base length=num_len arguments=number_old+number END + END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// update offsets +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION update_offsets + INT_VAR bytes_added=0 + STR_VAR entry_type="" +BEGIN + CLEAR_ARRAY already_updated + LPF return_offset STR_VAR entry_type file_ext RET entry_offset=value END + PHP_EACH ~%file_ext%offset_loc~ AS this_type =>discard BEGIN + PATCH_IF !VARIABLE_IS_SET "do_not_update_offset_%file_ext%_%this_type%" BEGIN + PATCH_IF ~%this_type%~ STRING_COMPARE_CASE ~%entry_type%~ BEGIN + LPF return_offset STR_VAR entry_type="%this_type%" file_ext RET this_offset=value offset_loc END + PATCH_MATCH 1 WITH + this_offsetentry_offset BEGIN + LPF increment_offset INT_VAR arguments=bytes_added STR_VAR entry_type="%this_type%" file_ext END + END + this_offset=entry_offset BEGIN // the awkward case. + // + // If there are any entries already in the being-updated offset, then previously there were none in the modified one (else the two couldn't + // have had the same index). So we can and should update. These are caught by return_number_entries > 0. + // + // If there is no actual count (as in the "item slots" section of CRE) because the section is of fixed size, it should always be incremented, + // since it comes under the above category. These are caught by return_number_entries = -1. + // (This also catches the effect field in ITM/SPL, but that's okay because it should always be last anyway.) + // + // When initially there were no fields, we check if there are any already-present fields of the type being added. If there are, we definitely should *not* + // update. + // + // If there aren't (i.e. if both were originally empty) we fall back on the default precedence, i.e. the order the fields were listed in lib_whatever + // + // (for efficiency, we only check for fields if default precedence would otherwise apply) + // + LPF return_number_entries STR_VAR entry_type="%this_type%" file_ext RET number_here=value END + PATCH_IF (!number_here=0 || VARIABLE_IS_SET "lookup_%file_ext%_%entry_type%_%this_type%_ind_loc_0") BEGIN + LPF increment_offset INT_VAR arguments=bytes_added STR_VAR entry_type="%this_type%" file_ext END + END ELSE BEGIN + PATCH_IF $ ~%file_ext%precedence~(~%entry_type%~) < $ ~%file_ext%precedence~(~%this_type%~) BEGIN + LPF return_number_entries STR_VAR entry_type file_ext RET number_orig=value END + PATCH_IF number_orig=0 BEGIN + LPF increment_offset INT_VAR arguments=bytes_added STR_VAR entry_type="%this_type%" file_ext END + END + END + END + END + DEFAULT + PATCH_FAIL "Shouldn't happen" + END + END + END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// update lookup indices for a particular entry of type entry_type beginning at offset_base +///////////// +///////////// We assume access, in background, to a variable number_added_[entry_type] for each entry type, and lowest_added_[entry_type] likewise, +///////////// that records the lowest point at which one was added. Any index greater than that point gets incremented; any index equal to that point +///////////// gets incremented if a nonzero number of entries are associated with it +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION update_lookup_indices + INT_VAR offset_base=0 + STR_VAR entry_type="" +BEGIN + PHP_EACH ~%file_ext%offset_loc~ AS secondary_type=>discard BEGIN + LPF update_lookup_indices_of_type INT_VAR offset_base STR_VAR entry_type secondary_type END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// update lookup indices for a particular entry of type entry_type beginning at offset_base, with respect to a particular secondary. +///////////// +///////////// We assume access, in background, to a variable number_added_[entry_type] for each entry type, and lowest_added_[entry_type] likewise, +///////////// that records the lowest point at which one was added. Any index greater than that point gets incremented; any index equal to that point +///////////// gets incremented if a nonzero number of entries are associated with it +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION update_lookup_indices_of_type + INT_VAR offset_base=0 + STR_VAR entry_type="" + secondary_type="" +BEGIN + PHP_EACH ~lookup_%file_ext%_%entry_type%_%secondary_type%_ind_loc~ AS int=>index BEGIN + SET len=~lookup_%file_ext%_%entry_type%_%secondary_type%_ind_length_%int%~ + LPF get_field_value INT_VAR loc=index+offset_base length=len RET value END + PATCH_IF VARIABLE_IS_SET "number_added_%secondary_type%" BEGIN + PATCH_IF value>="lowest_added_%secondary_type%" BEGIN + SET value +="number_added_%secondary_type%" + LPF set_field_value INT_VAR loc=index+offset_base length=len arguments=value END + END ELSE BEGIN + PATCH_IF value="lowest_added_%secondary_type%" BEGIN + SET numloc=~lookup_%file_ext%_%entry_type%_%secondary_type%_num_loc_%int%~ + SET numlen=~lookup_%file_ext%_%entry_type%_%secondary_type%_num_length_%int%~ + SET temp=$ ~%file_ext%entrynum_loc~(~%entry_type%~) + LPF get_field_value INT_VAR loc=numloc+offset_base length=numlen RET number END + PATCH_IF number>0 BEGIN + SET value +="number_added_%secondary_type%" + LPF set_field_value INT_VAR loc=index+offset_base length=len arguments=value END + END + END + END + END + END +END + +DEFINE_PATCH_FUNCTION set_lookup_indices_of_type + INT_VAR offset_base=0 + index=0 + STR_VAR entry_type="" + secondary_type="" +BEGIN + PHP_EACH ~lookup_%file_ext%_%entry_type%_%secondary_type%_ind_loc~ AS int=>entry_ind BEGIN + SET len=~lookup_%file_ext%_%entry_type%_%secondary_type%_ind_length_%int%~ + LPF set_field_value INT_VAR loc=entry_ind+offset_base length=len arguments=index END + END +END +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// increment lookup indices for a particular entry of type entry_type beginning at offset_base, with respect to a particular secondary. +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION increment_lookup_indices + INT_VAR offset_base=0 + increment=0 + STR_VAR entry_type="" + secondary_type="" +BEGIN + PHP_EACH ~lookup_%file_ext%_%entry_type%_%secondary_type%_ind_loc~ AS int=>index BEGIN + SET len=~lookup_%file_ext%_%entry_type%_%secondary_type%_ind_length_%int%~ + LPF get_field_value INT_VAR loc=index+offset_base length=len RET value END + SET value += increment + LPF set_field_value INT_VAR loc=index+offset_base length=len arguments=value END + END +END + + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Return the total number of secondary-type entries associated with the given entry +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION return_secondary_entry_count + INT_VAR offset_base=0 + STR_VAR entry_type="" + secondary_type="" + RET value +BEGIN + SET value=0 + PHP_EACH ~lookup_%file_ext%_%entry_type%_%secondary_type%_num_loc~ AS int=>index BEGIN + SET len=~lookup_%file_ext%_%entry_type%_%secondary_type%_num_length_%int%~ + LPF get_field_value INT_VAR loc=index+offset_base length=len RET num_here=value END + SET value +=num_here + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Return the lowest secondary-type index associated with the given entry +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION return_lowest_secondary_index + INT_VAR offset_base=0 + STR_VAR entry_type="" + secondary_type="" + RET value +BEGIN + SET value=9999999 + PHP_EACH ~lookup_%file_ext%_%entry_type%_%secondary_type%_ind_loc~ AS int=>index BEGIN + SET len=~lookup_%file_ext%_%entry_type%_%secondary_type%_ind_length_%int%~ + LPF get_field_value INT_VAR loc=index+offset_base length=len RET ind_here=value END + SET value = value < ind_here ? value : ind_here + END + PATCH_IF value=9999999 BEGIN + SET value="-1" + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Copy "num_to_copy" copies of the entry type starting at index "index", and insert "num_of_copies" of them at that index +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION insert_copies_at_index + INT_VAR index=0 + index_of_copy="-1" + blank=0 + num_to_copy=0 + num_of_copies=0 + STR_VAR entry_type="" + RET value +BEGIN + PATCH_IF index_of_copy<0 BEGIN + SET index_of_copy=index + END + LPF return_offset INT_VAR offset_num=index STR_VAR entry_type file_ext RET offset=value END + LPF return_offset INT_VAR offset_num=index_of_copy STR_VAR entry_type file_ext RET offset_of_copy=value END + SET entry_length=$ ~%file_ext%entry_length~(~%entry_type%~) + PATCH_IF !blank BEGIN + READ_ASCII offset_of_copy template (entry_length*num_to_copy) + END + SET value=0 + FOR (i=0;i%checkGT%" + END ELSE + PATCH_IF "%checkLT%" STRING_COMPARE "" BEGIN + SPRINT match "%match%<%checkLT%" + END ELSE + PATCH_IF "%check%" STRING_COMPARE "" BEGIN + PATCH_IF IS_AN_INT check BEGIN + SPRINT match "%match%=%check%" + END + ELSE BEGIN + SPRINT match "%match% is %check%" + END + END + LPF evaluate_expression INT_VAR offset_secondary offset_base boolean=1 STR_VAR filename file_ext expression="%match%" arguments="%match_parameter%" RET value=value END +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// general templates to apply patches from a list +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +DEFINE_PATCH_FUNCTION apply_patches + INT_VAR + offset_secondary=0 + really_no_default=0 + entry_index=0 + parent_index=0 + stop_after_match=0 + offset_base=0 + STR_VAR + edits="" + arguments="" + file_ext="" + filename="" + is_conditional="no" // a bit of a misnomer. We really mean: is it being called by one of patch_entry etc. (If so, we ignore match etc commands) + RET + value // 1 if any patch is made, 0 otherwise +BEGIN + SET value=0 + LPF edit_sanity_check STR_VAR edits task="applying patch to %filename%.%file_ext%" END + PATCH_IF ~%arguments%~ STRING_COMPARE_CASE ~~ BEGIN + SPRINT ~edits~ ~%arguments%~ + END + PATCH_FOR_EACH var IN check checkLT checkGT match BEGIN + SPRINT "%var%" "" + END + // go through first to get any match (etc) instructions + PATCH_IF "%is_conditional%" STRING_COMPARE_CASE yes BEGIN + PHP_EACH "%edits%" AS function=>args BEGIN + PATCH_MATCH "%function%" WITH + "checkGT" "checkLT" "check" "match" BEGIN + SPRINT "%function%" "%args%" + END + DEFAULT END + END + END + // evaluate condition + PATCH_MATCH "%match%%check%%checkGT%%checkLT%" WITH + "" BEGIN + SET found_match=1 + END + DEFAULT + LPF evaluate_condition STR_VAR filename file_ext match check checkLT checkGT RET found_match=value END + PATCH_IF found_match BEGIN SET value=1 END + END + PATCH_IF found_match BEGIN + // ensure that none of the expressions we're trying to match has inherited a numerical value from elsewhere! + PATCH_FOR_EACH string IN + checkGT checkLT check match litvar_ var_ type number_to_add at_end insert_point clone_above clone_at_top clone_at_bottom BEGIN + SPRINT "%string%" "" + END + + PHP_EACH ~%edits%~ AS function => args BEGIN + PATCH_IF debug_variable=2 BEGIN + PATCH_PRINT ~input to apply_patches: %function% %args%~ + END + INNER_PATCH_SAVE ~function2~ ~%function%~ BEGIN + REPLACE_TEXTUALLY ~'[0-9]+~ ~~ // handle duplicates + REPLACE_TEXTUALLY ~'~ ~~ // handle duplicates + END + PATCH_IF debug_variable=2 BEGIN PATCH_PRINT ~Running function %function2%~ END + SET default=0 + PATCH_MATCH ~%function2%~ WITH + "number_to_add" "at_end" "insert_point" "type" "clone_above" "clone_at_top" "clone_at_bottom" "only_once"// these aren't function calls + BEGIN + PATCH_IF ~%is_conditional%~ STRING_EQUAL_CASE ~no~ BEGIN + PATCH_FAIL "The patch to %filename%.%file_ext% is applied unconditionally but contains conditions or type specification" + END + END + checkGT checkLT check match BEGIN + END + literal + BEGIN + LPF patch_reinclude_this STR_VAR input= ~%args%~ END + END + "litvar_.*" + BEGIN + INNER_PATCH_SAVE function2 "%function2%" BEGIN + DELETE_BYTES 0x0 3 + END + SPRINT "SFO_RESERVED_%function2%" "%args%" // so I'm violating the encapsulation of the functions. So sue me. (At least until WEIDU can handle lists as arguments.) + END + "var_.*" + BEGIN + LPF evaluate_expression INT_VAR offset_base offset_secondary entry_index subterm=1 STR_VAR expression="%args%" filename file_ext RET value_res=value END + SPRINT "SFO_RESERVED_%function2%" "%value_res%" + END + // these ones don't get evaluated + patch_entry add_entry delete_entry clone_entry patch_entry_inline add_entry_inline clone_entry_inline level_based_blocks BEGIN // the arguments of these functions should not be evaluated + LPF "%function2%" STR_VAR arguments=~%args%~ filename file_ext END + END + + "\(patch\|clone\|add\)_.*_inline" BEGIN + INNER_PATCH "%function2%" BEGIN + REPLACE_EVALUATE "\([^_]*\)_\(.*\)_inline" BEGIN + SPRINT type "%MATCH2%" + SPRINT instr "%MATCH1%" + END + discard + END + PATCH_IF !VARIABLE_IS_SET "%file_ext%offset_loc_%type%" && "%type%" STRING_COMPARE effect_global && !VARIABLE_IS_SET "%file_ext%_virtual_type_parent_%type%" BEGIN + PATCH_FAIL "%type% is not a legal entry type for files of type %file_ext%" + END ELSE BEGIN + PATCH_MATCH "%instr%" WITH + patch BEGIN + LPF "%instr%_entry_inline" INT_VAR stop_after_match STR_VAR arguments="%args%" type filename file_ext RET value END + END + DEFAULT + LPF "%instr%_entry_inline" STR_VAR arguments="%args%" type filename file_ext RET value END + END + END + END + + "\(patch\|clone\|delete\|add\)_.*" BEGIN + INNER_PATCH "%function2%" BEGIN + REPLACE_EVALUATE "\([^_]*\)_\(.*\)" BEGIN + SPRINT type "%MATCH2%" + SPRINT instr "%MATCH1%" + END + discard + END + PATCH_IF !VARIABLE_IS_SET "%file_ext%offset_loc_%type%" && "%type%" STRING_COMPARE effect_global && !VARIABLE_IS_SET "%file_ext%_virtual_type_parent_%type%" BEGIN + SET default=1 + END ELSE BEGIN + PATCH_MATCH "%instr%" WITH + patch BEGIN + LPF "%instr%_entry" INT_VAR stop_after_match STR_VAR arguments="%args%" type filename file_ext RET value END + END + DEFAULT + LPF "%instr%_entry" STR_VAR arguments="%args%" type filename file_ext RET value END + END + END + END + + // main implementation + DEFAULT + SET default=1 + END + PATCH_IF default BEGIN + SET value=1 + PATCH_IF debug_variable=2 BEGIN + PATCH_PRINT ~Calling %function2%, arguments %offset_secondary% %args% %filename% %offset_base% %file_ext%~ + END + PATCH_IF !VARIABLE_IS_SET $SFO_do_not_parse_arguments("%function2%") && !VARIABLE_IS_SET $SFO_do_not_parse_arguments("%file_ext%_%function2%") BEGIN + LPF evaluate_expression INT_VAR offset_secondary offset_base entry_index STR_VAR filename file_ext expression="%args%" RET value_ret=value END + END ELSE BEGIN + SPRINT value_ret "%args%" + END + LPF apply_standard_function INT_VAR offset_secondary entry_index offset_base STR_VAR func=~%function2%~ arguments=~%value_ret%~ filename file_ext END + END + END + END +END + + +DEFINE_PATCH_FUNCTION apply_patches_inline + INT_VAR + offset_secondary=0 + offset_base=0 + really_no_default=0 + entry_index=0 + STR_VAR + editstring="" + arguments="" + file_ext="" + filename="" + RET + value +BEGIN + PATCH_IF "%arguments%" STRING_EQUAL "" BEGIN + SPRINT arguments "%editstring%" + END + CLEAR_ARRAY temp_assoc + WHILE "%arguments%" STRING_COMPARE "" BEGIN + LPF return_first_pair STR_VAR list="%arguments%" RET key value arguments=list END + WHILE VARIABLE_IS_SET $temp_assoc("%key%") BEGIN + SPRINT key "%key%'" + END + SPRINT $temp_assoc("%key%") "%value%" + END + LPF apply_patches + INT_VAR offset_base offset_secondary entry_index really_no_default + STR_VAR arguments=temp_assoc filename= ~%filename%~ file_ext= ~%file_ext%~ + RET value + END +END +OUTER_SPRINT $SFO_do_not_parse_arguments("apply_patches_inline") "" + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Apply patch on condition +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION patch_entry + INT_VAR stop_after_match=0 + STR_VAR arguments="" // this is a patch + filename="" + file_ext="" + type="" + RET value // 1 if any patching occurs +BEGIN + SET value=0 + LPF key_value_sanity_check INT_VAR is_key=0 STR_VAR arguments END + // read in parameters + SPRINT check "" + SPRINT checkGT "" + SPRINT checkLT "" + SPRINT match "" + PHP_EACH "%arguments%" AS func=>arg BEGIN + PATCH_MATCH "%func%" WITH + match check checkLT checkGT type BEGIN + SPRINT "%func%" "%arg%" + END + patch_entry_inline patch_entry add_entry_inline add_entry delete_entry clone_entry_inline clone_entry + BEGIN + PATCH_FAIL "You can't chain conditional patches: %func% can't be used inside another conditional patch" + END + "var_.*" BEGIN + SPRINT "SFO_RESERVED_%func%" "%arg%" + END + DEFAULT + END + END + PATCH_IF "%type%" STRING_EQUAL "" BEGIN + PATCH_FAIL "patch_entry patch on %filename%.%file_ext% does not specify a type of entry to add" + END + SPRINT entry_type "%type%" + PATCH_IF VARIABLE_IS_SET $ "%file_ext%_virtual_type_parent"("%type%") BEGIN + SPRINT parent_type EVALUATE_BUFFER "%%file_ext%_virtual_type_parent_%type%%" + SPRINT entry_type EVALUATE_BUFFER "%%file_ext%_virtual_type_child_%type%%" + SET sec_index="%file_ext%_virtual_type_index_%type%" + LPF patch_entry_child INT_VAR sec_index stop_after_match STR_VAR entry_type parent_type arguments check checkGT checkLT match match_parameter filename file_ext RET value END + END ELSE BEGIN + LPF patch_entry_notchild INT_VAR stop_after_match STR_VAR arguments check checkGT checkLT match match_parameter filename file_ext entry_type RET value END + END +END + +DEFINE_PATCH_FUNCTION patch_entry_child + INT_VAR sec_index=0 + stop_after_match=0 + STR_VAR arguments="" + check="" + checkGT="" + checkLT="" + match="" + match_parameter="" + entry_type="" + parent_type="" + filename="" + file_ext="" + RET + value +BEGIN + // initialise + SET value=0 + LPF return_number_entries STR_VAR entry_type="%parent_type%" file_ext RET num_entries_parent=value END + // cycle through parent + FOR (parent_index=0;parent_indexarg BEGIN + PATCH_MATCH "%func%" WITH + number_to_add match match_parameter check checkLT checkGT type insert_point at_end BEGIN + SPRINT "%func%" "%arg%" + END + add_entry_inline add_entry delete_entry clone_entry_inline clone_entry + BEGIN + PATCH_FAIL "You can't chain conditional patches: %func% can't be used inside another conditional patch" + END + "var_.*" BEGIN + SPRINT "SFO_RESERVED_%func%" "%arg%" + END + DEFAULT + END + END + PATCH_IF "%type%" STRING_EQUAL "" BEGIN + PATCH_FAIL "add_entry patch on %filename%.%file_ext% does not specify a type of entry to add" + END + SPRINT entry_type "%type%" + PATCH_IF VARIABLE_IS_SET $ "%file_ext%_virtual_type_parent"("%type%") BEGIN + SPRINT parent_type EVALUATE_BUFFER "%%file_ext%_virtual_type_parent_%type%%" + SPRINT entry_type EVALUATE_BUFFER "%%file_ext%_virtual_type_child_%type%%" + SET sec_index="%file_ext%_virtual_type_index_%type%" + LPF add_entry_child INT_VAR sec_index STR_VAR entry_type parent_type at_end insert_point arguments check checkGT checkLT match match_parameter filename file_ext number_to_add END + END ELSE BEGIN + LPF add_entry_notchild STR_VAR at_end insert_point arguments check checkGT checkLT match match_parameter filename file_ext number_to_add entry_type END + END + SET value=1 +END + +DEFINE_PATCH_FUNCTION add_entry_child + INT_VAR sec_index=0 + STR_VAR arguments="" + check="" + checkGT="" + checkLT="" + match="" + entry_type="" + parent_type="" + match_parameter="" + filename="" + file_ext="" + at_end="0" + insert_point="0" + number_to_add="1" // it's still a STR_VAR, as it might be functional +BEGIN + // initialise + SET "number_added_%entry_type%"=0 + SET "lowest_added_%entry_type%"=999999 + LPF return_number_entries STR_VAR entry_type="%parent_type%" file_ext RET num_entries_parent=value END + // cycle through parent + FOR (parent_index=0;parent_index num_entries ? num_entries : insert_point_val) + // do the insertion + LPF insert_copies_at_index INT_VAR blank=1 index=index+insert_point_val num_to_copy=1 num_of_copies=number_to_add_val STR_VAR entry_type RET bytes_added=value END + LPF update_offsets INT_VAR bytes_added STR_VAR entry_type END + + // patch + FOR (entry_index=0;entry_indexdiscard BEGIN + PATCH_IF "%this_type%" STRING_COMPARE "%parent_type%" && VARIABLE_IS_SET "has_secondaries_%file_ext%_%this_type%" BEGIN + LPF return_number_entries STR_VAR entry_type="%this_type%" file_ext RET num_entries=value END + FOR (i=0;idiscard BEGIN + SET "number_added_%this_type%"=0 + SET "lowest_added_%this_type%"=999999 + END + SET entry_length=$ ~%file_ext%entry_length~(~%entry_type%~) + // check condition + PATCH_MATCH "%match%%check%%checkGT%%checkLT%" WITH + "" BEGIN + SET found_match=1 + END + DEFAULT // notice that the condition is evaluated at the parent step, so offset_base isn't needed + LPF evaluate_condition STR_VAR match check match_parameter checkGT checkLT filename file_ext RET found_match=value END + END + PATCH_IF found_match=1 BEGIN + // find the actual value for number_to_add + LPF evaluate_expression STR_VAR filename file_ext expression="%number_to_add%" RET number_to_add_val=value END + // get the insertion point + LPF evaluate_expression STR_VAR filename file_ext expression="%insert_point%" RET insert_point_val=value END + LPF evaluate_expression STR_VAR filename file_ext expression="%at_end%" RET at_end_val=value END + PATCH_IF insert_point_val="-1" BEGIN + SET at_end_val=1 // support legacy ADD_SPL_EFFECT syntax + END + SET insert_point_val= at_end_val? num_entries : (insert_point_val > num_entries ? num_entries : insert_point_val) + LPF return_offset INT_VAR offset_num=insert_point_val STR_VAR entry_type file_ext RET offset_base=value END + // physically insert the entries + LPF insert_copies_at_index INT_VAR blank=1 index=insert_point_val num_to_copy=1 num_of_copies=number_to_add_val STR_VAR entry_type RET bytes_added=value END + LPF update_offsets INT_VAR bytes_added STR_VAR entry_type END + SET "number_added_%entry_type%" = number_to_add_val + // find the values for the indices on the secondary entries + PHP_EACH "%file_ext%offset_loc" AS secondary_type=>discard BEGIN + PATCH_IF insert_point_val>0 BEGIN // if this isn't the first entry, just get it from the previous entry + LPF return_secondary_entry_count INT_VAR offset_base=offset_base - entry_length STR_VAR entry_type secondary_type RET sec_num_prev=value END + LPF return_lowest_secondary_index INT_VAR offset_base=offset_base - entry_length STR_VAR entry_type secondary_type RET sec_ind_prev=value END + SET sec_ind_here=sec_num_prev+sec_ind_prev + END ELSE BEGIN + LPF return_first_secondary_index STR_VAR entry_type secondary_type RET sec_ind_here=value END + END + FOR (i=0;ioff BEGIN + WRITE_SHORT (0x20+off) (SHORT_AT (0x20+off))+number_added_effect + END + END + + +END + + + +DEFINE_PATCH_FUNCTION add_entry_inline + INT_VAR at_end=0 + STR_VAR arguments="" // this is a hash + file_ext="" + filename="" + type="" + RET value // always 1 +BEGIN + LPF key_value_sanity_check INT_VAR is_key=1 STR_VAR arguments END + CLEAR_ARRAY temp_assoc + SPRINT ~temp~ ~ACTION_DEFINE_ASSOCIATIVE_ARRAY temp_assoc BEGIN %arguments% END~ + WHILE "%arguments%" STRING_COMPARE "" BEGIN + LPF return_first_pair STR_VAR list="%arguments%" RET key=key value=value arguments=list END + SPRINT $temp_assoc("%key%") "%value%" + END + LPF add_entry + INT_VAR at_end + STR_VAR arguments=temp_assoc filename= ~%filename%~ file_ext= ~%file_ext%~ type + RET value + END +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// clone an entry based on matched conditions +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION clone_entry + STR_VAR arguments="" // this is a hash + file_ext="" + filename="" + type="" + RET value // always 1 +BEGIN + LPF key_value_sanity_check INT_VAR is_key=0 STR_VAR arguments END + // read in parameters + SPRINT check "" + SPRINT checkGT "" + SPRINT checkLT "" + SPRINT match "" + SPRINT match_parameter "" + SET clone_above=0 + SET clone_at_top=0 + SET clone_at_bottom=0 + SET only_once=0 + SET number_to_add=1 + PHP_EACH "%arguments%" AS func=>arg BEGIN + PATCH_MATCH "%func%" WITH + number_to_add match match_parameter check checkLT checkGT type clone_above clone_at_top clone_at_bottom only_once BEGIN + SPRINT "%func%" "%arg%" + END + add_entry_inline add_entry delete_entry clone_entry_inline clone_entry + BEGIN + PATCH_FAIL "You can't chain conditional patches: %func% can't be used inside another conditional patch" + END + "var_.*" BEGIN + SPRINT "SFO_RESERVED_%func%" "%arg%" + END + DEFAULT + END + END + PATCH_IF ~%type%~ STRING_EQUAL "" BEGIN + PATCH_FAIL "You are trying to clone an entry on %filename%.%file_ext% but you have not specified the entry type" + END + SPRINT entry_type "%type%" + PATCH_IF VARIABLE_IS_SET $ "%file_ext%_virtual_type_parent"("%type%") BEGIN + SPRINT parent_type EVALUATE_BUFFER "%%file_ext%_virtual_type_parent_%type%%" + SPRINT entry_type EVALUATE_BUFFER "%%file_ext%_virtual_type_child_%type%%" + SET sec_index="%file_ext%_virtual_type_index_%type%" + LPF clone_entry_child INT_VAR sec_index STR_VAR entry_type clone_above clone_at_top clone_at_bottom only_once parent_type arguments check checkGT checkLT match filename file_ext number_to_add END + END ELSE BEGIN + LPF clone_entry_notchild STR_VAR clone_above clone_at_top clone_at_bottom only_once arguments check checkGT checkLT match filename file_ext number_to_add entry_type END + END + SET value=1 +END + +DEFINE_PATCH_FUNCTION clone_entry_child + INT_VAR sec_index=0 + STR_VAR arguments="" + check="" + clone_above=0 + clone_at_top=0 + clone_at_bottom=0 + only_once=0 + checkGT="" + checkLT="" + match="" + entry_type="" + parent_type="" + filename="" + file_ext="" + number_to_add="1" // it's still a STR_VAR, as it might be functional +BEGIN + // initialise + SET "number_added_%entry_type%"=0 + SET "lowest_added_%entry_type%"=999999 + SET no_more_clones=0 + LPF return_number_entries STR_VAR entry_type="%parent_type%" file_ext RET num_entries_parent=value END + // cycle through parent + FOR (parent_index=0;parent_indexdiscard BEGIN + PATCH_IF "%this_type%" STRING_COMPARE "%parent_type%" && VARIABLE_IS_SET "has_secondaries_%file_ext%_%this_type%" BEGIN + LPF return_number_entries STR_VAR entry_type="%this_type%" file_ext RET num_entries=value END + FOR (i=0;idiscard BEGIN + SET "number_added_%this_type%"=0 + SET "lowest_added_%this_type%"=999999 + END + // cycle through + FOR (i=0;idiscard BEGIN + LPF return_secondary_entry_count INT_VAR offset_base STR_VAR entry_type secondary_type RET secondary_added_per_step=value END + LPF return_lowest_secondary_index INT_VAR offset_base STR_VAR entry_type secondary_type RET lowest_index=value END + PATCH_IF "lowest_added_%secondary_type%">lowest_index BEGIN + SET "lowest_added_%secondary_type%"=lowest_index + END + PATCH_IF lowest_index>=0 BEGIN // i.e., if we actually find any entries + LPF insert_copies_at_index INT_VAR index=lowest_index num_to_copy=secondary_added_per_step num_of_copies=number_to_add_val STR_VAR entry_type="%secondary_type%" RET bytes_added=value END + LPF update_offsets INT_VAR bytes_added STR_VAR entry_type="%secondary_type%" END + + FOR (j=1;j<=number_to_add_val;j+=1) BEGIN + SET "number_added_%secondary_type%" += secondary_added_per_step + LPF return_offset INT_VAR offset_num=index + j STR_VAR entry_type file_ext RET offset_here=value END + LPF increment_lookup_indices INT_VAR increment=secondary_added_per_step*j offset_base=offset_here STR_VAR entry_type secondary_type END + END + END + END + // apply patches + FOR (entry_index=0;entry_indexdiscard BEGIN + + PATCH_IF "%this_type%" STRING_COMPARE "%entry_type%" && VARIABLE_IS_SET "has_secondaries_%file_ext%_%this_type%" BEGIN + LPF return_number_entries STR_VAR entry_type="%this_type%" file_ext RET num_entries=value END + FOR (i=0;idiscard BEGIN + SET arguments="number_added_%this_type%" + LPF increment_number_entries INT_VAR arguments STR_VAR entry_type="%this_type%" file_ext END + END + + PATCH_IF effect_global BEGIN + WRITE_SHORT 0x70 (SHORT_AT 0x70)+number_added_effect + END +END + + + +DEFINE_PATCH_FUNCTION clone_entry_inline + STR_VAR arguments="" // this is a hash + file_ext="" + filename="" + type="" + RET value // always 1 +BEGIN + LPF key_value_sanity_check INT_VAR is_key=1 STR_VAR arguments END + CLEAR_ARRAY temp_assoc + SPRINT ~temp~ ~ACTION_DEFINE_ASSOCIATIVE_ARRAY temp_assoc BEGIN %arguments% END~ + WHILE "%arguments%" STRING_COMPARE "" BEGIN + LPF return_first_pair STR_VAR list="%arguments%" RET key=key value=value arguments=list END + SPRINT $temp_assoc("%key%") "%value%" + END + LPF clone_entry + STR_VAR arguments=temp_assoc filename= ~%filename%~ file_ext= ~%file_ext%~ type + RET value + END +END + + + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// general template to delete an entry type +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION delete_entry // this uses indirection: the entries are in an assoc_array + STR_VAR arguments="" + filename="" + file_ext="" + type="" + RET value // always 1 +BEGIN + LPF key_value_sanity_check INT_VAR is_key=0 STR_VAR arguments END + PATCH_IF ~%type%~ STRING_EQUAL "" BEGIN + PATCH_FAIL "You are trying to delete an entry on %filename%.%file_ext% but you have not specified the entry type" + END + SPRINT entry_type "%type%" + PATCH_IF VARIABLE_IS_SET $ "%file_ext%_virtual_type_parent"("%type%") BEGIN + SPRINT parent_type EVALUATE_BUFFER "%%file_ext%_virtual_type_parent_%type%%" + SPRINT entry_type EVALUATE_BUFFER "%%file_ext%_virtual_type_child_%type%%" + SET sec_index="%file_ext%_virtual_type_index_%type%" + LPF delete_entry_child INT_VAR sec_index STR_VAR entry_type parent_type arguments filename file_ext END + END ELSE BEGIN + LPF delete_entry_notchild STR_VAR arguments filename file_ext entry_type END + END + SET value=1 + +END + + DEFINE_PATCH_FUNCTION delete_entry_child + INT_VAR sec_index=0 + STR_VAR arguments="" + entry_type="" + parent_type="" + filename="" + file_ext="" +BEGIN + // initialise + SET "number_added_%entry_type%"=0 + SET "lowest_added_%entry_type%"=999999 + LPF return_number_entries STR_VAR entry_type="%parent_type%" file_ext RET num_entries_parent=value END + // cycle through parent + FOR (parent_index=0;parent_indexdiscard BEGIN + PATCH_IF "%this_type%" STRING_COMPARE "%parent_type%" && VARIABLE_IS_SET "has_secondaries_%file_ext%_%this_type%" BEGIN + LPF return_number_entries STR_VAR entry_type="%this_type%" file_ext RET num_entries=value END + FOR (i=0;idiscard BEGIN + SET "number_added_%this_type%"=0 + SET "lowest_added_%this_type%"=999999 + END + // cycle through + FOR (i=0;idiscard BEGIN + LPF return_secondary_entry_count INT_VAR offset_base STR_VAR entry_type secondary_type RET number_to_delete=value END + LPF return_lowest_secondary_index INT_VAR offset_base STR_VAR entry_type secondary_type RET lowest_index=value END + PATCH_IF "lowest_added_%secondary_type%">lowest_index BEGIN + SET "lowest_added_%secondary_type%"=lowest_index + END + PATCH_IF lowest_index>=0 BEGIN // i.e., if we actually find any entries + LPF delete_at_index INT_VAR index=lowest_index number_to_delete STR_VAR entry_type="%secondary_type%" RET bytes_added=value END + LPF update_offsets INT_VAR bytes_added STR_VAR entry_type="%secondary_type%" END + SET "number_added_%secondary_type%" = "number_added_%secondary_type%" - number_to_delete + END + END + // do the deletion + LPF delete_at_index INT_VAR index STR_VAR entry_type RET bytes_added=value END + LPF update_offsets INT_VAR bytes_added STR_VAR entry_type END + // record the subtacted main entries + SET "number_added_%entry_type%" = "number_added_%entry_type%" - 1 + END + END + + SET temp="lowest_added_%entry_type%" + // update the indices in all other entries + + PHP_EACH "%file_ext%offset_loc" AS this_type=>discard BEGIN + PATCH_IF "%this_type%" STRING_COMPARE "%entry_type%" && VARIABLE_IS_SET "has_secondaries_%file_ext%_%this_type%" BEGIN + LPF return_number_entries STR_VAR entry_type="%this_type%" file_ext RET num_entries=value END + FOR (i=0;idiscard BEGIN + SET arguments="number_added_%this_type%" + LPF increment_number_entries INT_VAR arguments STR_VAR entry_type="%this_type%" file_ext END + END + + PATCH_IF effect_global BEGIN + WRITE_SHORT 0x70 (SHORT_AT 0x70)+number_added_effect + END +END + + diff --git a/iwdification/sfo/general/lib_table.tpa b/iwdification/sfo/general/lib_table.tpa new file mode 100644 index 0000000..0eb5ada --- /dev/null +++ b/iwdification/sfo/general/lib_table.tpa @@ -0,0 +1,452 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///// 2da read/write tools based on the 2da file being in a standard table configuration +///// +///// lib_table is independent of my other functions, with the exception of the read-external-table function +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION get_table_column_coordinate + STR_VAR column="" + RET colnum +BEGIN + COUNT_2DA_COLS colcount + SET firstrow = colcount=2? 2: (colcount=3? 1: 0) + // find the right column + SET colnum= "-1" + FOR (j=1;j=0 && colnum>=0) BEGIN + READ_2DA_ENTRY rownum colnum colcount value + END ELSE BEGIN + SET value= "-1" + PATCH_IF !dont_complain BEGIN + PATCH_PRINT "SFO warning: Tried to read entry name (%row%,%column%), apparent coordinates (%rownum%,%colnum%) from table (probably %SOURCE_FILE%) but it doesn't exist; returning -1" + END + END +END + +DEFINE_ACTION_FUNCTION read_table_entry + INT_VAR lookup_column=0 + dont_complain=0 + rownum="-1" + colnum="-1" + STR_VAR file="" + row="" + column="" + + RET value colnum rownum +BEGIN + ACTION_IF "%file%" STRING_EQUAL "" BEGIN + FAIL "No table specified in read_table_entry" + END + ACTION_IF !FILE_EXISTS_IN_GAME "%file%" BEGIN + ACTION_IF !FILE_EXISTS_IN_GAME "%file%.2da" BEGIN + FAIL "Tried to read an entry from %file%, but %file% does not exist and nor does %file%.2da" + END ELSE BEGIN + OUTER_SPRINT file "%file%.2da" + END + END + COPY_EXISTING "%file%" "%workspace%" + LPF read_table_entry INT_VAR lookup_column dont_complain rownum colnum STR_VAR row column RET value colnum rownum END + BUT_ONLY +END + +DEFINE_ACTION_FUNCTION read_table_entry_external + INT_VAR lookup_column=0 + dont_complain=0 + rownum="-1" + colnum="-1" + STR_VAR file="" + row="" + column="" + location="" + locbase="" + locabs="" + RET value +BEGIN + LAF get_directory STR_VAR location locbase locabs RET directory END + ACTION_IF !FILE_EXISTS "%directory%/%file%" BEGIN + FAIL "Tried to read a 2da entry from %directory%/%file% but it doesn't exist" + END + COPY "%directory%/%file%" "%workspace%" + LPF read_table_entry INT_VAR lookup_column dont_complain rownum colnum STR_VAR row column RET value END + BUT_ONLY +END + + +DEFINE_PATCH_FUNCTION write_table_entry + INT_VAR lookup_column=0 + do_not_insert=0 + rownum="-1" + colnum="-1" + all_rows=0 + STR_VAR arguments="" + row="" + column="" + default_fill="0" +BEGIN + COUNT_2DA_COLS colcount + COUNT_2DA_ROWS colcount rowcount + PATCH_IF "%column%" STRING_COMPARE "" BEGIN + LPF get_table_column_coordinate STR_VAR column RET colnum END + PATCH_IF colnum<0 BEGIN + PATCH_FAIL "Tried to add an entry (%row%,%column%) to table (probably %SOURCE_FILE%) but there is no %column% column" + END + END ELSE BEGIN + PATCH_IF colnum<0 BEGIN + PATCH_FAIL "No column specified in write_table_entry" + END + END + PATCH_IF all_rows BEGIN + FOR (i=0;i highest_num ? this_num : highest_num + END + SET value=highest_num + 1 + SPRINT new_row "%value% %arguments%" + INSERT_2DA_ROW rowcount colcount "%new_row%" +END + + +DEFINE_PATCH_FUNCTION renumber_rows + INT_VAR start_at=1 +BEGIN + COUNT_2DA_COLS colcount + COUNT_2DA_ROWS colcount rowcount + PATCH_IF colcount=2 BEGIN + SET firstrow=1 + END ELSE BEGIN + SET firstrow=0 + END + SET highest_num=0 + FOR (i=firstrow;i newstring + RET output +BEGIN + PATCH_IF ~%arguments%~ STRING_COMPARE_CASE ~~ BEGIN + LPF return_first_pair STR_VAR list= ~%arguments%~ RET old=key new=value arguments=list END + INNER_PATCH_SAVE output ~%input%~ BEGIN + PATCH_IF "%old%" STRING_EQUAL_CASE "SFO_reserved_function" BEGIN + LPF "%new%" END + END ELSE BEGIN + PATCH_IF ~%new%~ STRING_EQUAL_CASE ~NULL~ BEGIN + SPRINT new ~~ + END + PATCH_IF ~%new%~ STRING_EQUAL_CASE ~SPACE~ BEGIN + SPRINT new ~ ~ + END + PATCH_IF exact BEGIN + REPLACE_TEXTUALLY EXACT_MATCH ~%old%~ ~%new%~ + END ELSE BEGIN + REPLACE_TEXTUALLY ~%old%~ ~%new%~ + END + END + END + LPF substitute_string STR_VAR input= ~%output%~ arguments= ~%arguments%~ RET output=output END + END ELSE BEGIN + SPRINT output ~%input%~ + END +END + +DEFINE_ACTION_FUNCTION substitute_string + INT_VAR exact=0 + STR_VAR input="" + arguments="" + RET output +BEGIN + OUTER_PATCH ~~ BEGIN + LPF substitute_string INT_VAR exact STR_VAR input arguments RET output END + END +END +///////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION set_string + STR_VAR input="" + arguments="" // list of oldstring=> newstring + RET output +BEGIN + SPRINT output ~%arguments%~ +END + + + + + +///////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +DEFINE_ACTION_FUNCTION action_append_strref // includes a space + STR_VAR input="" + arguments="" + RET output +BEGIN + <<<<<<<< temp_file + OUTER_SPRINT ~output~ ~%input% %arguments%~ + >>>>>>>> + COPY + temp_file ~%workspace%/temp_file2~ EVALUATE_BUFFER + REINCLUDE ~%workspace%/temp_file2~ +END + + +DEFINE_PATCH_FUNCTION append_strref // includes a space + STR_VAR input="" + arguments="" + RET output +BEGIN + INNER_ACTION BEGIN + LAF action_append_strref STR_VAR input= ~%input%~ arguments= ~%arguments%~ RET output=output END + END +END + + +///////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////// +//// Read in the entry in tlk_entry, append or (if new_first=1) prepend a new string, and write it back +///////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION append_to_tlk_entry + INT_VAR tlk_entry=~-1~ + new_first=0 + STR_VAR arguments="" + separator=" " +BEGIN + ACTION_GET_STRREF tlk_entry oldstring + ACTION_IF new_first=1 BEGIN + OUTER_SPRINT newstring ~%arguments%%separator%%oldstring%~ + END ELSE BEGIN + OUTER_SPRINT newstring ~%oldstring%%separator%%arguments%~ + END + STRING_SET_EVALUATE tlk_entry ~%newstring%~ +END + +///////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////// +//// Read in the entry in tlk_entry, run the substitutions defined by argument, and write it back +///////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION substitute_tlk_entry + INT_VAR tlk_entry=~-1~ + exact=0 + STR_VAR arguments="" +BEGIN + ACTION_GET_STRREF tlk_entry input + OUTER_INNER_PATCH ~~ BEGIN + LPF substitute_string INT_VAR exact STR_VAR input arguments RET output END + END + STRING_SET_EVALUATE tlk_entry ~%output%~ +END + +DEFINE_PATCH_FUNCTION substitute_tlk_entry + INT_VAR tlk_entry="-1" exact=0 + STR_VAR arguments="" +BEGIN + INNER_ACTION BEGIN + LAF substitute_tlk_entry INT_VAR exact tlk_entry STR_VAR arguments END + END +END + + +///////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////// +//// Read in the entry in tlk_entry, feed it to the action function 'argument', and write the output back +///////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION apply_function_to_tlk_entry + INT_VAR tlk_entry=~-1~ + STR_VAR arguments="" +BEGIN + ACTION_GET_STRREF tlk_entry input + LAF "%arguments%" STR_VAR input RET output END + STRING_SET_EVALUATE tlk_entry ~%output%~ +END + + +///////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////// +//// Add a string to dialog.tlk +///////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION add_to_tlk + STR_VAR string="" + RET strref +BEGIN + OUTER_INNER_PATCH ~~ BEGIN + INSERT_BYTES 0x0 4 + SAY 0x0 ~%string%~ + READ_LONG 0x0 strref + END +END + +///////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////// +//// Extract a subset of strings from a TRA file +///////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +DEFINE_ACTION_FUNCTION extract_from_tra + INT_VAR relativise_tra_in=0 + force_ref="-1" + STR_VAR + language_list="ENGLISH" + tra_in="" + tra_in_loc="" + tra_out="" + tra_out_loc="" + tra_entries="" +BEGIN + ACTION_TO_LOWER tra_out + OUTER_WHILE "%language_list%" STRING_COMPARE_CASE "" BEGIN + LAF return_first_entry STR_VAR list="%language_list%" RET language_list=list this_language=entry END + ACTION_IF relativise_tra_in BEGIN + OUTER_SPRINT tra_in "%this_language%.tra" + END + OUTER_SPRINT tra_entries_here "%tra_entries%" + PRINT "Loading translation %tra_in_loc%/%this_language%/%tra_in%" + + WITH_TRA "%tra_in_loc%/%this_language%/%tra_in%" BEGIN + ACTION_IF !FILE_EXISTS "%tra_out_loc%/%this_language%/%tra_out%" BEGIN + COPY ".../stratagems-inline/blank" "%tra_out_loc%/%this_language%/%tra_out%" + END + OUTER_WHILE "%tra_entries_here%" STRING_COMPARE "" BEGIN + LAF return_first_entry STR_VAR list="%tra_entries_here%" RET tra_entries_here=list entry END + ACTION_TRY + OUTER_SPRINT string (AT entry) + ACTION_IF force_ref>=0 BEGIN + APPEND_OUTER "%tra_out_loc%/%this_language%/%tra_out%" "%atsymbol%%force_ref% = ~%string%~" KEEP_CRLF + END ELSE BEGIN + APPEND_OUTER "%tra_out_loc%/%this_language%/%tra_out%" "%atsymbol%%entry% = ~%string%~" KEEP_CRLF + END + WITH DEFAULT + LAF warning STR_VAR warning="No translation for string %entry% in language %this_language%" END + END + END + END + END +END diff --git a/iwdification/sfo/general/lib_tools.tpa b/iwdification/sfo/general/lib_tools.tpa new file mode 100644 index 0000000..51ffc8e --- /dev/null +++ b/iwdification/sfo/general/lib_tools.tpa @@ -0,0 +1,1260 @@ +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// general warning message +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION warning + STR_VAR + warning="" + arguments="" + repeat="no" +BEGIN + OUTER_INNER_PATCH ~~ BEGIN + LPF warning STR_VAR warning arguments repeat END + END +END + +DEFINE_PATCH_FUNCTION warning + STR_VAR + warning="" + arguments="" + repeat="no" +BEGIN + PATCH_MATCH "%warning%%arguments%" WITH + "" null BEGIN END + DEFAULT + PATCH_PRINT ~%warning%%arguments%~ + LPF log_this STR_VAR file=sfo_warnings.txt input= ~%TP2_BASE_NAME% component %COMPONENT_NUMBER%: %warning%%arguments%~ repeat END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// include a string as a line of code (NB: you can't define variables this way, because they're in the scope of the function) +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +DEFINE_ACTION_FUNCTION reinclude_this + STR_VAR + input="" +BEGIN + <<<<<<<< temp_file + %input% + >>>>>>>> + ACTION_IF debug_variable=1 BEGIN + PRINT ~%input%~ + END + COPY - temp_file ~temp_file2~ EVALUATE_BUFFER + REINCLUDE ~temp_file2~ +END + + + +DEFINE_PATCH_FUNCTION reinclude_this + STR_VAR + input="" +BEGIN + INNER_ACTION BEGIN + <<<<<<<< temp_file + %input% + >>>>>>>> + COPY - temp_file ~temp_file2~ EVALUATE_BUFFER + END + PATCH_IF debug_variable=1 BEGIN + PATCH_PRINT ~%input%~ + END + PATCH_REINCLUDE ~temp_file2~ +END + +DEFINE_ACTION_FUNCTION action_reinclude_this STR_VAR input="" BEGIN + LAF reinclude_this STR_VAR input END +END + +DEFINE_PATCH_FUNCTION patch_reinclude_this STR_VAR input="" BEGIN + LPF reinclude_this STR_VAR input END +END + + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// take a string, strip any initial or trailing whitespace [recursive] +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION strip_spaces_from_string + STR_VAR string="" + RET string +BEGIN + PATCH_IF !(~%string%~ STRING_EQUAL ~~) BEGIN + PATCH_IF INDEX ("\( \|%MNL%\|%WNL%\|%LNL%\|%TAB%\)" ~%string%~)=0 BEGIN + INNER_PATCH_SAVE ~string~ ~%string%~ BEGIN DELETE_BYTES 0 1 END + LPF strip_spaces_from_string STR_VAR string RET string=string END + END + PATCH_IF !(~%string%~ STRING_EQUAL ~~)BEGIN + PATCH_IF RINDEX ("\( \|%MNL%\|%WNL%\|%LNL%\|%TAB%\)" ~%string%~)=(STRING_LENGTH ~%string%~ -1) BEGIN + INNER_PATCH_SAVE ~string~ ~%string%~ BEGIN DELETE_BYTES (BUFFER_LENGTH - 1) 1 END + LPF strip_spaces_from_string STR_VAR string RET string=string END + END + END + END +END + +DEFINE_ACTION_FUNCTION strip_spaces_from_string + STR_VAR string="" + RET string +BEGIN + OUTER_INNER_PATCH "" BEGIN + LPF strip_spaces_from_string STR_VAR string RET string=string END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// take a string, strip initial or trailing ~ and " +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION strip_quotes_from_string + STR_VAR string="" + RET string +BEGIN + SET string_length=STRING_LENGTH ~%string%~ + PATCH_MATCH string_length WITH 0 BEGIN + LPF warning STR_VAR warning="Warning: you just tried to remove quotes from an empty string. Deliberate?" END + END + DEFAULT + INNER_PATCH_SAVE string ~%string%~ BEGIN + SET lastloc=string_length - 1 + PATCH_FOR_EACH loc IN ~%lastloc%~ 0 BEGIN // must be this way around! + READ_ASCII 0 symbol (1) + PATCH_IF (~%symbol%~ STRING_EQUAL ~"~ OR ~%symbol%~ STRING_EQUAL "~") BEGIN + DELETE_BYTES loc 1 + END + END + END + END +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// as a patch, take as input a string and return its first letter and the rest of it +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION return_first_letter + STR_VAR input="" + RET firstletter + rest +BEGIN + PATCH_IF input STRING_COMPARE ~~ BEGIN + INNER_PATCH_SAVE rest ~%input%~ BEGIN + READ_ASCII 0x0 firstletter (1) + DELETE_BYTES 0x0 1 + END + END ELSE BEGIN + SPRINT firstletter ~~ + SPRINT rest ~~ + END +END + +DEFINE_ACTION_FUNCTION return_first_letter + STR_VAR input="" RET firstletter rest +BEGIN + OUTER_PATCH "" BEGIN + LPF return_first_letter STR_VAR input RET firstletter=firstletter rest=rest END + END +END + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// as a patch, take as input FUNCTION(VALUES) and return FUNCTION and VALUES +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION return_function_and_argument + STR_VAR input="" + RET function + argument +BEGIN + INNER_PATCH_SAVE ~input~ ~%input%~ BEGIN + REPLACE_TEXTUALLY ~)~ ~~ + END + LPF return_first_entry + STR_VAR list= ~%input%~ separator="(" + RET argument=list function=entry + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// sanity check for the arguments +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION edit_sanity_check + STR_VAR edits="" + editstring="" + task="the current task" +BEGIN + ACTION_IF !"%edits%" STRING_CONTAINS_REGEXP "=>" BEGIN + FAIL "The 'edits' variable for %task% is set to %edits%, which is illegal (contains =>). Probably you meant 'editstring' instead." + END + ACTION_IF "%editstring%" STRING_CONTAINS_REGEXP "=>" && "%editstring%" STRING_COMPARE "" BEGIN + FAIL "The 'editstring' variable for %task% is set to %editstring%, which is illegal (not a key=>value list). Probably you meant 'edits' instead." + END +END + +DEFINE_PATCH_FUNCTION edit_sanity_check + STR_VAR edits="" + editstring="" + task="the current task" +BEGIN + INNER_ACTION BEGIN + LAF edit_sanity_check STR_VAR edits editstring task END + END +END + +DEFINE_PATCH_FUNCTION key_value_sanity_check + INT_VAR is_key=1 + STR_VAR arguments="" +BEGIN + PATCH_IF ("%arguments%" STRING_CONTAINS_REGEXP "=>")=is_key && "%arguments%" STRING_COMPARE "" BEGIN + PATCH_IF is_key BEGIN + SPRINT censure "it should be a key" + END ELSE BEGIN + SPRINT censure "it should not be a key" + END + PATCH_FAIL "The variable for task is set to %arguments%, which is illegal: %censure%. (Check if you are entering inline data into a patch command, or vice versa.)" + END +END + +DEFINE_ACTION_FUNCTION key_value_sanity_check + INT_VAR is_key=1 + STR_VAR arguments="" +BEGIN + OUTER_INNER_PATCH "" BEGIN + LPF key_value_sanity_check INT_VAR is_key STR_VAR arguments END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// read or write the value of a field +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION get_field_value + INT_VAR loc=0 + length=0 + RET value +BEGIN + PATCH_MATCH length WITH + 1 + BEGIN + READ_BYTE loc value + END + 2 + BEGIN + READ_SHORT loc value + END + 4 + BEGIN + READ_LONG loc value + END + DEFAULT + PATCH_FAIL ~Trying to read %loc%, but %length% is unrecognised length~ + END +END + +DEFINE_PATCH_FUNCTION set_field_value + INT_VAR loc=0 + length=0 + value=0 + arguments=0 +BEGIN + PATCH_IF (arguments=0 && value!=0) BEGIN + SET arguments=value + END + PATCH_MATCH length WITH + 1 + BEGIN + WRITE_BYTE loc arguments + END + 2 + BEGIN + WRITE_SHORT loc arguments + END + 4 + BEGIN + WRITE_LONG loc arguments + END + DEFAULT + PATCH_FAIL "Trying to write %loc%, but %length% is unrecognised length" + END +END + + + +/* old version +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///// Check an ini value (case-insensitive) +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION check_ini + STR_VAR ini="" + RET value +BEGIN + TO_LOWER ini + PATCH_IF !VARIABLE_IS_SET $SFO_reserved_ini_hash(~%ini%~) BEGIN + SPRINT value 0 + END ELSE BEGIN + SPRINT value $SFO_reserved_ini_hash(~%ini%~) + END +END + +DEFINE_ACTION_FUNCTION check_ini + STR_VAR ini="" + RET value +BEGIN + OUTER_PATCH "" BEGIN + LPF check_ini STR_VAR ini RET value END + END +END + +*/ + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// get a local directory +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION get_directory + STR_VAR location="" + locbase="" + locabs="" + RET directory +BEGIN +PATCH_IF "%locabs%" STRING_COMPARE "" BEGIN + SPRINT directory "%locabs%" +END ELSE BEGIN + SPRINT directory ~%MOD_FOLDER%~ + PATCH_IF "%locbase%" STRING_EQUAL "" BEGIN + PATCH_FOR_EACH loc IN component_loc local_loc location BEGIN + PATCH_IF ~%%loc%%~ STRING_COMPARE ~~ BEGIN + SPRINT temp EVALUATE_BUFFER "%%loc%%" + SPRINT ~directory~ EVALUATE_BUFFER ~%directory%/%%loc%%~ + END + END + END ELSE BEGIN + PATCH_IF "%location%" STRING_EQUAL "" BEGIN + SPRINT directory "%directory%/%locbase%" + END ELSE BEGIN + SPRINT directory "%directory%/%locbase%/%location%" + END + END +END +END + +DEFINE_ACTION_FUNCTION get_directory + STR_VAR location="" locbase="" locabs="" + RET directory +BEGIN + OUTER_INNER_PATCH ~~ BEGIN + LPF get_directory STR_VAR location locbase locabs RET directory END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// include all the listed files +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION include + STR_VAR file="" + files="" + location="" + locbase="" + locabs="" +BEGIN + ACTION_IF ~%file%~ STRING_EQUAL_CASE ~~ BEGIN + ACTION_IF ~%files%~ STRING_EQUAL_CASE ~~ BEGIN + LAF warning STR_VAR warning="You've called an include with no argument" END + END ELSE BEGIN + OUTER_SPRINT file ~%files%~ + END + END + PRINT ~Including file(s) %file%~ + LAF get_directory STR_VAR location locbase locabs RET file_loc=directory END + OUTER_WHILE ~%file%~ STRING_COMPARE ~~ BEGIN + LAF return_first_entry STR_VAR list= ~%file%~ RET entry=entry file=list END + COPY ~%file_loc%/%entry%~ ~%workspace%/%entry%~ + LPF define_make_patch END + LPF define_push END + REINCLUDE ~%workspace%/%entry%~ + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// include all the listed files with a .tpa suffix, assume each contains a function with the same name as itself, and run that function +///////////// +///////////// when doing so, implement the MAKE_PATCH and PUSH pseudocode +///////////// +///////////// If it's the outermost "run" being called, also make a label, called dw#[func] +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION run + STR_VAR file="" + files="" + location="" + locbase="" + locabs="" + version="" + tra="" +BEGIN + ACTION_IF !VARIABLE_IS_SET SFO_reserved_outer_run BEGIN + OUTER_SET SFO_reserved_outer_run=1 + OUTER_SET make_labels=1 + OUTER_SPRINT component_loc "%location%" + OUTER_SPRINT location "" + ACTION_IF "%tra%" STRING_EQUAL "" BEGIN + OUTER_SPRINT tra "%component_loc%" + END + END ELSE BEGIN + OUTER_SET make_labels=0 + END + + ACTION_IF ~%file%~ STRING_EQUAL_CASE ~~ BEGIN + ACTION_IF ~%files%~ STRING_EQUAL_CASE ~~ BEGIN + LAF warning STR_VAR warning="You've called a 'run' with no argument" END + END ELSE BEGIN + OUTER_SPRINT file ~%files%~ + END + END + PRINT ~Including and running function(s) %file%~ + LAF get_directory STR_VAR location locbase locabs RET file_loc=directory END + OUTER_WHILE ~%file%~ STRING_COMPARE ~~ BEGIN + LAF return_first_entry STR_VAR list= ~%file%~ RET entry=entry file=list END + COPY ~%file_loc%/%entry%.tpa~ ~%workspace%/%entry%.tpa~ + LPF define_make_patch END + LPF define_push END + INCLUDE ~%workspace%/%entry%.tpa~ + ACTION_IF make_labels BEGIN + LAF make_label STR_VAR label="dw#%entry%" END + END + ACTION_IF debug_variable=2 BEGIN + PRINT "about to run %entry%, with tra %scs_tra_loc%/english/%tra%.tra %scs_tra_loc%/%LANGUAGE%/%tra%.tra" + END + WITH_TRA "%scs_tra_loc%/english/%tra%.tra" "%scs_tra_loc%/%LANGUAGE%/%tra%.tra" BEGIN + ACTION_IF "%version%" STRING_EQUAL "" BEGIN + LAF ~%entry%~ END + END ELSE BEGIN + LAF ~%entry%~ STR_VAR version= ~%version%~ END + END + END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/// generic logger +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION log_this + STR_VAR file="" + input="" + repeat="yes" + locabs="%data_loc%" + location="" + locbase="" +BEGIN + ACTION_IF debug_variable=2 BEGIN + PRINT ~trying to append %input% to %file%; location defined by locabs=%locabs% location=%location% locbase=%locbase%~ + END + LAF get_directory STR_VAR location locabs locbase RET directory END + ACTION_IF !FILE_EXISTS ~%directory%/%file%~ BEGIN + COPY ~.../stratagems-inline/blank~ ~%directory%/%file%~ + END + ACTION_IF (~%repeat%~ STRING_COMPARE_CASE ~no~) || !FILE_CONTAINS_EVALUATED ("%directory%/%file%" "%input%\($\|%WNL%\|%MNL%\|%LNL\)")BEGIN + APPEND_OUTER ~%directory%/%file%~ ~%input%~ + END +END + +DEFINE_PATCH_FUNCTION log_this + STR_VAR file="" + input="" + repeat="yes" + locabs="%data_loc%" + location="" + locbase="" +BEGIN + INNER_ACTION BEGIN + LAF log_this STR_VAR file input repeat locbase locabs location END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Make a label +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION make_label + STR_VAR label="" +BEGIN + LAF get_label_loc RET location END + COPY ~.../stratagems-inline/blank~ ~%location%/%label%.mrk~ +END + +DEFINE_ACTION_FUNCTION get_label_loc +RET location +BEGIN + LAF check_ini INT_VAR silent=1 STR_VAR ini=label_location RET loc=value END + ACTION_IF loc BEGIN + OUTER_SPRINT location ~%loc%~ + END ELSE BEGIN + OUTER_SPRINT location ~%marker_loc%~ + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Check a label +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION check_label + STR_VAR label="" + RET value +BEGIN + LAF get_label_loc RET location END + ACTION_IF FILE_EXISTS ~%location%/%label%.mrk~ BEGIN + OUTER_SET value=1 + END ELSE BEGIN + OUTER_SET value=0 + END +END + +DEFINE_PATCH_FUNCTION check_label + STR_VAR label="" + RET value +BEGIN + INNER_ACTION BEGIN + LAF check_label STR_VAR label RET value END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Check if a LABELed component of a mod (by default, this mod) is installed +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION check_component + STR_VAR label="" + mod="%MOD_FOLDER%" + RET value +BEGIN + OUTER_SET value=MOD_IS_INSTALLED "%mod%.tp2" (ID_OF_LABEL "%mod%.tp2" "%label%") +END + +DEFINE_PATCH_FUNCTION check_component + STR_VAR label="" + mod="" + RET value +BEGIN + INNER_ACTION BEGIN + LAF check_component STR_VAR label RET value END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Take a LONG and reverse the first and last SHORT +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION reverse_long + INT_VAR input=0 + RET output +BEGIN + INNER_PATCH ~~ BEGIN + INSERT_BYTES 0x0 0x4 + WRITE_LONG 0x0 input + READ_SHORT 0x0 first + READ_SHORT 0x2 second + WRITE_SHORT 0x0 second + WRITE_SHORT 0x2 first + READ_LONG 0x0 output + END +END + +DEFINE_ACTION_FUNCTION reverse_long + INT_VAR input=0 + RET output +BEGIN + OUTER_PATCH "" BEGIN + LPF reverse_long INT_VAR input RET output=output END + END +END + + + + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// get an RGB LONG +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION color + INT_VAR red=0 + green=0 + blue=0 + RET color +BEGIN + + OUTER_INNER_PATCH ~~ BEGIN + INSERT_BYTES 0x0 4 + WRITE_BYTE 0x1 red + WRITE_BYTE 0x2 green + WRITE_BYTE 0x3 blue + READ_LONG 0x0 color + END +END + +DEFINE_PATCH_FUNCTION color + INT_VAR red=0 + green=0 + blue=0 + RET color +BEGIN + INNER_ACTION BEGIN + LAF color INT_VAR red green blue RET color END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// convert into hex +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + + +DEFINE_PATCH_FUNCTION hex_digit // undocumented (helper only) + INT_VAR digit=0 + RET out +BEGIN + PATCH_IF (digit>=16 || digit<0) BEGIN + INNER_ACTION BEGIN + FAIL "not a digit" + END + END + PATCH_CLEAR_ARRAY hex_digit_map + DEFINE_ASSOCIATIVE_ARRAY hex_digit_map BEGIN + 15=>f + 14=>e + 13=>d + 12=>c + 11=>b + 10=>a + END + PATCH_IF VARIABLE_IS_SET $hex_digit_map("%digit%") BEGIN + SPRINT out $hex_digit_map("%digit%") + END ELSE BEGIN + SPRINT out "%digit%" + END +END + +DEFINE_PATCH_FUNCTION hexify + INT_VAR in=0 + pad_length=0 + STR_VAR out="" + RET out +BEGIN + SET div=in / 16 + SET digit=in - (div * 16) + LPF hex_digit INT_VAR digit RET char=out END + SPRINT out "%char%%out%" + PATCH_IF div>0 BEGIN + LPF hexify INT_VAR in= "%div%" pad_length STR_VAR out RET out=out END + END ELSE BEGIN + WHILE pad_length>STRING_LENGTH "%out%" BEGIN + SPRINT out "0%out%" + END + SPRINT out "0x%out%" + + + END +END + +DEFINE_ACTION_FUNCTION hexify + INT_VAR in=0 + pad_length=0 + RET out +BEGIN + OUTER_INNER_PATCH "" BEGIN + LPF hexify INT_VAR in pad_length RET out=out END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// guarantee a string-representing number is in hex form with lowercase x, lower case digits +///////////// +///////////// ie 10=> 0xa +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION ensure_hex + INT_VAR pad_length=0 + STR_VAR in="" + RET out +BEGIN + SNPRINT 2 check "%in%" + PATCH_IF "%check%" STRING_EQUAL_CASE "0x" BEGIN + PATCH_IF pad_length>0 BEGIN + INNER_PATCH_SAVE in "%in%" BEGIN + DELETE_BYTES 0x0 2 + END + WHILE pad_length>STRING_LENGTH "%in%" BEGIN + SPRINT in "0%in%" + END + SPRINT in "0x%in%" + END + TO_LOWER in + SPRINT out "%in%" + END ELSE BEGIN + LPF hexify INT_VAR in pad_length RET out END + END +END + +DEFINE_ACTION_FUNCTION ensure_hex + INT_VAR pad_length=0 + STR_VAR in="" + RET out +BEGIN + OUTER_PATCH "" BEGIN + LPF ensure_hex INT_VAR pad_length STR_VAR in RET out END + END +END + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//// Iterate a counter; squeak when it's a multiple of 100 +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION count_hundreds + INT_VAR counter=0 + hundreds=0 + STR_VAR task="files analysed" + + RET counter hundreds +BEGIN + PATCH_SILENT + PATCH_IF counter=100 BEGIN + SET hundreds +=1 + SET counter=0 + PATCH_PRINT "%hundreds%00 %task%" + PATCH_SILENT + END ELSE BEGIN + SET counter +=1 + END +END + +DEFINE_ACTION_FUNCTION count_hundreds + INT_VAR counter=0 + hundreds=0 + STR_VAR task="files analysed" + + RET counter hundreds +BEGIN + OUTER_INNER_PATCH "" BEGIN + LPF count_hundreds INT_VAR counter hundreds STR_VAR task RET counter hundreds END + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///// Consolidate table +///// +///// Take a table with lots of key=>value pairs +///// Rewrite it as "key=>value list" +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION consolidate_table STR_VAR in="" out="" locabs="%workspace%" location="" locbase="" BEGIN + LAF get_directory STR_VAR locabs locbase location RET directory END + COPY - "%directory%/%in%" "%workspace%" + READ_2DA_ENTRIES_NOW in_entries 2 + FOR (i=0;ival BEGIN + INSERT_2DA_ROW counter 0 "%key% %val%" + SET counter +=1 + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///// Process table +///// +///// Take a table with a first line of column names and entries below. For each line, read the entries into variables with the +///// given names and feed them as STR_VAR entries to the ACTION_FUNCTION "function" +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION process_table + INT_VAR cumulative=0 + STR_VAR table="" + location="" + locbase="" + locabs="" + inline="no" + function="" + ext_args="" + RET value +BEGIN + ACTION_IF "%inline%" STRING_COMPARE_CASE yes BEGIN + LAF get_directory STR_VAR location locbase locabs RET directory END + ACTION_IF !FILE_EXISTS "%directory%/%table%" BEGIN + FAIL "Tried to process table %table% but it doesn't exist at %directory%" + END + END ELSE BEGIN + OUTER_SPRINT directory ".../stratagems-inline" + END + COPY - "%directory%/%table%" "%workspace%" + REPLACE_TEXTUALLY "//.*" "" + COUNT_2DA_COLS colcount + COUNT_2DA_ROWS colcount rowcount + SPRINT value "" + FOR (i=1;imaximum BEGIN + LAF warning STR_VAR warning="Failed to add IDS entry %to_add% to idsfile %idsfile%" END + OUTER_SET idsnum=0 - 1 + END ELSE BEGIN + OUTER_SET idsnum=IDS_OF_SYMBOL ("%idsfile%" "%to_add%") + ACTION_IF idsnum<0 BEGIN + OUTER_PATCH "" BEGIN + LOOKUP_IDS_SYMBOL_OF_INT test "%idsfile%" minimum + END + ACTION_IF "%test%" STRING_EQUAL "%minimum%" BEGIN + APPEND "%idsfile%.ids" "%minimum% %to_add%" + OUTER_SET idsnum=minimum + END ELSE BEGIN + OUTER_SET minimum +=1 + LAF get_or_add_to_IDS INT_VAR minimum maximum STR_VAR to_add idsfile RET idsnum END + END + END + END +END + +DEFINE_PATCH_FUNCTION get_or_add_to_IDS + INT_VAR minimum=1 + maximum=99999 + STR_VAR to_add="" + idsfile="" + RET idsnum +BEGIN + INNER_ACTION BEGIN + LAF get_or_add_to_IDS INT_VAR minimum maximum STR_VAR to_add idsfile RET idsnum END + END +END + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////// quicksort +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION quicksort + STR_VAR list="" + RET list +BEGIN + ACTION_IF "%list%" STRING_COMPARE "" BEGIN + LAF return_first_entry STR_VAR list RET entry list END + OUTER_SPRINT left "" + OUTER_SPRINT right "" + OUTER_WHILE "%list%" STRING_COMPARE "" BEGIN + LAF return_first_entry STR_VAR list RET cmp=entry list END + ACTION_IF "%cmp%" STRING_COMPARE "%entry%" >= 0 BEGIN + LAF push STR_VAR head="%cmp%" tail="%right%" RET right=list END + END ELSE BEGIN + LAF push STR_VAR head="%cmp%" tail="%left%" RET left=list END + END + END + LAF quicksort STR_VAR list="%left%" RET left=list END + LAF quicksort STR_VAR list="%right%" RET right=list END + LAF push STR_VAR head="%entry%" tail="" RET list END + LAF join STR_VAR list1="%left%" list2="%list%" RET list END + LAF join STR_VAR list1="%list%" list2="%right%" RET list END + END +END + +DEFINE_ACTION_FUNCTION quicksort_numerical + STR_VAR list="" + RET list +BEGIN + ACTION_IF "%list%" STRING_COMPARE "" BEGIN + LAF return_first_entry STR_VAR list RET entry list END + OUTER_SPRINT left "" + OUTER_SPRINT right "" + OUTER_WHILE "%list%" STRING_COMPARE "" BEGIN + LAF return_first_entry STR_VAR list RET cmp=entry list END + ACTION_IF cmp>entry BEGIN + LAF push STR_VAR head="%cmp%" tail="%right%" RET right=list END + END ELSE BEGIN + LAF push STR_VAR head="%cmp%" tail="%left%" RET left=list END + END + END + LAF quicksort_numerical STR_VAR list="%left%" RET left=list END + LAF quicksort_numerical STR_VAR list="%right%" RET right=list END + LAF push STR_VAR head="%entry%" tail="" RET list END + LAF join STR_VAR list1="%left%" list2="%list%" RET list END + LAF join STR_VAR list1="%list%" list2="%right%" RET list END + END +END + +DEFINE_PATCH_FUNCTION quicksort + STR_VAR list="" + RET list +BEGIN + INNER_ACTION BEGIN + LAF quicksort STR_VAR list RET list END + END +END + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////// debugger +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION speed_debug + INT_VAR var=4 + STR_VAR string="Unspecified debug check" +BEGIN + ACTION_IF debug_variable=var BEGIN + PRINT "%string%" + ACTION_READLN blook + END +END + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////// apply a function to all files of a certain type (for mod self-editing, not for +//////////// live release) +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// + + +DEFINE_ACTION_FUNCTION recurse_through_files + STR_VAR base_dir="" + allowed_ext="" + function="" + arguments="" +BEGIN + ACTION_TO_UPPER allowed_ext + OUTER_WHILE "%allowed_ext%" STRING_COMPARE "" BEGIN + LAF return_first_entry STR_VAR list="%allowed_ext%" RET entry allowed_ext=list END + OUTER_SPRINT $ext_array("%entry%") "" + END + ACTION_BASH_FOR "%base_dir%" ".*" BEGIN + OUTER_SPRINT ext_here "%BASH_FOR_EXT%" + ACTION_TO_UPPER ext_here + ACTION_IF VARIABLE_IS_SET $ext_array("%ext_here%") BEGIN + LAF "%function%" STR_VAR file_res="%BASH_FOR_RES%" file_ext="%BASH_FOR_EXT%" file_dir="%base_dir%" arguments END + END + END + ACTION_CLEAR_ARRAY directories + GET_DIRECTORY_ARRAY directories "%base_dir%" "[a-z0-9-_]+" + ACTION_PHP_EACH directories AS int=>dir BEGIN + LAF recurse_through_files STR_VAR base_dir="%dir%" allowed_ext function arguments END + END +END + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////// immutable version of HANDLE_CHARSETS +//////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION handle_charsets_immutably + INT_VAR force_tra_rebuild=0 + STR_VAR tra_base=lang + base_language=english + iconv_path="" + RET scs_tra_loc +BEGIN + // do conversions (ee only) + ACTION_IF enhanced_edition BEGIN + OUTER_INNER_PATCH_SAVE versionstring "%MOD_VERSION%" BEGIN + REPLACE_TEXTUALLY " " "" + END + OUTER_SPRINT scs_tra_loc "%ext_lang_loc%" + OUTER_SPRINT marker_name "%marker_loc%/dw#%MOD_FOLDER%_%versionstring%_languages_installed.mrk" + ACTION_IF (!FILE_EXISTS "%marker_name%" || force_tra_rebuild) BEGIN + LAF HANDLE_CHARSETS INT_VAR infer_charsets=1 STR_VAR tra_path="%MOD_FOLDER%/%tra_base%" out_path="%scs_tra_loc%" END + END + END ELSE BEGIN + // on non-EE, just set the tra loc + OUTER_SPRINT scs_tra_loc "%MOD_FOLDER%/%tra_base%" + END +END + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// find a unique filename +///////////// +///////////// there is a version that ships with WEIDU that does this, but it glitched for me +///////////// +///////////// this is limited in speed, don't use it to make thousands of files! +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +DEFINE_ACTION_FUNCTION find_unique_filename + INT_VAR to_try=0 + STR_VAR prefix="dw_" + extension="" + RET filename +BEGIN + OUTER_SET suffix_length = 7 - STRING_LENGTH "%prefix%" + OUTER_SPRINT suffix "%to_try%" + OUTER_WHILE STRING_LENGTH "%suffix%" < suffix_length BEGIN + OUTER_SPRINT suffix "0%suffix%" + END + OUTER_SPRINT filename "%prefix%%suffix%" + ACTION_IF FILE_EXISTS_IN_GAME "%filename%.%extension%" BEGIN + OUTER_SET to_try +=1 + LAF find_unique_filename INT_VAR to_try STR_VAR prefix extension RET filename END + END +END + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////// given an index in a file, a left character, and a right character, extract the +//////////// index number of the left character and the matching right character +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION find_parenthesis_range + STR_VAR left="{" + right="}" + index=0 + RET start + end +BEGIN + SET next_right="-1" + SET start=INDEX_BUFFER("%left%" index) + PATCH_IF start>=0 BEGIN + SET indent=1 + SET loc=start + 1 + WHILE indent>0 BEGIN + SET next_left = INDEX_BUFFER ("%left%" loc) + SET next_right = INDEX_BUFFER ("%right%" loc) + PATCH_IF next_right<0 BEGIN + SET indent=0 + LPF warning STR_VAR warning="Failed to properly extract next %left%---%right% section from file %SOURCE_RES%, starting at %index%" END + END ELSE + PATCH_IF next_left<0 BEGIN + SET indent -=1 + SET loc=next_right + 1 + END ELSE + PATCH_IF (next_left=0) BEGIN + SET indent +=1 + SET loc=next_left + 1 + END ELSE BEGIN + SET indent -=1 + SET loc=next_right + 1 + END + END + SET end=next_right + END +END + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////// given a 2da with variable numbers of entries, read the file in as an array +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_PATCH_FUNCTION read_variable_array + RET_ARRAY array_data +BEGIN + CLEAR_ARRAY array_data + INSERT_BYTES 0x0 2 + WRITE_ASCIIE 0x0 "%WNL%" + REPLACE_EVALUATE "\(%WNL%\|%LNL%\|%MNL%\)\([^\(%WNL%\|%LNL%\|%MNL%\)]*\)" BEGIN + INNER_PATCH "%MATCH2%" BEGIN + REPLACE_TEXTUALLY "\(%TAB%\| \)+" " " + REPLACE_EVALUATE "^ *\([^ ]\)* +\([^ ].*\)" BEGIN + + SPRINT $array_data("%MATCH1%") "%MATCH2%" + END + "" + END + END + "" +END + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////// given a 2da, read in two columns as a hash +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION read_in_2da + INT_VAR lookup_column=0 + data_column=1 + first_row=0 + STR_VAR file="" + RET_ARRAY array_data +BEGIN + COPY_EXISTING "%file%.2da" "%workspace%" + COUNT_2DA_COLS colcount + READ_2DA_ENTRIES_NOW 2da_data colcount + FOR (i=first_row;i<2da_data;i+=1) BEGIN + READ_2DA_ENTRY_FORMER 2da_data i lookup_column var + READ_2DA_ENTRY_FORMER 2da_data i data_column val + SPRINT $array_data("%var%") "%val%" + END + BUT_ONLY +END + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////// given a 1:1 function (of argument->value type) with domain the keys of an array, sort that array alphabetically +//////////// by the values of the function +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// + +DEFINE_ACTION_FUNCTION sort_array_by_function + STR_VAR array="" + function="" + RET_ARRAY sorted_array +BEGIN + ACTION_CLEAR_ARRAY sorting_array + OUTER_SET uniqueness_counter=0 + ACTION_PHP_EACH "%array%" AS arguments=>discard BEGIN + LAF "%function%" STR_VAR arguments RET value END + OUTER_SPRINT value "%value%%uniqueness_counter%" + OUTER_SPRINT $sorting_array("%value%") "%arguments%" + OUTER_SET ++uniqueness_counter + END + ACTION_SORT_ARRAY_INDICES sorting_array LEXICOGRAPHICALLY + ACTION_CLEAR_ARRAY sorted_array + ACTION_PHP_EACH sorting_array AS discard=>key BEGIN + OUTER_SPRINT $sorted_array("%key%") $"%array%"("%key%") + END + +END diff --git a/iwdification/sfo/install_sfo.tpa b/iwdification/sfo/install_sfo.tpa new file mode 100644 index 0000000..7632f6a --- /dev/null +++ b/iwdification/sfo/install_sfo.tpa @@ -0,0 +1,491 @@ +// NB: as of SCS v33.5 SFO needs the ini system to have been installed already (from lib_ini) + +ACTION_IF !VARIABLE_IS_SET sfo_installed BEGIN + + OUTER_SET sfo_installed=1 + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Sanity check for AUTO_EVAL_STRINGS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + OUTER_SPRINT var testers + OUTER_SPRINT players var + ACTION_IF !"%%players%%" STRING_EQUAL testers BEGIN + FAIL "AUTO_EVAL_STRINGS is not set (you need to include it in your tp2 preamble to use SFO)" + END + + + + ////////////////////////////////////////////////////////////// + /// set the default variables if they're not set already + ////////////////////////////////////////////////////////////// + + ACTION_IF !VARIABLE_IS_SET external_loc BEGIN + OUTER_SPRINT external_loc weidu_external + END + + ACTION_IF !VARIABLE_IS_SET tra_base BEGIN + OUTER_SPRINT tra_base lang + END + + ACTION_IF !VARIABLE_IS_SET rel_iconv_path BEGIN + OUTER_SPRINT rel_iconv_path "lang/iconv" + END + + ACTION_IF !VARIABLE_IS_SET base_language BEGIN + OUTER_SPRINT base_language english + END + + ////////////////////////////////////////////////////////////// + /// make the external folders + ////////////////////////////////////////////////////////////// + + MKDIR "%external_loc%" + MKDIR "%external_loc%/workspace" + MKDIR "%external_loc%/workspace/ssl_out" + MKDIR "%external_loc%/data/%MOD_FOLDER%" + MKDIR "%external_loc%/markers" + MKDIR "%external_loc%/lang" + MKDIR "%external_loc%/lang/%MOD_FOLDER%" + + ACTION_IF !FILE_EXISTS "%external_loc%/readme.txt" BEGIN + COPY + "%MOD_FOLDER%/lib/resource/weidu_external_readme.txt" "%external_loc%/readme.txt" + END + + ////////////////////////////////////////////////////////////// + /// Set variables for the external locations + ////////////////////////////////////////////////////////////// + + OUTER_SPRINT workspace "%external_loc%/workspace" + OUTER_SPRINT data_loc_root "%external_loc%/data" + OUTER_SPRINT data_loc "%external_loc%/data/%MOD_FOLDER%" + OUTER_SPRINT marker_loc "%external_loc%/markers" + OUTER_SPRINT ext_lang_loc "%external_loc%/lang/%MOD_FOLDER%" + + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Set default values of control parameters +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + ACTION_IF !VARIABLE_IS_SET ssl_loc BEGIN + OUTER_SPRINT ssl_loc "ssl" + END + ACTION_IF !VARIABLE_IS_SET sfo_loc BEGIN + OUTER_SPRINT sfo_loc "sfo" + END +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Get the debug variable from ini; run silent if it's set to zero +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +LAF check_ini STR_VAR ini="debug_variable" RET debug_variable=value END +ACTION_IF debug_variable=0 BEGIN SILENT END + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Set defaults for component_loc and local_loc +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + OUTER_SPRINT ~component_loc~ ~~ + OUTER_SPRINT ~local_loc~ ~~ + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////// Define some symbols +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +OUTER_SPRINT ~percentage~ ~%~ +OUTER_SPRINT ~atsymbol~ ~@~ +OUTER_SPRINT ~tilde~ "~" +OUTER_SPRINT ~minus_one~ "-1" +OUTER_SPRINT ~arrow~ ~=>~ + +<<<<<<<< .../stratagems-inline/blank +>>>>>>>> + +OUTER_SPRINT former "0" +ACTION_FOR_EACH val IN z y x w v u t s r q p o n m l k j i h g f e d c b a 9 8 7 6 5 4 3 2 1 0 BEGIN + OUTER_SPRINT $alphanumeric_next("%val%") "%former%" + ACTION_TO_UPPER val + ACTION_TO_UPPER former + OUTER_SPRINT $alphanumeric_next("%val%") "%former%" + OUTER_SPRINT former "%val%" +END + +/////////////////////////////////////////////////// +// check what install we're running on +/////////////////////////////////////////////////// + + ACTION_IF debug_variable=3 BEGIN + PRINT "checking for game type: press a key to continue" + ACTION_READLN blook + SILENT + END + + OUTER_SET enhanced_edition = ( GAME_IS ~bgee bg2ee eet iwdee~ ? 1 : 0) + OUTER_SET is_bg1 = ( GAME_IS ~bgee tutu tutu_totsc bgt eet~ ? 1 : 0) + OUTER_SET is_bg2 = ( GAME_IS ~tutu tutu_totsc bgee iwdee~ ? 0 : 1) + OUTER_SET is_iwd = ( GAME_IS iwdee ? 1 : 0) + OUTER_SET is_tutu = ( GAME_IS ~tutu tutu_totsc~ ? 1 : 0) + OUTER_SET is_eet = ( GAME_IS ~eet~ ? 1 : 0) + + ACTION_IF !VARIABLE_IS_SET tutu_var BEGIN + ACTION_IF is_tutu BEGIN + OUTER_SPRINT tutu_var "_" + END ELSE BEGIN + OUTER_SPRINT tutu_var "" + END + END + + ACTION_IF GAME_IS "eet" BEGIN + OUTER_SPRINT eet_var "_" + END ELSE BEGIN + OUTER_SPRINT eet_var "" + END + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// a few resource fixes +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// correct missing section in kensai clab file +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + ACTION_IF debug_variable=3 BEGIN + PRINT "Fixing KENSAI: press a key to continue" + ACTION_READLN blook + SILENT + END + +COPY_EXISTING clabfi04.2da override + // diagnostic: can we read entry 40 from the second row with at least 10 entries? + PATCH_SILENT + PATCH_TRY + READ_2DA_ENTRY 1 40 10 blah + WITH DEFAULT + SET_2DA_ENTRY 1 39 40 "**** ****" + PRETTY_PRINT_2DA + END +BUT_ONLY + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Some IDS entries are present on some but not all versions of the game +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + + ACTION_IF debug_variable=3 BEGIN + PRINT "systematising ids files: press a key to continue" + ACTION_READLN blook + SILENT + END + +ACTION_IF !FILE_EXISTS "override/soundoff.ids" BEGIN + COPY_EXISTING soundoff.ids override +END + +ACTION_DEFINE_ASSOCIATIVE_ARRAY soundoff_ids_missing BEGIN + 9=>BATTLE_CRY + 10=>BATTLE_CRY2 + 11=>BATTLE_CRY3 + 12=>BATTLE_CRY4 + 13=>BATTLE_CRY5 +END + +ACTION_PHP_EACH soundoff_ids_missing AS code=>name BEGIN + ACTION_IF !FILE_CONTAINS_EVALUATED ("override/soundoff.ids" "%code%[ %TAB%]+%name%") BEGIN + APPEND "soundoff.ids" "%code% %name%" + END +END + +ACTION_IF enhanced_edition BEGIN + ACTION_DEFINE_ASSOCIATIVE_ARRAY object_ids_missing BEGIN + 94 => LastKilled + 95 => NearestAllyOf + 96 => SecondNearestAllyOf + 97 => ThirdNearestAllyOf + 98 => FourthNearestAllyOf + 99 => FifthNearestAllyOf + 100 => SixthNearestAllyOf + 101 => SeventhNearestAllyOf + 102 => EighthNearestAllyOf + 103 => NinthNearestAllyOf + 104 => TenthNearestAllyOf + 105 => FarthestEnemyOf + 106 => SecondFarthestEnemyOf + 107 => ThirdFarthestEnemyOf + 108 => FourthFarthestEnemyOf + 109 => FifthFarthestEnemyOf + 110 => SixthFarthestEnemyOf + 111 => SeventhFarthestEnemyOf + 112 => EighthFarthestEnemyOf + 113 => NinthFarthestEnemyOf + 114 => TenthFarthestEnemyOf + END + ACTION_PHP_EACH object_ids_missing AS code=>name BEGIN + ACTION_IF !FILE_CONTAINS_EVALUATED ("override/object.ids" "%code%[ %TAB%]+%name%") BEGIN + APPEND "object.ids" "%code% %name%" + END + END + +END + +ACTION_IF !FILE_EXISTS "override/spell.ids" BEGIN + COPY_EXISTING spell.ids override +END + +ACTION_DEFINE_ASSOCIATIVE_ARRAY spell_ids_missing BEGIN + 4611=>DRUID_SHAPESHIFT_BROWNBEAR + 4612=>DRUID_SHAPESHIFT_WOLF + 4613=>DRUID_SHAPESHIFT_BLACKBEAR + 4632=>AVENGER_SHAPESHIFT_SWORDSPIDER + 4633=>AVENGER_SHAPESHIFT_BABYWYVERN + 4634=>AVENGER_SHAPESHIFT_FIRESALAMANDER + 2490=>WIZARD_POLYMORPH_NATURAL_FORM + 2491=>DRUID_SHAPESHIFT_NATURAL_FORM + 2493=>WIZARD_POLYMORPH_FLIND + 2494=>WIZARD_POLYMORPH_OGRE + 2495=>WIZARD_POLYMORPH_SPIDER + 2496=>WIZARD_POLYMORPH_MUSTARD_JELLY + 2497=>WIZARD_POLYMORPH_BROWN_BEAR + 2498=>WIZARD_POLYMORPH_BLACK_BEAR + 2499=>WIZARD_POLYMORPH_WOLF + 4732=>HELM_TRUE_SIGHT + 3101=>INNATE_CURE_LIGHT_WOUNDS + 3102=>INNATE_SLOW_POISON + 3103=>INNATE_DRAW_UPON_HOLY_MIGHT + 3104=>INNATE_LARLOCHS_MINOR_DRAIN + 3105=>INNATE_HORROR + 3106=>INNATE_VAMPIRIC_TOUCH + 4212=>PALADIN_DETECT_EVIL + 4213=>PALADIN_PROTECTION_FROM_EVIL + 4721=>TALOS_STORMSHIELD + 4722=>TALOS_LIGHTNING_BOLT + 2921=>WIZARD_IMPROVED_ALACRITY + 2222=>WIZARD_CHAOS_SHIELD + 2723=>WIZARD_IMPROVED_CHAOS_SHIELD + 1718=>CLERIC_SYMBOL_STUN + 1719=>CLERIC_SYMBOL_DEATH + 3996=>TANARI_DEATH_GAZE + 3997=>TANARI_VAMPIRIC_TOUCH + 3998=>TANARI_SILENCE + 3999=>TANARI_PARALYZE + 3701=>DEATHKNIGHT_FIREBALL + 2931=>SUCCUBUS_TELEPORT + 2985=>RED_HOLY_MIGHT + 3890=>DEMON_FEAR +END +ACTION_IF GAME_IS iwdee BEGIN + ACTION_DEFINE_ASSOCIATIVE_ARRAY spell_ids_missing BEGIN + 1716=>CLERIC_SYMBOL_HOPELESSNESS + 1714=>CLERIC_SYMBOL_PAIN + 3137=>BEHOLDER_ANTIMAGIC_RAY + 3141=>BEHOLDER_CHARM_PERSON + 3142=>BEHOLDER_SLEEP + 3143=>BEHOLDER_FLESH_TO_STONE + 3144=>BEHOLDER_DISINTEGRATE + 3145=>BEHOLDER_FEAR + 3146=>BEHOLDER_SLOW + 3147=>BEHOLDER_CAUSE_SERIOUS_WOUNDS + 3148=>BEHOLDER_DEATH_RAY + END +END +ACTION_PHP_EACH spell_ids_missing AS code=>name BEGIN + ACTION_IF !FILE_CONTAINS_EVALUATED ("override/spell.ids" "%code%[ %TAB%]+%name%") BEGIN + APPEND "spell.ids" "%code% %name%" + END +END + + +ACTION_IF enhanced_edition BEGIN + ACTION_DEFINE_ASSOCIATIVE_ARRAY spell_ids_missing_ee BEGIN + 4238=>SUN_SOUL_FLAMING_FISTS + 4103=>BLACKGUARD_AURA_OF_DESPAIR + 4935=>BLACKGUARD_SUMMON_FALLEN_DEVA + END + ACTION_PHP_EACH spell_ids_missing_ee AS code=>name BEGIN + ACTION_IF !FILE_CONTAINS_EVALUATED ("override/spell.ids" "%code%[ %TAB%]+%name%") BEGIN + APPEND "spell.ids" "%code% %name%" + END + END + + // do a few systematic fixes: + // remove IWDification/IWDEE non-BG2-style SYMBOLS + // eliminate M&G's pathological WIZARD_ references to SPCL spells + + COPY_EXISTING "spell.ids" override + REPLACE_TEXTUALLY "SYMBOL_OF_" "SYMBOL_" + SET index=0 + REPLACE_EVALUATE + "\(4[0-9][0-9][0-9]\) +\(WIZARD\|CLERIC\)_.*" + BEGIN + SET index +=1 + END + "%MATCH1% BROKEN_REFERENCE_%index%" + BUT_ONLY + + + // don't sort it, because (a) sorting spell.ids takes nontrivial time, and (b) we'll do it in DS anyway + +END +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// some third-party mods unhelpfully map WIZARD_DISPEL_MAGIC to SPWI326; change this back +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + ACTION_IF debug_variable=3 BEGIN + PRINT "Remapping DISPEL_MAGIC: press a key to continue" + ACTION_READLN blook + SILENT + END + +ACTION_IF enhanced_edition BEGIN + COPY_EXISTING spell.ids override + REPLACE_TEXTUALLY "23[0-9][0-9] +WIZARD_DISPEL_MAGIC" "2302 WIZARD_DISPEL_MAGIC" + BUT_ONLY +END + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// in case Fixpack hasn't already done it, disable the 0-byte items & broken areas (we do this here for the benefit of the count section) +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + ACTION_IF debug_variable=3 BEGIN + PRINT "Disabling broken stuff: press a key to continue" + ACTION_READLN blook + SILENT + END + + +ACTION_FOR_EACH bad IN "iplot01k.itm" "iplot04g.itm" "iplot04h.itm" "iplot04i.itm" "xr2400.are" "xr2600.are" BEGIN + ACTION_IF FILE_EXISTS_IN_GAME "%bad%" BEGIN + ACTION_TRY + COPY_EXISTING "%bad%" override + READ_BYTE 0x0 0 + BUT_ONLY + WITH DEFAULT + DISABLE_FROM_KEY "%bad%" + END + END +END + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Determine status of auto-built functions +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +ACTION_IF FILE_EXISTS "%MOD_FOLDER%/%sfo_loc%/SFO_autofunc.tpa" BEGIN + INCLUDE "%MOD_FOLDER%/%sfo_loc%/SFO_autofunc.tpa" + OUTER_SET SFO_reserved_build_function_control=2 +END ELSE BEGIN + OUTER_SET SFO_reserved_build_function_control=1 +END + + +/////////////////////////////////////////////////// +// include core function library +/////////////////////////////////////////////////// + + ACTION_IF debug_variable=3 BEGIN + PRINT "SFO setup done, starting core library install (general files): press a key to continue" + ACTION_READLN blook + SILENT + END + ACTION_BASH_FOR ~%MOD_FOLDER%/%sfo_loc%/general~ ~lib_.*\.tpa~ BEGIN + ACTION_IF "%BASH_FOR_EXT%" STRING_EQUAL_CASE TPA BEGIN + //PRINT "%BASH_FOR_RES%" + INCLUDE ~%MOD_FOLDER%/%sfo_loc%/general/%BASH_FOR_RES%.tpa~ + END + END + +/////////////////////////////////////////////////// +// include file-specific function library +/////////////////////////////////////////////////// + + ACTION_IF debug_variable=3 BEGIN + PRINT "Continuing core library install (filetype-specific files): press a key to continue" + ACTION_READLN blook + SILENT + END + ACTION_BASH_FOR ~%MOD_FOLDER%/%sfo_loc%/filetype~ ~lib_.*\.tpa~ BEGIN + ACTION_IF "%BASH_FOR_EXT%" STRING_EQUAL_CASE TPA BEGIN + INCLUDE ~%MOD_FOLDER%/%sfo_loc%/filetype/%BASH_FOR_RES%.tpa~ + END + END + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// If appropriate, copy over autofunc library +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +ACTION_IF !FILE_EXISTS "%MOD_FOLDER%/%sfo_loc%/SFO_autofunc.tpa" BEGIN + ACTION_IF FILE_EXISTS "%workspace%/SFO_autofunc.tpa" BEGIN + COPY + "%workspace%/SFO_autofunc.tpa" "%MOD_FOLDER%/%sfo_loc%/SFO_autofunc.tpa" + END +END + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Initialise SSL variables +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +OUTER_SPRINT ~sslvariables~ ~%percentage%MOD_FOLDER%percentage%=%MOD_FOLDER%&%percentage%tutu_var%percentage%=%tutu_var%~ +OUTER_SPRINT ssllibrary "" + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Define hotkey code +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + ACTION_FOR_EACH hotkey IN A B C D E F G H I J K L M N O P Q R S T U V W X Y Z BEGIN + LAF check_ini INT_VAR silent=1 STR_VAR ini="hot_key_%hotkey%" RET value END + ACTION_IF "%value%" STRING_EQUAL_CASE "0" BEGIN + OUTER_SPRINT "hot_key_%hotkey%" "%hotkey%" + END ELSE BEGIN + OUTER_SPRINT "hot_key_%hotkey%" "%value%" + END + END + + DEFINE_PATCH_FUNCTION ssl_hotkey_swap BEGIN + REPLACE_EVALUATE "HotKey(\([A-Z]\))" + BEGIN + SPRINT value EVAL "%hot_key_%MATCH1%%" + END + ~HotKey(%value%)~ + END + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Define swap code to move between EE and vanilla SSL +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + DEFINE_PATCH_FUNCTION ssl_ee_to_vanilla BEGIN + // SPLSTATE to ToBeX extended stats + REPLACE_TEXTUALLY "!CheckSpellState(\([^,]*\),\([^)]*\))" "CheckStat(\1,0,\2)" + REPLACE_TEXTUALLY "CheckSpellState(\([^,]*\),\([^)]*\))" "CheckStatGT(\1,0,\2)" + // vanilla doesn't have RunAwayFromNoLeaveArea + REPLACE_TEXTUALLY RunAwayFromNoLeaveArea RunAwayFrom + REPLACE_TEXTUALLY NinthFarthestEnemyOf NearestEnemyOf + REPLACE_TEXTUALLY EighthFarthestEnemyOf NearestEnemyOf + REPLACE_TEXTUALLY SeventhFarthestEnemyOf NearestEnemyOf + REPLACE_TEXTUALLY SixthFarthestEnemyOf NearestEnemyOf + REPLACE_TEXTUALLY FifthFarthestEnemyOf SecondNearestEnemyOf + REPLACE_TEXTUALLY FourthFarthestEnemyOf ThirdNearestEnemyOf + REPLACE_TEXTUALLY ThirdFarthestEnemyOf FourthNearestEnemyOf + REPLACE_TEXTUALLY SecondFarthestEnemyOf FifthNearestEnemyOf + REPLACE_TEXTUALLY FarthestEnemyOf SixthNearestEnemyOf + REPLACE_TEXTUALLY "NearestAllyOf(Myself)" "NearestMyGroupOfType([0.0])" + REPLACE_TEXTUALLY "NightmareModeOn()" "False()" + + + END + ACTION_IF debug_variable=3 BEGIN + PRINT "SFO installed: press a key to continue" + ACTION_READLN blook + SILENT + END + + + +END +VERBOSE + + + diff --git a/iwdification/sfo/sfo_autofunc.tpa b/iwdification/sfo/sfo_autofunc.tpa new file mode 100644 index 0000000..f024604 --- /dev/null +++ b/iwdification/sfo/sfo_autofunc.tpa @@ -0,0 +1,27067 @@ + + + DEFINE_PATCH_FUNCTION ARE_rain_probability + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x4a arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_rain_probabilityGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x4a < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x4a arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_rain_probabilityLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x4a > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x4a arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_rain_probability + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x4a value + END + + + DEFINE_PATCH_FUNCTION ARE_snow_probability + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x4c arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_snow_probabilityGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x4c < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x4c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_snow_probabilityLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x4c > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x4c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_snow_probability + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x4c value + END + + + DEFINE_PATCH_FUNCTION ARE_fog_probability + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x4e arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_fog_probabilityGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x4e < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x4e arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_fog_probabilityLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x4e > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x4e arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_fog_probability + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x4e value + END + + + DEFINE_PATCH_FUNCTION ARE_lightning_probability + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x50 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_lightning_probabilityGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x50 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x50 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_lightning_probabilityLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x50 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x50 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_lightning_probability + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x50 value + END + + DEFINE_PATCH_FUNCTION ARE_area_script + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x94 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x94 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_area_script + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x94 value + END + + DEFINE_PATCH_FUNCTION ARE_wed + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x8 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x8 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_wed + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x8 value + END + + DEFINE_PATCH_FUNCTION ARE_to_north + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x18 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x18 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_to_north + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x18 value + END + + DEFINE_PATCH_FUNCTION ARE_to_east + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x24 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x24 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_to_east + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x24 value + END + + DEFINE_PATCH_FUNCTION ARE_to_west + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x3c "" (8) + END + DEFAULT + WRITE_ASCIIE 0x3c "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_to_west + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x3c value + END + + DEFINE_PATCH_FUNCTION ARE_to_south + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x30 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x30 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_to_south + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x30 value + END + + DEFINE_PATCH_FUNCTION ARE_restmovie_day + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0xd4 "" (8) + END + DEFAULT + WRITE_ASCIIE 0xd4 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_restmovie_day + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0xd4 value + END + + DEFINE_PATCH_FUNCTION ARE_restmove_night + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0xdc "" (8) + END + DEFAULT + WRITE_ASCIIE 0xdc "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_restmove_night + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0xdc value + END + + + DEFINE_PATCH_FUNCTION ARE_outdoor STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x48 (BYTE_AT 0x48 BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x48 (BYTE_AT 0x48 BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_outdoor STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x48 BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_day_night STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x48 (BYTE_AT 0x48 BAND 253) + END ELSE BEGIN + WRITE_BYTE 0x48 (BYTE_AT 0x48 BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_day_night STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x48 BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_weather STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x48 (BYTE_AT 0x48 BAND 251) + END ELSE BEGIN + WRITE_BYTE 0x48 (BYTE_AT 0x48 BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_weather STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x48 BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_city STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x48 (BYTE_AT 0x48 BAND 247) + END ELSE BEGIN + WRITE_BYTE 0x48 (BYTE_AT 0x48 BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_city STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x48 BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_forest STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x48 (BYTE_AT 0x48 BAND 239) + END ELSE BEGIN + WRITE_BYTE 0x48 (BYTE_AT 0x48 BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_forest STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x48 BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_dungeon STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x48 (BYTE_AT 0x48 BAND 223) + END ELSE BEGIN + WRITE_BYTE 0x48 (BYTE_AT 0x48 BOR 32) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_dungeon STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x48 BAND 32) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_extended_night STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x48 (BYTE_AT 0x48 BAND 191) + END ELSE BEGIN + WRITE_BYTE 0x48 (BYTE_AT 0x48 BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_extended_night STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x48 BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_rest_indoors STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x48 (BYTE_AT 0x48 BAND 127) + END ELSE BEGIN + WRITE_BYTE 0x48 (BYTE_AT 0x48 BOR 128) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_rest_indoors STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x48 BAND 128) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + DEFINE_PATCH_FUNCTION ARE_actorname + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x0 + offset_base) "" (0x20) + END + DEFAULT + WRITE_ASCIIE (0x0 + offset_base) "%arguments%" (0x20) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_actorname + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x0 + offset_base) value (0x20) NULL + END + + DEFINE_PATCH_FUNCTION ARE_actor_name + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x0 + offset_base) "" (0x20) + END + DEFAULT + WRITE_ASCIIE (0x0 + offset_base) "%arguments%" (0x20) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_actor_name + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x0 + offset_base) value (0x20) NULL + END + + DEFINE_PATCH_FUNCTION ARE_script_override + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x50 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x50 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_script_override + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x50 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_script_class + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x60 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x60 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_script_class + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x60 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_script_race + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x68 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x68 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_script_race + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x68 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_script_general + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x58 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x58 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_script_general + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x58 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_script_default + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x70 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x70 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_script_default + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x70 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_script_specifics + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x78 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x78 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_script_specifics + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x78 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_crefile + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x80 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x80 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_crefile + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x80 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_actor_resource + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x80 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x80 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_actor_resource + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x80 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_actor_x_coord_start + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x20 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_actor_x_coord_startGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x20 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x20 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_actor_x_coord_startLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x20 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x20 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_actor_x_coord_start + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x20 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_actor_y_coord_start + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x22 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_actor_y_coord_startGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x22 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x22 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_actor_y_coord_startLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x22 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x22 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_actor_y_coord_start + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x22 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_actor_x_coord_dest + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x24 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_actor_x_coord_destGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x24 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x24 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_actor_x_coord_destLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x24 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x24 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_actor_x_coord_dest + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x24 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_actor_y_coord_dest + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x26 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_actor_y_coord_destGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x26 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x26 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_actor_y_coord_destLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x26 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x26 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_actor_y_coord_dest + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x26 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_actor_removal_timer + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x38 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_actor_removal_timerGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x38 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x38 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_actor_removal_timerLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x38 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x38 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_actor_removal_timer + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x38 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_dialog + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x48 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x48 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_dialog + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x48 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_door_name + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x0 + offset_base) "" (0x20) + END + DEFAULT + WRITE_ASCIIE (0x0 + offset_base) "%arguments%" (0x20) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_door_name + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x0 + offset_base) value (0x20) NULL + END + + DEFINE_PATCH_FUNCTION ARE_door_id + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x20 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x20 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_door_id + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x20 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_door_icon + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x7c + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_door_iconGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x7c + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x7c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_door_iconLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x7c + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x7c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_door_icon + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x7c + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_door_script + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x80 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x80 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_door_script + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x80 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_door_dialog + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0xb8 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0xb8 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_door_dialog + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0xb8 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_door_lock_difficulty + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x8c + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_door_lock_difficultyGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x8c + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x8c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_door_lock_difficultyLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x8c + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x8c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_door_lock_difficulty + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x8c + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_door_trap_detection_difficulty + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x6c + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_door_trap_detection_difficultyGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x6c + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x6c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_door_trap_detection_difficultyLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x6c + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x6c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_door_trap_detection_difficulty + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x6c + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_door_trap_removal_difficulty + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x6e + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_door_trap_removal_difficultyGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x6e + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x6e + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_door_trap_removal_difficultyLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x6e + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x6e + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_door_trap_removal_difficulty + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x6e + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_door_is_trapped + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x70 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_door_is_trappedGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x70 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x70 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_door_is_trappedLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x70 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x70 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_door_is_trapped + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x70 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_door_open_bb_left + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x38 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_door_open_bb_leftGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x38 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x38 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_door_open_bb_leftLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x38 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x38 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_door_open_bb_left + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x38 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_door_open_bb_top + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x3a + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_door_open_bb_topGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x3a + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x3a + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_door_open_bb_topLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x3a + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x3a + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_door_open_bb_top + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x3a + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_door_open_bb_right + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x3c + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_door_open_bb_rightGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x3c + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x3c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_door_open_bb_rightLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x3c + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x3c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_door_open_bb_right + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x3c + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_door_open_bb_bottom + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x3e + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_door_open_bb_bottomGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x3e + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x3e + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_door_open_bb_bottomLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x3e + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x3e + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_door_open_bb_bottom + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x3e + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_door_closed_bb_left + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x40 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_door_closed_bb_leftGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x40 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x40 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_door_closed_bb_leftLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x40 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x40 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_door_closed_bb_left + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x40 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_door_closed_bb_top + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x42 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_door_closed_bb_topGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x42 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x42 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_door_closed_bb_topLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x42 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x42 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_door_closed_bb_top + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x42 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_door_closed_bb_right + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x44 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_door_closed_bb_rightGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x44 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x44 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_door_closed_bb_rightLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x44 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x44 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_door_closed_bb_right + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x44 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_door_closed_bb_bottom + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x46 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_door_closed_bb_bottomGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x46 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x46 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_door_closed_bb_bottomLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x46 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x46 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_door_closed_bb_bottom + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x46 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_container_name + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x0 + offset_base) "" (0x20) + END + DEFAULT + WRITE_ASCIIE (0x0 + offset_base) "%arguments%" (0x20) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_container_name + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x0 + offset_base) value (0x20) NULL + END + + + DEFINE_PATCH_FUNCTION ARE_container_xloc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x20 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_xlocGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x20 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x20 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_xlocLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x20 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x20 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_container_xloc + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x20 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_container_yloc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x22 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_ylocGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x22 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x22 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_ylocLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x22 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x22 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_container_yloc + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x22 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_container_type + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x24 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_typeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x24 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x24 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_typeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x24 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x24 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_container_type + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x24 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_container_lock_difficulty + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x26 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_lock_difficultyGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x26 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x26 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_lock_difficultyLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x26 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x26 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_container_lock_difficulty + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x26 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_container_trap_detection_difficulty + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x2c + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_trap_detection_difficultyGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x2c + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x2c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_trap_detection_difficultyLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x2c + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x2c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_container_trap_detection_difficulty + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x2c + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_container_trap_removal_difficulty + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x2e + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_trap_removal_difficultyGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x2e + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x2e + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_trap_removal_difficultyLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x2e + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x2e + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_container_trap_removal_difficulty + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x2e + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_container_trapped + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x30 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_trappedGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x30 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x30 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_trappedLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x30 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x30 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_container_trapped + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x30 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_container_trap_detected + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x32 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_trap_detectedGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x32 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x32 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_trap_detectedLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x32 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x32 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_container_trap_detected + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x32 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_container_trap_xloc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x34 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_trap_xlocGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x34 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x34 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_trap_xlocLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x34 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x34 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_container_trap_xloc + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x34 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_container_trap_yloc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x36 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_trap_ylocGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x36 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x36 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_trap_ylocLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x36 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x36 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_container_trap_yloc + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x36 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_container_top_left + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x38 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_top_leftGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x38 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x38 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_top_leftLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x38 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x38 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_container_top_left + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x38 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_container_top_right + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x3a + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_top_rightGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x3a + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x3a + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_top_rightLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x3a + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x3a + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_container_top_right + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x3a + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_container_bottom_right + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x3c + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_bottom_rightGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x3c + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x3c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_bottom_rightLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x3c + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x3c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_container_bottom_right + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x3c + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_container_bottom_left + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x3e + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_bottom_leftGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x3e + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x3e + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_bottom_leftLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x3e + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x3e + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_container_bottom_left + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x3e + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_container_bb_left + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x38 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_bb_leftGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x38 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x38 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_bb_leftLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x38 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x38 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_container_bb_left + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x38 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_container_bb_top + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x3a + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_bb_topGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x3a + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x3a + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_bb_topLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x3a + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x3a + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_container_bb_top + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x3a + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_container_bb_right + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x3c + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_bb_rightGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x3c + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x3c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_bb_rightLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x3c + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x3c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_container_bb_right + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x3c + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_container_bb_bottom + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x3e + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_bb_bottomGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x3e + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x3e + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_bb_bottomLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x3e + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x3e + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_container_bb_bottom + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x3e + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_container_script + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x48 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x48 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_container_script + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x48 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_container_key + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x78 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x78 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_container_key + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x78 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_container_lockpick_strref + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x84 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_lockpick_strrefGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x84 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x84 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_container_lockpick_strrefLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x84 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x84 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_container_lockpick_strref + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x84 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_entrance_name + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x0 + offset_base) "" (0x20) + END + DEFAULT + WRITE_ASCIIE (0x0 + offset_base) "%arguments%" (0x20) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_entrance_name + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x0 + offset_base) value (0x20) NULL + END + + + DEFINE_PATCH_FUNCTION ARE_entrance_xloc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x20 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_entrance_xlocGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x20 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x20 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_entrance_xlocLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x20 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x20 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_entrance_xloc + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x20 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_entrance_yloc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x22 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_entrance_ylocGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x22 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x22 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_entrance_ylocLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x22 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x22 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_entrance_yloc + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x22 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_entrance_orientation + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x24 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_entrance_orientationGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x24 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x24 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_entrance_orientationLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x24 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x24 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_entrance_orientation + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x24 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_trigger_name + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x0 + offset_base) "" (0x20) + END + DEFAULT + WRITE_ASCIIE (0x0 + offset_base) "%arguments%" (0x20) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_trigger_name + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x0 + offset_base) value (0x20) NULL + END + + DEFINE_PATCH_FUNCTION ARE_destination + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x38 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x38 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_destination + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x38 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_trigger_type + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x20 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_trigger_typeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x20 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x20 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_trigger_typeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x20 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x20 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_trigger_type + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x20 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_trigger_cursor + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x34 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_trigger_cursorGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x34 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x34 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_trigger_cursorLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x34 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x34 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_trigger_cursor + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x34 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_trigger_info + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x64 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_trigger_infoGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x64 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x64 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_trigger_infoLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x64 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x64 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_trigger_info + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x64 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_trigger_script + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x7c + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x7c + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_trigger_script + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x7c + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_trigger_dest + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x38 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x38 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_trigger_dest + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x38 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_trigger_entrance + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x40 + offset_base) "" (0x20) + END + DEFAULT + WRITE_ASCIIE (0x40 + offset_base) "%arguments%" (0x20) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_trigger_entrance + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x40 + offset_base) value (0x20) NULL + END + + + DEFINE_PATCH_FUNCTION ARE_trigger_bbleft + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x22 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_trigger_bbleftGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x22 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x22 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_trigger_bbleftLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x22 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x22 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_trigger_bbleft + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x22 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_trigger_bbtop + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x24 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_trigger_bbtopGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x24 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x24 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_trigger_bbtopLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x24 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x24 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_trigger_bbtop + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x24 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_trigger_bbright + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x26 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_trigger_bbrightGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x26 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x26 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_trigger_bbrightLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x26 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x26 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_trigger_bbright + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x26 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_trigger_bbbottom + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x28 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_trigger_bbbottomGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x28 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x28 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_trigger_bbbottomLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x28 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x28 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_trigger_bbbottom + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x28 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_trigger_flags + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x60 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_trigger_flagsGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x60 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x60 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_trigger_flagsLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x60 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x60 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_trigger_flags + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x60 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_is_trapped + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x6c + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_is_trappedGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x6c + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x6c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_is_trappedLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x6c + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x6c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_is_trapped + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x6c + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_trap_detected + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x6e + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_trap_detectedGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x6e + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x6e + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_trap_detectedLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x6e + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x6e + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_trap_detected + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x6e + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_trap_detection_difficulty + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x68 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_trap_detection_difficultyGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x68 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x68 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_trap_detection_difficultyLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x68 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x68 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_trap_detection_difficulty + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x68 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_trap_removal_difficulty + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x6a + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_trap_removal_difficultyGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x6a + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x6a + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_trap_removal_difficultyLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x6a + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x6a + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_trap_removal_difficulty + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x6a + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_trigger_trap_xloc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x70 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_trigger_trap_xlocGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x70 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x70 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_trigger_trap_xlocLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x70 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x70 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_trigger_trap_xloc + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x70 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_trigger_trap_yloc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x72 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_trigger_trap_ylocGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x72 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x72 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_trigger_trap_ylocLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x72 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x72 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_trigger_trap_yloc + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x72 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_trigger_alt_xloc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x84 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_trigger_alt_xlocGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x84 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x84 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_trigger_alt_xlocLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x84 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x84 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_trigger_alt_xloc + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x84 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_trigger_alt_yloc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x86 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_trigger_alt_ylocGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x86 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x86 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_trigger_alt_ylocLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x86 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x86 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_trigger_alt_yloc + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x86 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_spawn_name + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x0 + offset_base) "" (0x20) + END + DEFAULT + WRITE_ASCIIE (0x0 + offset_base) "%arguments%" (0x20) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_spawn_name + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x0 + offset_base) value (0x20) NULL + END + + + DEFINE_PATCH_FUNCTION ARE_spawn_xloc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x20 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_xlocGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x20 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x20 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_xlocLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x20 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x20 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_spawn_xloc + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x20 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_spawn_yloc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x22 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_ylocGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x22 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x22 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_ylocLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x22 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x22 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_spawn_yloc + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x22 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_spawn_creature1 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x24 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x24 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_spawn_creature1 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x24 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_spawn_creature2 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x2c + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x2c + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_spawn_creature2 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x2c + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_spawn_creature3 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x34 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x34 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_spawn_creature3 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x34 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_spawn_creature4 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x3c + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x3c + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_spawn_creature4 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x3c + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_spawn_creature5 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x44 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x44 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_spawn_creature5 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x44 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_spawn_creature6 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x4c + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x4c + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_spawn_creature6 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x4c + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_spawn_creature7 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x54 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x54 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_spawn_creature7 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x54 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_spawn_creature8 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x5c + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x5c + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_spawn_creature8 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x5c + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_spawn_creature9 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x64 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x64 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_spawn_creature9 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x64 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_spawn_creature10 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x6c + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x6c + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_spawn_creature10 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x6c + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_spawn_count + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x74 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_countGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x74 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x74 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_countLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x74 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x74 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_spawn_count + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x74 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_spawn_base_number + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x76 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_base_numberGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x76 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x76 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_base_numberLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x76 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x76 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_spawn_base_number + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x76 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_spawn_frequency + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x78 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_frequencyGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x78 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x78 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_frequencyLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x78 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x78 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_spawn_frequency + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x78 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_spawn_method + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x7a + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_methodGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x7a + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x7a + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_methodLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x7a + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x7a + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_spawn_method + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x7a + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_spawn_maximum + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x84 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_maximumGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x84 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x84 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_maximumLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x84 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x84 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_spawn_maximum + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x84 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_spawn_probability_day + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x8c + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_probability_dayGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x8c + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x8c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_probability_dayLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x8c + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x8c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_spawn_probability_day + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x8c + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_spawn_probability_night + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x8e + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_probability_nightGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x8e + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x8e + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_probability_nightLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x8e + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x8e + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_spawn_probability_night + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x8e + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_spawn_ee_weight1 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x98 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_ee_weight1GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x98 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x98 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_ee_weight1LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x98 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x98 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_spawn_ee_weight1 + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0x98 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_spawn_ee_weight2 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x99 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_ee_weight2GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x99 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x99 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_ee_weight2LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x99 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x99 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_spawn_ee_weight2 + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0x99 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_spawn_ee_weight3 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x9a + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_ee_weight3GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x9a + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x9a + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_ee_weight3LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x9a + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x9a + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_spawn_ee_weight3 + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0x9a + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_spawn_ee_weight4 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x9b + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_ee_weight4GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x9b + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x9b + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_ee_weight4LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x9b + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x9b + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_spawn_ee_weight4 + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0x9b + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_spawn_ee_weight5 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x9c + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_ee_weight5GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x9c + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x9c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_ee_weight5LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x9c + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x9c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_spawn_ee_weight5 + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0x9c + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_spawn_ee_weight6 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x9d + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_ee_weight6GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x9d + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x9d + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_ee_weight6LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x9d + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x9d + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_spawn_ee_weight6 + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0x9d + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_spawn_ee_weight7 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x9e + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_ee_weight7GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x9e + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x9e + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_ee_weight7LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x9e + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x9e + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_spawn_ee_weight7 + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0x9e + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_spawn_ee_weight8 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x9f + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_ee_weight8GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x9f + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x9f + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_ee_weight8LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x9f + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x9f + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_spawn_ee_weight8 + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0x9f + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_spawn_ee_weight9 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0xa0 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_ee_weight9GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0xa0 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0xa0 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_ee_weight9LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0xa0 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0xa0 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_spawn_ee_weight9 + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0xa0 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_spawn_ee_weight10 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0xa1 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_ee_weight10GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0xa1 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0xa1 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_spawn_ee_weight10LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0xa1 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0xa1 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_spawn_ee_weight10 + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0xa1 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_restspawn_strref1 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x20 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_strref1GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x20 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x20 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_strref1LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x20 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x20 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_restspawn_strref1 + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x20 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_restspawn_strref2 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x24 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_strref2GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x24 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x24 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_strref2LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x24 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x24 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_restspawn_strref2 + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x24 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_restspawn_strref3 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x28 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_strref3GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x28 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x28 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_strref3LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x28 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x28 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_restspawn_strref3 + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x28 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_restspawn_strref4 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x2c + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_strref4GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x2c + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x2c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_strref4LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x2c + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x2c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_restspawn_strref4 + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x2c + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_restspawn_strref5 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x30 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_strref5GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x30 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x30 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_strref5LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x30 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x30 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_restspawn_strref5 + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x30 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_restspawn_strref6 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x34 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_strref6GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x34 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x34 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_strref6LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x34 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x34 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_restspawn_strref6 + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x34 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_restspawn_strref7 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x38 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_strref7GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x38 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x38 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_strref7LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x38 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x38 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_restspawn_strref7 + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x38 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_restspawn_strref8 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x3c + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_strref8GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x3c + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x3c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_strref8LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x3c + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x3c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_restspawn_strref8 + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x3c + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_restspawn_strref9 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x40 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_strref9GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x40 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x40 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_strref9LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x40 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x40 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_restspawn_strref9 + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x40 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_restspawn_strref10 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x44 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_strref10GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x44 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x44 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_strref10LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x44 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x44 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_restspawn_strref10 + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x44 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_restspawn_count + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x98 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_countGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x98 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x98 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_countLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x98 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x98 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_restspawn_count + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x98 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_restspawn_creature1 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x48 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x48 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_restspawn_creature1 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x48 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_restspawn_creature2 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x50 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x50 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_restspawn_creature2 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x50 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_restspawn_creature3 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x58 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x58 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_restspawn_creature3 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x58 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_restspawn_creature4 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x60 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x60 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_restspawn_creature4 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x60 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_restspawn_creature5 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x68 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x68 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_restspawn_creature5 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x68 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_restspawn_creature6 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x70 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x70 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_restspawn_creature6 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x70 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_restspawn_creature7 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x78 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x78 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_restspawn_creature7 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x78 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_restspawn_creature8 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x80 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x80 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_restspawn_creature8 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x80 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_restspawn_creature9 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x88 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x88 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_restspawn_creature9 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x88 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_restspawn_creature10 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x90 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x90 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_restspawn_creature10 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x90 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_restspawn_probability_day + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa8 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_probability_dayGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xa8 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa8 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_probability_dayLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xa8 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa8 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_restspawn_probability_day + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0xa8 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_restspawn_probability_night + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xaa + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_probability_nightGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xaa + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xaa + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_probability_nightLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xaa + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xaa + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_restspawn_probability_night + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0xaa + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_restspawn_max_number + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa4 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_max_numberGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xa4 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa4 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_max_numberLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xa4 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa4 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_restspawn_max_number + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0xa4 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_restspawn_enabled + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa6 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_enabledGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xa6 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa6 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_enabledLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xa6 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa6 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_restspawn_enabled + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0xa6 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_restspawn_removal + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x9c + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_removalGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x9c + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x9c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_removalLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x9c + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x9c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_restspawn_removal + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x9c + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_restspawn_maximum + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa4 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_maximumGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xa4 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa4 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_maximumLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xa4 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa4 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_restspawn_maximum + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0xa4 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_restspawn_difficulty + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x9a + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_difficultyGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x9a + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x9a + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_difficultyLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x9a + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x9a + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_restspawn_difficulty + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x9a + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_restspawn_wander + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa0 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_wanderGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xa0 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa0 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_wanderLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xa0 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa0 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_restspawn_wander + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0xa0 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_restspawn_follow + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa2 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_followGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xa2 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa2 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_restspawn_followLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xa2 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa2 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_restspawn_follow + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0xa2 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_animation_name + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x0 + offset_base) "" (0x20) + END + DEFAULT + WRITE_ASCIIE (0x0 + offset_base) "%arguments%" (0x20) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_animation_name + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x0 + offset_base) value (0x20) NULL + END + + DEFINE_PATCH_FUNCTION ARE_animation_resource + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x28 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x28 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_animation_resource + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x28 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_animation_height + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x38 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_animation_heightGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x38 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x38 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_animation_heightLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x38 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x38 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_animation_height + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x38 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_animation_xloc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x20 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_animation_xlocGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x20 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x20 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_animation_xlocLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x20 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x20 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_animation_xloc + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x20 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_animation_yloc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x22 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_animation_ylocGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x22 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x22 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_animation_ylocLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x22 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x22 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_animation_yloc + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x22 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_animation_active + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x24 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_animation_activeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x24 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x24 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_animation_activeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x24 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x24 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_animation_active + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x24 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_ambient_name + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x0 + offset_base) "" (0x20) + END + DEFAULT + WRITE_ASCIIE (0x0 + offset_base) "%arguments%" (0x20) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_ambient_name + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x0 + offset_base) value (0x20) NULL + END + + + DEFINE_PATCH_FUNCTION ARE_ambient_xloc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x20 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_ambient_xlocGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x20 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x20 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_ambient_xlocLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x20 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x20 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_ambient_xloc + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x20 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_ambient_yloc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x22 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_ambient_ylocGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x22 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x22 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_ambient_ylocLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x22 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x22 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_ambient_yloc + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x22 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_ambient_radius + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x24 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_ambient_radiusGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x24 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x24 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_ambient_radiusLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x24 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x24 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_ambient_radius + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x24 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_ambient_base_time + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x84 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_ambient_base_timeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x84 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x84 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_ambient_base_timeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x84 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x84 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_ambient_base_time + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x84 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_ambient_time_deviation + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x88 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_ambient_time_deviationGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x88 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x88 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_ambient_time_deviationLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x88 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x88 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_ambient_time_deviation + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x88 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_ambient_volume + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x2e + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_ambient_volumeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x2e + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x2e + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_ambient_volumeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x2e + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x2e + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_ambient_volume + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x2e + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_ambient_sound1 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x30 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x30 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_ambient_sound1 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x30 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_ambient_sound2 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x38 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x38 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_ambient_sound2 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x38 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_ambient_sound3 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x40 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x40 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_ambient_sound3 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x40 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_ambient_sound4 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x48 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x48 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_ambient_sound4 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x48 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_ambient_sound5 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x50 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x50 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_ambient_sound5 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x50 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_ambient_sound6 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x58 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x58 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_ambient_sound6 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x58 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_ambient_sound7 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x60 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x60 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_ambient_sound7 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x60 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_ambient_sound8 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x68 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x68 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_ambient_sound8 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x68 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_ambient_sound9 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x70 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x70 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_ambient_sound9 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x70 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_ambient_sound10 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x78 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x78 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_ambient_sound10 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x78 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_ambient_sound_number + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x80 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_ambient_sound_numberGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x80 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x80 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_ambient_sound_numberLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x80 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x80 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_ambient_sound_number + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x80 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_ambient_active + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x8c + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_ambient_activeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x8c + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x8c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_ambient_activeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x8c + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x8c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_ambient_active + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x8c + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_mapnote_xloc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x0 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_mapnote_xlocGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x0 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x0 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_mapnote_xlocLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x0 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x0 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_mapnote_xloc + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x0 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_mapnote_yloc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x2 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_mapnote_ylocGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x2 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x2 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_mapnote_ylocLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x2 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x2 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_mapnote_yloc + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x2 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_mapnote_text + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x4 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_mapnote_textGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x4 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x4 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_mapnote_textLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x4 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x4 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_mapnote_text + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x4 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_mapnote_text_loc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x8 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_mapnote_text_locGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x8 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x8 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_mapnote_text_locLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x8 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x8 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_mapnote_text_loc + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x8 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ARE_mapnote_color + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_mapnote_colorGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xa + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_mapnote_colorLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xa + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_mapnote_color + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0xa + offset_base) value + END + + DEFINE_PATCH_FUNCTION ARE_item_resource + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x0 + offset_secondary) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x0 + offset_secondary) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_item_resource + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x0 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION ARE_item_charges_1 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_item_charges_1GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xa + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_item_charges_1LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xa + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_item_charges_1 + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0xa + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION ARE_item_charges_2 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xc + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_item_charges_2GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xc + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xc + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_item_charges_2LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xc + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xc + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_item_charges_2 + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0xc + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION ARE_item_charges_3 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xe + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_item_charges_3GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xe + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xe + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_item_charges_3LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xe + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xe + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_item_charges_3 + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0xe + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION ARE_vertex_xloc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x0 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_vertex_xlocGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x0 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x0 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_vertex_xlocLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x0 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x0 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_vertex_xloc + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x0 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION ARE_vertex_yloc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x2 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_vertex_ylocGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x2 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x2 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_vertex_ylocLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x2 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x2 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_vertex_yloc + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x2 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION ARE_trap_undetectable STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x60 + offset_base) (BYTE_AT (0x60 + offset_base) BAND 254) + END ELSE BEGIN + WRITE_BYTE (0x60 + offset_base) (BYTE_AT (0x60 + offset_base) BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_trap_undetectable STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x60 + offset_base) BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_reset_trap STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x60 + offset_base) (BYTE_AT (0x60 + offset_base) BAND 253) + END ELSE BEGIN + WRITE_BYTE (0x60 + offset_base) (BYTE_AT (0x60 + offset_base) BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_reset_trap STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x60 + offset_base) BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_party_required STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x60 + offset_base) (BYTE_AT (0x60 + offset_base) BAND 251) + END ELSE BEGIN + WRITE_BYTE (0x60 + offset_base) (BYTE_AT (0x60 + offset_base) BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_party_required STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x60 + offset_base) BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_trap_detectable STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x60 + offset_base) (BYTE_AT (0x60 + offset_base) BAND 247) + END ELSE BEGIN + WRITE_BYTE (0x60 + offset_base) (BYTE_AT (0x60 + offset_base) BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_trap_detectable STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x60 + offset_base) BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_trap_set_off_by_NPC STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x60 + offset_base) (BYTE_AT (0x60 + offset_base) BAND 191) + END ELSE BEGIN + WRITE_BYTE (0x60 + offset_base) (BYTE_AT (0x60 + offset_base) BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_trap_set_off_by_NPC STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x60 + offset_base) BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_trigger_deactivated STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x61 + offset_base) (BYTE_AT (0x61 + offset_base) BAND 254) + END ELSE BEGIN + WRITE_BYTE (0x61 + offset_base) (BYTE_AT (0x61 + offset_base) BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_trigger_deactivated STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x61 + offset_base) BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_impassable_by_NPC STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x61 + offset_base) (BYTE_AT (0x61 + offset_base) BAND 253) + END ELSE BEGIN + WRITE_BYTE (0x61 + offset_base) (BYTE_AT (0x61 + offset_base) BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_impassable_by_NPC STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x61 + offset_base) BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_use_activation_point STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x61 + offset_base) (BYTE_AT (0x61 + offset_base) BAND 251) + END ELSE BEGIN + WRITE_BYTE (0x61 + offset_base) (BYTE_AT (0x61 + offset_base) BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_use_activation_point STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x61 + offset_base) BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_ambient_enabled STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x90 + offset_base) (BYTE_AT (0x90 + offset_base) BAND 254) + END ELSE BEGIN + WRITE_BYTE (0x90 + offset_base) (BYTE_AT (0x90 + offset_base) BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_ambient_enabled STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x90 + offset_base) BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_ambient_looping STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x90 + offset_base) (BYTE_AT (0x90 + offset_base) BAND 253) + END ELSE BEGIN + WRITE_BYTE (0x90 + offset_base) (BYTE_AT (0x90 + offset_base) BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_ambient_looping STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x90 + offset_base) BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_ambient_ignore_radius STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x90 + offset_base) (BYTE_AT (0x90 + offset_base) BAND 251) + END ELSE BEGIN + WRITE_BYTE (0x90 + offset_base) (BYTE_AT (0x90 + offset_base) BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_ambient_ignore_radius STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x90 + offset_base) BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_ambient_random_order STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x90 + offset_base) (BYTE_AT (0x90 + offset_base) BAND 247) + END ELSE BEGIN + WRITE_BYTE (0x90 + offset_base) (BYTE_AT (0x90 + offset_base) BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_ambient_random_order STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x90 + offset_base) BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_animation_enabled STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x34 + offset_base) (BYTE_AT (0x34 + offset_base) BAND 254) + END ELSE BEGIN + WRITE_BYTE (0x34 + offset_base) (BYTE_AT (0x34 + offset_base) BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_animation_enabled STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x34 + offset_base) BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_animation_transparent_black STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x34 + offset_base) (BYTE_AT (0x34 + offset_base) BAND 253) + END ELSE BEGIN + WRITE_BYTE (0x34 + offset_base) (BYTE_AT (0x34 + offset_base) BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_animation_transparent_black STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x34 + offset_base) BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_animation_non_self_illumination STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x34 + offset_base) (BYTE_AT (0x34 + offset_base) BAND 251) + END ELSE BEGIN + WRITE_BYTE (0x34 + offset_base) (BYTE_AT (0x34 + offset_base) BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_animation_non_self_illumination STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x34 + offset_base) BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_animation_partial STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x34 + offset_base) (BYTE_AT (0x34 + offset_base) BAND 247) + END ELSE BEGIN + WRITE_BYTE (0x34 + offset_base) (BYTE_AT (0x34 + offset_base) BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_animation_partial STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x34 + offset_base) BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_animation_synchronised STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x34 + offset_base) (BYTE_AT (0x34 + offset_base) BAND 239) + END ELSE BEGIN + WRITE_BYTE (0x34 + offset_base) (BYTE_AT (0x34 + offset_base) BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_animation_synchronised STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x34 + offset_base) BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_animation_wall_does_not_hide STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x34 + offset_base) (BYTE_AT (0x34 + offset_base) BAND 191) + END ELSE BEGIN + WRITE_BYTE (0x34 + offset_base) (BYTE_AT (0x34 + offset_base) BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_animation_wall_does_not_hide STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x34 + offset_base) BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_animation_invisible_in_dark STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x34 + offset_base) (BYTE_AT (0x34 + offset_base) BAND 127) + END ELSE BEGIN + WRITE_BYTE (0x34 + offset_base) (BYTE_AT (0x34 + offset_base) BOR 128) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_animation_invisible_in_dark STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x34 + offset_base) BAND 128) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_animation_not_cover STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x35 + offset_base) (BYTE_AT (0x35 + offset_base) BAND 254) + END ELSE BEGIN + WRITE_BYTE (0x35 + offset_base) (BYTE_AT (0x35 + offset_base) BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_animation_not_cover STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x35 + offset_base) BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_animation_play_all_frames STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x35 + offset_base) (BYTE_AT (0x35 + offset_base) BAND 253) + END ELSE BEGIN + WRITE_BYTE (0x35 + offset_base) (BYTE_AT (0x35 + offset_base) BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_animation_play_all_frames STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x35 + offset_base) BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_animation_palette STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x35 + offset_base) (BYTE_AT (0x35 + offset_base) BAND 251) + END ELSE BEGIN + WRITE_BYTE (0x35 + offset_base) (BYTE_AT (0x35 + offset_base) BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_animation_palette STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x35 + offset_base) BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_animation_mirrored STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x35 + offset_base) (BYTE_AT (0x35 + offset_base) BAND 247) + END ELSE BEGIN + WRITE_BYTE (0x35 + offset_base) (BYTE_AT (0x35 + offset_base) BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_animation_mirrored STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x35 + offset_base) BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_animation_show_in_combat STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x35 + offset_base) (BYTE_AT (0x35 + offset_base) BAND 239) + END ELSE BEGIN + WRITE_BYTE (0x35 + offset_base) (BYTE_AT (0x35 + offset_base) BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_animation_show_in_combat STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x35 + offset_base) BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_actor_present_0 STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x40 + offset_base) (BYTE_AT (0x40 + offset_base) BAND 254) + END ELSE BEGIN + WRITE_BYTE (0x40 + offset_base) (BYTE_AT (0x40 + offset_base) BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_actor_present_0 STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x40 + offset_base) BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_actor_present_1 STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x40 + offset_base) (BYTE_AT (0x40 + offset_base) BAND 253) + END ELSE BEGIN + WRITE_BYTE (0x40 + offset_base) (BYTE_AT (0x40 + offset_base) BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_actor_present_1 STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x40 + offset_base) BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_actor_present_2 STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x40 + offset_base) (BYTE_AT (0x40 + offset_base) BAND 251) + END ELSE BEGIN + WRITE_BYTE (0x40 + offset_base) (BYTE_AT (0x40 + offset_base) BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_actor_present_2 STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x40 + offset_base) BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_actor_present_3 STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x40 + offset_base) (BYTE_AT (0x40 + offset_base) BAND 247) + END ELSE BEGIN + WRITE_BYTE (0x40 + offset_base) (BYTE_AT (0x40 + offset_base) BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_actor_present_3 STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x40 + offset_base) BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_actor_present_4 STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x40 + offset_base) (BYTE_AT (0x40 + offset_base) BAND 239) + END ELSE BEGIN + WRITE_BYTE (0x40 + offset_base) (BYTE_AT (0x40 + offset_base) BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_actor_present_4 STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x40 + offset_base) BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_actor_present_5 STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x40 + offset_base) (BYTE_AT (0x40 + offset_base) BAND 223) + END ELSE BEGIN + WRITE_BYTE (0x40 + offset_base) (BYTE_AT (0x40 + offset_base) BOR 32) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_actor_present_5 STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x40 + offset_base) BAND 32) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_actor_present_6 STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x40 + offset_base) (BYTE_AT (0x40 + offset_base) BAND 191) + END ELSE BEGIN + WRITE_BYTE (0x40 + offset_base) (BYTE_AT (0x40 + offset_base) BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_actor_present_6 STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x40 + offset_base) BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_actor_present_7 STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x40 + offset_base) (BYTE_AT (0x40 + offset_base) BAND 127) + END ELSE BEGIN + WRITE_BYTE (0x40 + offset_base) (BYTE_AT (0x40 + offset_base) BOR 128) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_actor_present_7 STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x40 + offset_base) BAND 128) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_actor_present_8 STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x41 + offset_base) (BYTE_AT (0x41 + offset_base) BAND 254) + END ELSE BEGIN + WRITE_BYTE (0x41 + offset_base) (BYTE_AT (0x41 + offset_base) BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_actor_present_8 STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x41 + offset_base) BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_actor_present_9 STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x41 + offset_base) (BYTE_AT (0x41 + offset_base) BAND 253) + END ELSE BEGIN + WRITE_BYTE (0x41 + offset_base) (BYTE_AT (0x41 + offset_base) BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_actor_present_9 STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x41 + offset_base) BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_actor_present_10 STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x41 + offset_base) (BYTE_AT (0x41 + offset_base) BAND 251) + END ELSE BEGIN + WRITE_BYTE (0x41 + offset_base) (BYTE_AT (0x41 + offset_base) BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_actor_present_10 STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x41 + offset_base) BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_actor_present_11 STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x41 + offset_base) (BYTE_AT (0x41 + offset_base) BAND 247) + END ELSE BEGIN + WRITE_BYTE (0x41 + offset_base) (BYTE_AT (0x41 + offset_base) BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_actor_present_11 STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x41 + offset_base) BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_actor_present_12 STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x41 + offset_base) (BYTE_AT (0x41 + offset_base) BAND 239) + END ELSE BEGIN + WRITE_BYTE (0x41 + offset_base) (BYTE_AT (0x41 + offset_base) BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_actor_present_12 STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x41 + offset_base) BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_actor_present_13 STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x41 + offset_base) (BYTE_AT (0x41 + offset_base) BAND 223) + END ELSE BEGIN + WRITE_BYTE (0x41 + offset_base) (BYTE_AT (0x41 + offset_base) BOR 32) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_actor_present_13 STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x41 + offset_base) BAND 32) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_actor_present_14 STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x41 + offset_base) (BYTE_AT (0x41 + offset_base) BAND 191) + END ELSE BEGIN + WRITE_BYTE (0x41 + offset_base) (BYTE_AT (0x41 + offset_base) BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_actor_present_14 STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x41 + offset_base) BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_actor_present_15 STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x41 + offset_base) (BYTE_AT (0x41 + offset_base) BAND 127) + END ELSE BEGIN + WRITE_BYTE (0x41 + offset_base) (BYTE_AT (0x41 + offset_base) BOR 128) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_actor_present_15 STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x41 + offset_base) BAND 128) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_actor_present_16 STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x42 + offset_base) (BYTE_AT (0x42 + offset_base) BAND 254) + END ELSE BEGIN + WRITE_BYTE (0x42 + offset_base) (BYTE_AT (0x42 + offset_base) BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_actor_present_16 STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x42 + offset_base) BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_actor_present_17 STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x42 + offset_base) (BYTE_AT (0x42 + offset_base) BAND 253) + END ELSE BEGIN + WRITE_BYTE (0x42 + offset_base) (BYTE_AT (0x42 + offset_base) BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_actor_present_17 STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x42 + offset_base) BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_actor_present_18 STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x42 + offset_base) (BYTE_AT (0x42 + offset_base) BAND 251) + END ELSE BEGIN + WRITE_BYTE (0x42 + offset_base) (BYTE_AT (0x42 + offset_base) BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_actor_present_18 STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x42 + offset_base) BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_actor_present_19 STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x42 + offset_base) (BYTE_AT (0x42 + offset_base) BAND 247) + END ELSE BEGIN + WRITE_BYTE (0x42 + offset_base) (BYTE_AT (0x42 + offset_base) BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_actor_present_19 STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x42 + offset_base) BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_actor_present_20 STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x42 + offset_base) (BYTE_AT (0x42 + offset_base) BAND 239) + END ELSE BEGIN + WRITE_BYTE (0x42 + offset_base) (BYTE_AT (0x42 + offset_base) BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_actor_present_20 STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x42 + offset_base) BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_actor_present_21 STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x42 + offset_base) (BYTE_AT (0x42 + offset_base) BAND 223) + END ELSE BEGIN + WRITE_BYTE (0x42 + offset_base) (BYTE_AT (0x42 + offset_base) BOR 32) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_actor_present_21 STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x42 + offset_base) BAND 32) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_actor_present_22 STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x42 + offset_base) (BYTE_AT (0x42 + offset_base) BAND 191) + END ELSE BEGIN + WRITE_BYTE (0x42 + offset_base) (BYTE_AT (0x42 + offset_base) BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_actor_present_22 STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x42 + offset_base) BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_actor_present_23 STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x42 + offset_base) (BYTE_AT (0x42 + offset_base) BAND 127) + END ELSE BEGIN + WRITE_BYTE (0x42 + offset_base) (BYTE_AT (0x42 + offset_base) BOR 128) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_actor_present_23 STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x42 + offset_base) BAND 128) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_save_not_allowed STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x14 + offset_base) (BYTE_AT (0x14 + offset_base) BAND 254) + END ELSE BEGIN + WRITE_BYTE (0x14 + offset_base) (BYTE_AT (0x14 + offset_base) BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_save_not_allowed STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x14 + offset_base) BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_player1_can_die STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x14 + offset_base) (BYTE_AT (0x14 + offset_base) BAND 239) + END ELSE BEGIN + WRITE_BYTE (0x14 + offset_base) (BYTE_AT (0x14 + offset_base) BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_player1_can_die STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x14 + offset_base) BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_container_disabled STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x28 + offset_base) (BYTE_AT (0x28 + offset_base) BAND 223) + END ELSE BEGIN + WRITE_BYTE (0x28 + offset_base) (BYTE_AT (0x28 + offset_base) BOR 32) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_container_disabled STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x28 + offset_base) BAND 32) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_container_locked STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x28 + offset_base) (BYTE_AT (0x28 + offset_base) BAND 254) + END ELSE BEGIN + WRITE_BYTE (0x28 + offset_base) (BYTE_AT (0x28 + offset_base) BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_container_locked STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x28 + offset_base) BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_door_open STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x28 + offset_base) (BYTE_AT (0x28 + offset_base) BAND 254) + END ELSE BEGIN + WRITE_BYTE (0x28 + offset_base) (BYTE_AT (0x28 + offset_base) BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_door_open STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x28 + offset_base) BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_door_locked STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x28 + offset_base) (BYTE_AT (0x28 + offset_base) BAND 253) + END ELSE BEGIN + WRITE_BYTE (0x28 + offset_base) (BYTE_AT (0x28 + offset_base) BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_door_locked STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x28 + offset_base) BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_override_script_name STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x28 + offset_base) (BYTE_AT (0x28 + offset_base) BAND 247) + END ELSE BEGIN + WRITE_BYTE (0x28 + offset_base) (BYTE_AT (0x28 + offset_base) BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_override_script_name STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x28 + offset_base) BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_invulnerable STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x28 + offset_base) (BYTE_AT (0x28 + offset_base) BAND 251) + END ELSE BEGIN + WRITE_BYTE (0x28 + offset_base) (BYTE_AT (0x28 + offset_base) BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_invulnerable STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x28 + offset_base) BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_dont_block_line_of_sight STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x29 + offset_base) (BYTE_AT (0x29 + offset_base) BAND 251) + END ELSE BEGIN + WRITE_BYTE (0x29 + offset_base) (BYTE_AT (0x29 + offset_base) BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ARE_read_dont_block_line_of_sight STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x29 + offset_base) BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ARE_actor_animation STR_VAR arguments="" RET value BEGIN + + PATCH_IF "%arguments%" STRING_COMPARE_CASE "no_change" BEGIN + SET ids_value = IDS_OF_SYMBOL (ANIMATE "%arguments%") + PATCH_IF ids_value>0 BEGIN + WRITE_LONG 0x30 ids_value + END ELSE BEGIN + PATCH_FAIL "Tried to set nonexistent ANIMATE entry %arguments%" + END + SET value=1 + END + END + DEFINE_PATCH_FUNCTION ARE_read_actor_animation STR_VAR arguments="" RET value BEGIN + READ_LONG 0x30 value_ids + LOOKUP_IDS_SYMBOL_OF_INT value ANIMATE value_ids + END + + + DEFINE_PATCH_FUNCTION CRE_name1_string + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x8 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_name1_stringGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x8 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x8 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_name1_stringLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x8 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x8 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_name1_string + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x8 value + END + + + DEFINE_PATCH_FUNCTION CRE_name2_string + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0xc arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_name2_stringGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0xc < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0xc arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_name2_stringLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0xc > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0xc arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_name2_string + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0xc value + END + + + DEFINE_PATCH_FUNCTION CRE_xp_value + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x14 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_xp_valueGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x14 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x14 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_xp_valueLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x14 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x14 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_xp_value + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x14 value + END + + + DEFINE_PATCH_FUNCTION CRE_xp_total + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x18 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_xp_totalGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x18 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x18 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_xp_totalLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x18 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x18 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_xp_total + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x18 value + END + + + DEFINE_PATCH_FUNCTION CRE_gold + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x1c arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_goldGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x1c < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x1c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_goldLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x1c > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x1c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_gold + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x1c value + END + + + DEFINE_PATCH_FUNCTION CRE_color_metal + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x2c arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_color_metalGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x2c < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x2c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_color_metalLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x2c > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x2c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_color_metal + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x2c value + END + + + DEFINE_PATCH_FUNCTION CRE_color_minor + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x2d arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_color_minorGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x2d < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x2d arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_color_minorLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x2d > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x2d arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_color_minor + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x2d value + END + + + DEFINE_PATCH_FUNCTION CRE_color_major + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x2e arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_color_majorGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x2e < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x2e arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_color_majorLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x2e > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x2e arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_color_major + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x2e value + END + + + DEFINE_PATCH_FUNCTION CRE_color_skin + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x2f arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_color_skinGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x2f < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x2f arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_color_skinLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x2f > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x2f arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_color_skin + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x2f value + END + + + DEFINE_PATCH_FUNCTION CRE_color_leather + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x30 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_color_leatherGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x30 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x30 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_color_leatherLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x30 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x30 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_color_leather + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x30 value + END + + + DEFINE_PATCH_FUNCTION CRE_color_armor + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x31 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_color_armorGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x31 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x31 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_color_armorLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x31 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x31 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_color_armor + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x31 value + END + + + DEFINE_PATCH_FUNCTION CRE_color_hair + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x32 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_color_hairGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x32 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x32 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_color_hairLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x32 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x32 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_color_hair + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x32 value + END + + DEFINE_PATCH_FUNCTION CRE_portrait_small + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x34 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x34 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_portrait_small + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x34 value + END + + DEFINE_PATCH_FUNCTION CRE_portrait_large + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x3c "" (8) + END + DEFAULT + WRITE_ASCIIE 0x3c "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_portrait_large + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x3c value + END + + + DEFINE_PATCH_FUNCTION CRE_hide_in_shadows + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x45 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_hide_in_shadowsGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x45 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x45 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_hide_in_shadowsLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x45 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x45 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_hide_in_shadows + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x45 value + END + + + DEFINE_PATCH_FUNCTION CRE_detect_illusions + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x64 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_detect_illusionsGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x64 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x64 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_detect_illusionsLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x64 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x64 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_detect_illusions + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x64 value + END + + + DEFINE_PATCH_FUNCTION CRE_set_traps + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x65 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_set_trapsGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x65 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x65 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_set_trapsLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x65 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x65 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_set_traps + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x65 value + END + + + DEFINE_PATCH_FUNCTION CRE_lore + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x66 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_loreGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x66 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x66 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_loreLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x66 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x66 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_lore + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x66 value + END + + + DEFINE_PATCH_FUNCTION CRE_open_locks + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x67 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_open_locksGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x67 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x67 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_open_locksLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x67 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x67 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_open_locks + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x67 value + END + + + DEFINE_PATCH_FUNCTION CRE_move_silently + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x68 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_move_silentlyGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x68 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x68 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_move_silentlyLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x68 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x68 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_move_silently + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x68 value + END + + + DEFINE_PATCH_FUNCTION CRE_find_traps + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x69 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_find_trapsGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x69 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x69 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_find_trapsLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x69 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x69 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_find_traps + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x69 value + END + + + DEFINE_PATCH_FUNCTION CRE_pick_pockets + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x6a arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_pick_pocketsGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x6a < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x6a arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_pick_pocketsLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x6a > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x6a arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_pick_pockets + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x6a value + END + + + DEFINE_PATCH_FUNCTION CRE_resist_fire + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x59 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_resist_fireGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x59 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x59 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_resist_fireLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x59 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x59 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_resist_fire STR_VAR arguments=~null~ RET value BEGIN READ_SBYTE 0x59 value END + + + DEFINE_PATCH_FUNCTION CRE_resist_cold + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x5a arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_resist_coldGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x5a < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x5a arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_resist_coldLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x5a > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x5a arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_resist_cold STR_VAR arguments=~null~ RET value BEGIN READ_SBYTE 0x5a value END + + + DEFINE_PATCH_FUNCTION CRE_resist_electricity + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x5b arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_resist_electricityGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x5b < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x5b arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_resist_electricityLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x5b > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x5b arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_resist_electricity STR_VAR arguments=~null~ RET value BEGIN READ_SBYTE 0x5b value END + + + DEFINE_PATCH_FUNCTION CRE_resist_acid + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x5c arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_resist_acidGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x5c < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x5c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_resist_acidLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x5c > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x5c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_resist_acid STR_VAR arguments=~null~ RET value BEGIN READ_SBYTE 0x5c value END + + + DEFINE_PATCH_FUNCTION CRE_resist_magic + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x5d arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_resist_magicGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x5d < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x5d arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_resist_magicLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x5d > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x5d arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_resist_magic STR_VAR arguments=~null~ RET value BEGIN READ_SBYTE 0x5d value END + + + DEFINE_PATCH_FUNCTION CRE_resist_magic_fire + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x5e arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_resist_magic_fireGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x5e < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x5e arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_resist_magic_fireLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x5e > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x5e arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_resist_magic_fire STR_VAR arguments=~null~ RET value BEGIN READ_SBYTE 0x5e value END + + + DEFINE_PATCH_FUNCTION CRE_resist_magic_cold + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x5f arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_resist_magic_coldGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x5f < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x5f arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_resist_magic_coldLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x5f > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x5f arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_resist_magic_cold STR_VAR arguments=~null~ RET value BEGIN READ_SBYTE 0x5f value END + + + DEFINE_PATCH_FUNCTION CRE_resist_slashing + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x60 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_resist_slashingGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x60 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x60 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_resist_slashingLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x60 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x60 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_resist_slashing STR_VAR arguments=~null~ RET value BEGIN READ_SBYTE 0x60 value END + + + DEFINE_PATCH_FUNCTION CRE_resist_crushing + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x61 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_resist_crushingGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x61 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x61 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_resist_crushingLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x61 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x61 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_resist_crushing STR_VAR arguments=~null~ RET value BEGIN READ_SBYTE 0x61 value END + + + DEFINE_PATCH_FUNCTION CRE_resist_piercing + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x62 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_resist_piercingGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x62 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x62 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_resist_piercingLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x62 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x62 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_resist_piercing STR_VAR arguments=~null~ RET value BEGIN READ_SBYTE 0x62 value END + + + DEFINE_PATCH_FUNCTION CRE_resist_missile + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x63 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_resist_missileGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x63 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x63 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_resist_missileLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x63 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x63 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_resist_missile STR_VAR arguments=~null~ RET value BEGIN READ_SBYTE 0x63 value END + + + DEFINE_PATCH_FUNCTION CRE_level + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x234 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_levelGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x234 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x234 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_levelLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x234 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x234 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_level + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x234 value + END + + + DEFINE_PATCH_FUNCTION CRE_level1 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x234 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_level1GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x234 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x234 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_level1LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x234 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x234 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_level1 + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x234 value + END + + + DEFINE_PATCH_FUNCTION CRE_level2 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x235 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_level2GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x235 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x235 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_level2LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x235 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x235 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_level2 + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x235 value + END + + + DEFINE_PATCH_FUNCTION CRE_level3 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x236 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_level3GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x236 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x236 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_level3LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x236 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x236 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_level3 + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x236 value + END + + + DEFINE_PATCH_FUNCTION CRE_str + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x238 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_strGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x238 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x238 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_strLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x238 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x238 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_str + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x238 value + END + + + DEFINE_PATCH_FUNCTION CRE_str_ex + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x239 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_str_exGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x239 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x239 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_str_exLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x239 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x239 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_str_ex + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x239 value + END + + + DEFINE_PATCH_FUNCTION CRE_int + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x23a arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_intGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x23a < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x23a arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_intLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x23a > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x23a arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_int + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x23a value + END + + + DEFINE_PATCH_FUNCTION CRE_wis + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x23b arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_wisGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x23b < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x23b arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_wisLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x23b > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x23b arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_wis + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x23b value + END + + + DEFINE_PATCH_FUNCTION CRE_dex + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x23c arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_dexGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x23c < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x23c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_dexLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x23c > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x23c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_dex + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x23c value + END + + + DEFINE_PATCH_FUNCTION CRE_con + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x23d arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_conGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x23d < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x23d arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_conLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x23d > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x23d arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_con + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x23d value + END + + + DEFINE_PATCH_FUNCTION CRE_cha + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x23e arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_chaGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x23e < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x23e arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_chaLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x23e > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x23e arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_cha + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x23e value + END + + + DEFINE_PATCH_FUNCTION CRE_strength + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x238 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_strengthGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x238 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x238 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_strengthLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x238 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x238 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_strength + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x238 value + END + + + DEFINE_PATCH_FUNCTION CRE_strength_ex + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x239 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_strength_exGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x239 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x239 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_strength_exLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x239 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x239 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_strength_ex + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x239 value + END + + + DEFINE_PATCH_FUNCTION CRE_intelligence + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x23a arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_intelligenceGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x23a < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x23a arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_intelligenceLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x23a > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x23a arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_intelligence + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x23a value + END + + + DEFINE_PATCH_FUNCTION CRE_wisdom + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x23b arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_wisdomGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x23b < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x23b arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_wisdomLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x23b > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x23b arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_wisdom + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x23b value + END + + + DEFINE_PATCH_FUNCTION CRE_dexterity + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x23c arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_dexterityGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x23c < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x23c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_dexterityLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x23c > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x23c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_dexterity + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x23c value + END + + + DEFINE_PATCH_FUNCTION CRE_constitution + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x23d arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_constitutionGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x23d < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x23d arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_constitutionLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x23d > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x23d arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_constitution + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x23d value + END + + + DEFINE_PATCH_FUNCTION CRE_charisma + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x23e arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_charismaGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x23e < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x23e arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_charismaLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x23e > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x23e arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_charisma + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x23e value + END + + + DEFINE_PATCH_FUNCTION CRE_sex + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x237 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_sexGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x237 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x237 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_sexLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x237 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x237 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_sex + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x237 value + END + + DEFINE_PATCH_FUNCTION CRE_script_override + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x248 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x248 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_script_override + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x248 value + END + + DEFINE_PATCH_FUNCTION CRE_script_class + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x250 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x250 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_script_class + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x250 value + END + + DEFINE_PATCH_FUNCTION CRE_script_race + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x258 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x258 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_script_race + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x258 value + END + + DEFINE_PATCH_FUNCTION CRE_script_general + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x260 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x260 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_script_general + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x260 value + END + + DEFINE_PATCH_FUNCTION CRE_script_default + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x268 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x268 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_script_default + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x268 value + END + + + DEFINE_PATCH_FUNCTION CRE_specifics + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x274 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_specificsGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x274 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x274 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_specificsLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x274 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x274 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_specifics + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x274 value + END + + + DEFINE_PATCH_FUNCTION CRE_save_vs_death + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x54 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_save_vs_deathGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x54 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x54 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_save_vs_deathLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x54 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x54 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_save_vs_death STR_VAR arguments=~null~ RET value BEGIN READ_SBYTE 0x54 value END + + + DEFINE_PATCH_FUNCTION CRE_save_vs_wand + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x55 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_save_vs_wandGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x55 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x55 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_save_vs_wandLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x55 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x55 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_save_vs_wand STR_VAR arguments=~null~ RET value BEGIN READ_SBYTE 0x55 value END + + + DEFINE_PATCH_FUNCTION CRE_save_vs_wands + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x55 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_save_vs_wandsGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x55 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x55 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_save_vs_wandsLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x55 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x55 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_save_vs_wands STR_VAR arguments=~null~ RET value BEGIN READ_SBYTE 0x55 value END + + + DEFINE_PATCH_FUNCTION CRE_save_vs_poly + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x56 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_save_vs_polyGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x56 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x56 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_save_vs_polyLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x56 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x56 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_save_vs_poly STR_VAR arguments=~null~ RET value BEGIN READ_SBYTE 0x56 value END + + + DEFINE_PATCH_FUNCTION CRE_save_vs_polymorph + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x56 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_save_vs_polymorphGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x56 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x56 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_save_vs_polymorphLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x56 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x56 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_save_vs_polymorph STR_VAR arguments=~null~ RET value BEGIN READ_SBYTE 0x56 value END + + + DEFINE_PATCH_FUNCTION CRE_save_vs_breath + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x57 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_save_vs_breathGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x57 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x57 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_save_vs_breathLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x57 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x57 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_save_vs_breath STR_VAR arguments=~null~ RET value BEGIN READ_SBYTE 0x57 value END + + + DEFINE_PATCH_FUNCTION CRE_save_vs_spell + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x58 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_save_vs_spellGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x58 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x58 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_save_vs_spellLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x58 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x58 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_save_vs_spell STR_VAR arguments=~null~ RET value BEGIN READ_SBYTE 0x58 value END + + + DEFINE_PATCH_FUNCTION CRE_save_vs_spells + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x58 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_save_vs_spellsGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x58 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x58 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_save_vs_spellsLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x58 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x58 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_save_vs_spells STR_VAR arguments=~null~ RET value BEGIN READ_SBYTE 0x58 value END + + + DEFINE_PATCH_FUNCTION CRE_thac0 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x52 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_thac0GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x52 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x52 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_thac0LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SBYTE_AT 0x52 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x52 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_thac0 STR_VAR arguments=~null~ RET value BEGIN READ_SBYTE 0x52 value END + + + DEFINE_PATCH_FUNCTION CRE_attacks + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x53 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_attacksGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x53 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x53 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_attacksLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x53 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x53 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_attacks + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x53 value + END + + + DEFINE_PATCH_FUNCTION CRE_hp_max + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x26 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_hp_maxGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x26 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x26 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_hp_maxLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x26 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x26 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_hp_max + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x26 value + END + + + DEFINE_PATCH_FUNCTION CRE_hp_current + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x24 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_hp_currentGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x24 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x24 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_hp_currentLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x24 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x24 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_hp_current + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x24 value + END + + DEFINE_PATCH_FUNCTION CRE_dv + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x280 "" (0x20) + END + DEFAULT + WRITE_ASCIIE 0x280 "%arguments%" (0x20) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_dv + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x280 value (0x20) NULL + END + + DEFINE_PATCH_FUNCTION CRE_dialog + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x2cc "" (8) + END + DEFAULT + WRITE_ASCIIE 0x2cc "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_dialog + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x2cc value + END + + + DEFINE_PATCH_FUNCTION CRE_animation_code + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x28 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_animation_codeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x28 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x28 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_animation_codeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x28 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x28 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_animation_code + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x28 value + END + + + DEFINE_PATCH_FUNCTION CRE_effect_type + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x33 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_effect_typeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x33 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x33 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_effect_typeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x33 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x33 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_effect_type + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x33 value + END + + + DEFINE_PATCH_FUNCTION CRE_ac_natural + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x46 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_ac_naturalGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SSHORT_AT 0x46 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x46 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_ac_naturalLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SSHORT_AT 0x46 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x46 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_ac_natural STR_VAR arguments=~null~ RET value BEGIN READ_SSHORT 0x46 value END + + + DEFINE_PATCH_FUNCTION CRE_ac_effective + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x48 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_ac_effectiveGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SSHORT_AT 0x48 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x48 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_ac_effectiveLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SSHORT_AT 0x48 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x48 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_ac_effective STR_VAR arguments=~null~ RET value BEGIN READ_SSHORT 0x48 value END + + + DEFINE_PATCH_FUNCTION CRE_ac_vs_crushing + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x4a arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_ac_vs_crushingGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SSHORT_AT 0x4a < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x4a arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_ac_vs_crushingLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SSHORT_AT 0x4a > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x4a arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_ac_vs_crushing STR_VAR arguments=~null~ RET value BEGIN READ_SSHORT 0x4a value END + + + DEFINE_PATCH_FUNCTION CRE_ac_vs_missiles + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x4c arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_ac_vs_missilesGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SSHORT_AT 0x4c < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x4c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_ac_vs_missilesLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SSHORT_AT 0x4c > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x4c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_ac_vs_missiles STR_VAR arguments=~null~ RET value BEGIN READ_SSHORT 0x4c value END + + + DEFINE_PATCH_FUNCTION CRE_ac_vs_piercing + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x4e arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_ac_vs_piercingGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SSHORT_AT 0x4e < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x4e arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_ac_vs_piercingLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SSHORT_AT 0x4e > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x4e arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_ac_vs_piercing STR_VAR arguments=~null~ RET value BEGIN READ_SSHORT 0x4e value END + + + DEFINE_PATCH_FUNCTION CRE_ac_vs_slashing + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x50 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_ac_vs_slashingGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SSHORT_AT 0x50 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x50 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_ac_vs_slashingLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SSHORT_AT 0x50 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x50 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_ac_vs_slashing STR_VAR arguments=~null~ RET value BEGIN READ_SSHORT 0x50 value END + + + DEFINE_PATCH_FUNCTION CRE_morale + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x23f arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_moraleGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x23f < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x23f arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_moraleLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x23f > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x23f arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_morale + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x23f value + END + + + DEFINE_PATCH_FUNCTION CRE_morale_break + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x240 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_morale_breakGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x240 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x240 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_morale_breakLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x240 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x240 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_morale_break + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x240 value + END + + + DEFINE_PATCH_FUNCTION CRE_nightmare_mode + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x7d arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_nightmare_modeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x7d < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x7d arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_nightmare_modeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x7d > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x7d arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_nightmare_mode + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x7d value + END + + DEFINE_PATCH_FUNCTION CRE_item_resource + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x0 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x0 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_item_resource + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x0 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION CRE_item_charges_1 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_item_charges_1GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xa + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_item_charges_1LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xa + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_item_charges_1 + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0xa + offset_base) value + END + + + DEFINE_PATCH_FUNCTION CRE_item_charges_2 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xc + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_item_charges_2GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xc + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xc + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_item_charges_2LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xc + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xc + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_item_charges_2 + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0xc + offset_base) value + END + + + DEFINE_PATCH_FUNCTION CRE_item_charges_3 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xe + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_item_charges_3GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xe + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xe + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_item_charges_3LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xe + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xe + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_item_charges_3 + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0xe + offset_base) value + END + + DEFINE_PATCH_FUNCTION CRE_spell_resource + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x0 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x0 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_spell_resource + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x0 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION CRE_opcode + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x8 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_opcodeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x8 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x8 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_opcodeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x8 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x8 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_opcode + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x8 + offset_base) value + END + + DEFINE_PATCH_FUNCTION CRE_resource + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x28 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x28 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_resource + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x28 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION CRE_target + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0xc + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_targetGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0xc + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0xc + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_targetLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0xc + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0xc + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_target + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0xc + offset_base) value + END + + DEFINE_PATCH_FUNCTION CRE_effect_resource + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x28 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x28 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_effect_resource + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x28 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION CRE_timing + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x1c + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_timingGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x1c + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x1c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_timingLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x1c + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x1c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_timing + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x1c + offset_base) value + END + + + DEFINE_PATCH_FUNCTION CRE_probability1 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x24 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_probability1GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x24 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x24 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_probability1LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x24 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x24 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_probability1 + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x24 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION CRE_probability2 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x26 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_probability2GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x26 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x26 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_probability2LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x26 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x26 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_probability2 + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x26 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION CRE_duration + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x20 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_durationGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x20 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x20 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_durationLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x20 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x20 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_duration + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x20 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION CRE_parameter1 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x14 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_parameter1GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x14 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x14 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_parameter1LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x14 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x14 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_parameter1 + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x14 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION CRE_parameter2 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x18 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_parameter2GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x18 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x18 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_parameter2LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x18 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x18 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_parameter2 + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x18 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION CRE_item_slot + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x0 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_item_slotGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x0 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x0 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_item_slotLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x0 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x0 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_item_slot + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x0 + offset_base) value + END + + DEFINE_PATCH_FUNCTION CRE_memorized_spell + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x0 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x0 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_memorized_spell + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x0 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION CRE_resist_dispel + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x54 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_resist_dispelGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x54 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x54 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_resist_dispelLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x54 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x54 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_resist_dispel + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x54 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION CRE_memorization_level + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x0 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_memorization_levelGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x0 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x0 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_memorization_levelLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x0 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x0 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_memorization_level + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x0 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION CRE_number_can_memorize + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x2 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_number_can_memorizeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x2 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x2 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_number_can_memorizeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x2 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x2 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_number_can_memorize + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x2 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION CRE_number_has_memorized + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x4 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_number_has_memorizedGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x4 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x4 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_number_has_memorizedLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x4 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x4 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_number_has_memorized + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x4 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION CRE_memorization_type + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x6 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_memorization_typeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x6 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x6 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_memorization_typeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x6 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x6 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_memorization_type + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x6 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION CRE_parent_resource_type + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x88 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_parent_resource_typeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x88 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x88 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_parent_resource_typeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x88 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x88 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_parent_resource_type + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x88 + offset_base) value + END + + DEFINE_PATCH_FUNCTION CRE_parent_resource + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x8c + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x8c + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_parent_resource + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x8c + offset_base) value + END + + + DEFINE_PATCH_FUNCTION CRE_parent_item_slot + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x9c + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_parent_item_slotGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x9c + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x9c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_parent_item_slotLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x9c + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x9c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_parent_item_slot + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x9c + offset_base) value + END + + + DEFINE_PATCH_FUNCTION CRE_mode + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x40 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_modeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x40 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x40 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_modeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x40 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x40 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_mode + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x40 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION CRE_power + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x18 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_powerGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x18 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x18 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_powerLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x18 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x18 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_power + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x18 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION CRE_no_corpse STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x10 (BYTE_AT 0x10 BAND 253) + END ELSE BEGIN + WRITE_BYTE 0x10 (BYTE_AT 0x10 BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_no_corpse STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x10 BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_permanent_corpse STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x10 (BYTE_AT 0x10 BAND 251) + END ELSE BEGIN + WRITE_BYTE 0x10 (BYTE_AT 0x10 BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_permanent_corpse STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x10 BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_original_class_fighter STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x10 (BYTE_AT 0x10 BAND 247) + END ELSE BEGIN + WRITE_BYTE 0x10 (BYTE_AT 0x10 BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_original_class_fighter STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x10 BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_original_class_mage STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x10 (BYTE_AT 0x10 BAND 239) + END ELSE BEGIN + WRITE_BYTE 0x10 (BYTE_AT 0x10 BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_original_class_mage STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x10 BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_original_class_cleric STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x10 (BYTE_AT 0x10 BAND 223) + END ELSE BEGIN + WRITE_BYTE 0x10 (BYTE_AT 0x10 BOR 32) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_original_class_cleric STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x10 BAND 32) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_original_class_thief STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x10 (BYTE_AT 0x10 BAND 191) + END ELSE BEGIN + WRITE_BYTE 0x10 (BYTE_AT 0x10 BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_original_class_thief STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x10 BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_original_class_druid STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x10 (BYTE_AT 0x10 BAND 127) + END ELSE BEGIN + WRITE_BYTE 0x10 (BYTE_AT 0x10 BOR 128) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_original_class_druid STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x10 BAND 128) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_original_class_ranger STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x11 (BYTE_AT 0x11 BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x11 (BYTE_AT 0x11 BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_original_class_ranger STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x11 BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_ignore_nightmare_mode STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x12 (BYTE_AT 0x12 BAND 191) + END ELSE BEGIN + WRITE_BYTE 0x12 (BYTE_AT 0x12 BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_ignore_nightmare_mode STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x12 BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_state_sleeping STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_state_sleeping STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x20 BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_state_berserk STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BAND 253) + END ELSE BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_state_berserk STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x20 BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_state_panic STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BAND 251) + END ELSE BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_state_panic STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x20 BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_state_stunned STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BAND 247) + END ELSE BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_state_stunned STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x20 BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_state_invisible STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BAND 239) + END ELSE BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_state_invisible STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x20 BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_state_helpless STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BAND 223) + END ELSE BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BOR 32) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_state_helpless STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x20 BAND 32) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_state_frozen_death STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BAND 191) + END ELSE BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_state_frozen_death STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x20 BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_state_stone_death STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BAND 127) + END ELSE BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BOR 128) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_state_stone_death STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x20 BAND 128) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_state_exploding_death STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_state_exploding_death STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x21 BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_state_flame_death STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BAND 253) + END ELSE BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_state_flame_death STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x21 BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_state_acid_death STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BAND 251) + END ELSE BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_state_acid_death STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x21 BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_state_dead STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BAND 247) + END ELSE BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_state_dead STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x21 BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_state_silenced STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BAND 239) + END ELSE BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_state_silenced STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x21 BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_state_charmed STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BAND 223) + END ELSE BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BOR 32) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_state_charmed STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x21 BAND 32) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_state_poisoned STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BAND 191) + END ELSE BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_state_poisoned STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x21 BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_state_hasted STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BAND 127) + END ELSE BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BOR 128) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_state_hasted STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x21 BAND 128) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_state_slowed STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x22 (BYTE_AT 0x22 BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x22 (BYTE_AT 0x22 BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_state_slowed STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x22 BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_state_infravision STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x22 (BYTE_AT 0x22 BAND 253) + END ELSE BEGIN + WRITE_BYTE 0x22 (BYTE_AT 0x22 BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_state_infravision STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x22 BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_state_blind STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x22 (BYTE_AT 0x22 BAND 251) + END ELSE BEGIN + WRITE_BYTE 0x22 (BYTE_AT 0x22 BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_state_blind STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x22 BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_state_diseased STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x22 (BYTE_AT 0x22 BAND 247) + END ELSE BEGIN + WRITE_BYTE 0x22 (BYTE_AT 0x22 BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_state_diseased STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x22 BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_state_feebleminded STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x22 (BYTE_AT 0x22 BAND 239) + END ELSE BEGIN + WRITE_BYTE 0x22 (BYTE_AT 0x22 BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_state_feebleminded STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x22 BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_state_nondetection STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x22 (BYTE_AT 0x22 BAND 223) + END ELSE BEGIN + WRITE_BYTE 0x22 (BYTE_AT 0x22 BOR 32) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_state_nondetection STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x22 BAND 32) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_state_improved_invisibility STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x22 (BYTE_AT 0x22 BAND 191) + END ELSE BEGIN + WRITE_BYTE 0x22 (BYTE_AT 0x22 BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_state_improved_invisibility STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x22 BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_state_bless STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x22 (BYTE_AT 0x22 BAND 127) + END ELSE BEGIN + WRITE_BYTE 0x22 (BYTE_AT 0x22 BOR 128) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_state_bless STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x22 BAND 128) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_state_chant STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x23 (BYTE_AT 0x23 BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x23 (BYTE_AT 0x23 BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_state_chant STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x23 BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_state_drawuponholymight STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x23 (BYTE_AT 0x23 BAND 253) + END ELSE BEGIN + WRITE_BYTE 0x23 (BYTE_AT 0x23 BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_state_drawuponholymight STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x23 BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_state_luck STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x23 (BYTE_AT 0x23 BAND 251) + END ELSE BEGIN + WRITE_BYTE 0x23 (BYTE_AT 0x23 BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_state_luck STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x23 BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_state_aid STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x23 (BYTE_AT 0x23 BAND 247) + END ELSE BEGIN + WRITE_BYTE 0x23 (BYTE_AT 0x23 BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_state_aid STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x23 BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_state_chantbad STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x23 (BYTE_AT 0x23 BAND 239) + END ELSE BEGIN + WRITE_BYTE 0x23 (BYTE_AT 0x23 BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_state_chantbad STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x23 BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_state_blur STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x23 (BYTE_AT 0x23 BAND 223) + END ELSE BEGIN + WRITE_BYTE 0x23 (BYTE_AT 0x23 BOR 32) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_state_blur STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x23 BAND 32) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_state_mirrorimage STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x23 (BYTE_AT 0x23 BAND 191) + END ELSE BEGIN + WRITE_BYTE 0x23 (BYTE_AT 0x23 BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_state_mirrorimage STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x23 BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_state_confused STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x23 (BYTE_AT 0x23 BAND 127) + END ELSE BEGIN + WRITE_BYTE 0x23 (BYTE_AT 0x23 BOR 128) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_state_confused STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x23 BAND 128) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_state_hidden STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x22 (BYTE_AT 0x22 BAND 247) + END ELSE BEGIN + WRITE_BYTE 0x22 (BYTE_AT 0x22 BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_state_hidden STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x22 BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_unstealable STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x10 + offset_base) (BYTE_AT (0x10 + offset_base) BAND 253) + END ELSE BEGIN + WRITE_BYTE (0x10 + offset_base) (BYTE_AT (0x10 + offset_base) BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_unstealable STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x10 + offset_base) BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_undroppable STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x10 + offset_base) (BYTE_AT (0x10 + offset_base) BAND 247) + END ELSE BEGIN + WRITE_BYTE (0x10 + offset_base) (BYTE_AT (0x10 + offset_base) BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION CRE_read_undroppable STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x10 + offset_base) BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION CRE_animation STR_VAR arguments="" RET value BEGIN + + PATCH_IF "%arguments%" STRING_COMPARE_CASE "no_change" BEGIN + SET ids_value = IDS_OF_SYMBOL (ANIMATE "%arguments%") + PATCH_IF ids_value>0 BEGIN + WRITE_SHORT 0x28 ids_value + END ELSE BEGIN + PATCH_FAIL "Tried to set nonexistent ANIMATE entry %arguments%" + END + SET value=1 + END + END + DEFINE_PATCH_FUNCTION CRE_read_animation STR_VAR arguments="" RET value BEGIN + READ_SHORT 0x28 value_ids + LOOKUP_IDS_SYMBOL_OF_INT value ANIMATE value_ids + END + + + DEFINE_PATCH_FUNCTION CRE_allegiance STR_VAR arguments="" RET value BEGIN + + PATCH_IF "%arguments%" STRING_COMPARE_CASE "no_change" BEGIN + SET ids_value = IDS_OF_SYMBOL (EA "%arguments%") + PATCH_IF ids_value>0 BEGIN + WRITE_BYTE 0x270 ids_value + END ELSE BEGIN + PATCH_FAIL "Tried to set nonexistent EA entry %arguments%" + END + SET value=1 + END + END + DEFINE_PATCH_FUNCTION CRE_read_allegiance STR_VAR arguments="" RET value BEGIN + READ_BYTE 0x270 value_ids + LOOKUP_IDS_SYMBOL_OF_INT value EA value_ids + END + + + DEFINE_PATCH_FUNCTION CRE_general STR_VAR arguments="" RET value BEGIN + + PATCH_IF "%arguments%" STRING_COMPARE_CASE "no_change" BEGIN + SET ids_value = IDS_OF_SYMBOL (general "%arguments%") + PATCH_IF ids_value>0 BEGIN + WRITE_BYTE 0x271 ids_value + END ELSE BEGIN + PATCH_FAIL "Tried to set nonexistent general entry %arguments%" + END + SET value=1 + END + END + DEFINE_PATCH_FUNCTION CRE_read_general STR_VAR arguments="" RET value BEGIN + READ_BYTE 0x271 value_ids + LOOKUP_IDS_SYMBOL_OF_INT value general value_ids + END + + + DEFINE_PATCH_FUNCTION CRE_race STR_VAR arguments="" RET value BEGIN + + PATCH_IF "%arguments%" STRING_COMPARE_CASE "no_change" BEGIN + SET ids_value = IDS_OF_SYMBOL (race "%arguments%") + PATCH_IF ids_value>0 BEGIN + WRITE_BYTE 0x272 ids_value + END ELSE BEGIN + PATCH_FAIL "Tried to set nonexistent race entry %arguments%" + END + SET value=1 + END + END + DEFINE_PATCH_FUNCTION CRE_read_race STR_VAR arguments="" RET value BEGIN + READ_BYTE 0x272 value_ids + LOOKUP_IDS_SYMBOL_OF_INT value race value_ids + END + + + DEFINE_PATCH_FUNCTION CRE_class STR_VAR arguments="" RET value BEGIN + + PATCH_IF "%arguments%" STRING_COMPARE_CASE "no_change" BEGIN + SET ids_value = IDS_OF_SYMBOL (class "%arguments%") + PATCH_IF ids_value>0 BEGIN + WRITE_BYTE 0x273 ids_value + END ELSE BEGIN + PATCH_FAIL "Tried to set nonexistent class entry %arguments%" + END + SET value=1 + END + END + DEFINE_PATCH_FUNCTION CRE_read_class STR_VAR arguments="" RET value BEGIN + READ_BYTE 0x273 value_ids + LOOKUP_IDS_SYMBOL_OF_INT value class value_ids + END + + + DEFINE_PATCH_FUNCTION CRE_gender STR_VAR arguments="" RET value BEGIN + + PATCH_IF "%arguments%" STRING_COMPARE_CASE "no_change" BEGIN + SET ids_value = IDS_OF_SYMBOL (gender "%arguments%") + PATCH_IF ids_value>0 BEGIN + WRITE_BYTE 0x275 ids_value + END ELSE BEGIN + PATCH_FAIL "Tried to set nonexistent gender entry %arguments%" + END + SET value=1 + END + END + DEFINE_PATCH_FUNCTION CRE_read_gender STR_VAR arguments="" RET value BEGIN + READ_BYTE 0x275 value_ids + LOOKUP_IDS_SYMBOL_OF_INT value gender value_ids + END + + + DEFINE_PATCH_FUNCTION CRE_alignment STR_VAR arguments="" RET value BEGIN + + PATCH_IF "%arguments%" STRING_COMPARE_CASE "no_change" BEGIN + SET ids_value = IDS_OF_SYMBOL (align "%arguments%") + PATCH_IF ids_value>0 BEGIN + WRITE_BYTE 0x27b ids_value + END ELSE BEGIN + PATCH_FAIL "Tried to set nonexistent align entry %arguments%" + END + SET value=1 + END + END + DEFINE_PATCH_FUNCTION CRE_read_alignment STR_VAR arguments="" RET value BEGIN + READ_BYTE 0x27b value_ids + LOOKUP_IDS_SYMBOL_OF_INT value align value_ids + END + + + DEFINE_PATCH_FUNCTION CRE_kit_vanilla STR_VAR arguments="" RET value BEGIN + + PATCH_IF "%arguments%" STRING_COMPARE_CASE "no_change" BEGIN + SET ids_value = IDS_OF_SYMBOL (kit "%arguments%") + PATCH_IF ids_value>0 BEGIN + LPF reverse_long INT_VAR input=ids_value RET ids_value=output END + WRITE_LONG 0x244 ids_value + END ELSE BEGIN + PATCH_FAIL "Tried to set nonexistent kit entry %arguments%" + END + SET value=1 + END + END + DEFINE_PATCH_FUNCTION CRE_read_kit_vanilla STR_VAR arguments="" RET value BEGIN + READ_LONG 0x244 value_ids + LPF reverse_long INT_VAR input=value_ids RET value_ids=output END + LOOKUP_IDS_SYMBOL_OF_INT value kit value_ids + END + + + DEFINE_PATCH_FUNCTION CRE_kit STR_VAR arguments="" RET value BEGIN + + PATCH_IF "%arguments%" STRING_COMPARE_CASE "no_change" BEGIN + SET ids_value = IDS_OF_SYMBOL (dw#kit "%arguments%") + PATCH_IF ids_value>0 BEGIN + LPF reverse_long INT_VAR input=ids_value RET ids_value=output END + WRITE_LONG 0x244 ids_value + END ELSE BEGIN + PATCH_FAIL "Tried to set nonexistent dw#kit entry %arguments%" + END + SET value=1 + END + END + DEFINE_PATCH_FUNCTION CRE_read_kit STR_VAR arguments="" RET value BEGIN + READ_LONG 0x244 value_ids + LPF reverse_long INT_VAR input=value_ids RET value_ids=output END + LOOKUP_IDS_SYMBOL_OF_INT value dw#kit value_ids + END + + + DEFINE_PATCH_FUNCTION DLG_response_text + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x04 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION DLG_response_textGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x04 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x04 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION DLG_response_textLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x04 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x04 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION DLG_read_response_text + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x04 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION DLG_journal_text + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x08 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION DLG_journal_textGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x08 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x08 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION DLG_journal_textLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x08 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x08 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION DLG_read_journal_text + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x08 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION DLG_associated_text STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x00 + offset_secondary) (BYTE_AT (0x00 + offset_secondary) BAND 254) + END ELSE BEGIN + WRITE_BYTE (0x00 + offset_secondary) (BYTE_AT (0x00 + offset_secondary) BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION DLG_read_associated_text STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x00 + offset_secondary) BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION DLG_associated_trigger STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x00 + offset_secondary) (BYTE_AT (0x00 + offset_secondary) BAND 253) + END ELSE BEGIN + WRITE_BYTE (0x00 + offset_secondary) (BYTE_AT (0x00 + offset_secondary) BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION DLG_read_associated_trigger STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x00 + offset_secondary) BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION DLG_associated_action STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x00 + offset_secondary) (BYTE_AT (0x00 + offset_secondary) BAND 251) + END ELSE BEGIN + WRITE_BYTE (0x00 + offset_secondary) (BYTE_AT (0x00 + offset_secondary) BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION DLG_read_associated_action STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x00 + offset_secondary) BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION DLG_terminates_dialog STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x00 + offset_secondary) (BYTE_AT (0x00 + offset_secondary) BAND 247) + END ELSE BEGIN + WRITE_BYTE (0x00 + offset_secondary) (BYTE_AT (0x00 + offset_secondary) BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION DLG_read_terminates_dialog STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x00 + offset_secondary) BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION DLG_journal_entry STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x00 + offset_secondary) (BYTE_AT (0x00 + offset_secondary) BAND 239) + END ELSE BEGIN + WRITE_BYTE (0x00 + offset_secondary) (BYTE_AT (0x00 + offset_secondary) BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION DLG_read_journal_entry STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x00 + offset_secondary) BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION DLG_add_unsolved_quest STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x00 + offset_secondary) (BYTE_AT (0x00 + offset_secondary) BAND 191) + END ELSE BEGIN + WRITE_BYTE (0x00 + offset_secondary) (BYTE_AT (0x00 + offset_secondary) BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION DLG_read_add_unsolved_quest STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x00 + offset_secondary) BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION DLG_add_solved_quest STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x01 + offset_secondary) (BYTE_AT (0x01 + offset_secondary) BAND 254) + END ELSE BEGIN + WRITE_BYTE (0x01 + offset_secondary) (BYTE_AT (0x01 + offset_secondary) BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION DLG_read_add_solved_quest STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x01 + offset_secondary) BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION EFF_opcode + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x10 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_opcodeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x10 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x10 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_opcodeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x10 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x10 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_opcode + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x10 value + END + + + DEFINE_PATCH_FUNCTION EFF_target + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x14 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_targetGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x14 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x14 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_targetLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x14 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x14 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_target + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x14 value + END + + + DEFINE_PATCH_FUNCTION EFF_power + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x18 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_powerGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x18 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x18 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_powerLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x18 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x18 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_power + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x18 value + END + + + DEFINE_PATCH_FUNCTION EFF_parameter1 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x1c arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_parameter1GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x1c < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x1c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_parameter1LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x1c > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x1c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_parameter1 + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x1c value + END + + + DEFINE_PATCH_FUNCTION EFF_parameter2 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x20 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_parameter2GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x20 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x20 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_parameter2LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x20 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x20 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_parameter2 + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x20 value + END + + + DEFINE_PATCH_FUNCTION EFF_parameter2a + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x20 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_parameter2aGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x20 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x20 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_parameter2aLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x20 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x20 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_parameter2a + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x20 value + END + + + DEFINE_PATCH_FUNCTION EFF_parameter2b + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x22 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_parameter2bGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x22 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x22 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_parameter2bLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x22 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x22 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_parameter2b + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x22 value + END + + + DEFINE_PATCH_FUNCTION EFF_timing + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x24 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_timingGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x24 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x24 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_timingLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x24 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x24 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_timing + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x24 value + END + + + DEFINE_PATCH_FUNCTION EFF_duration + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x28 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_durationGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x28 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x28 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_durationLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x28 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x28 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_duration + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x28 value + END + + + DEFINE_PATCH_FUNCTION EFF_probability1 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x2c arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_probability1GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x2c < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x2c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_probability1LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x2c > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x2c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_probability1 + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x2c value + END + + + DEFINE_PATCH_FUNCTION EFF_probability2 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x2e arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_probability2GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x2e < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x2e arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_probability2LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x2e > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x2e arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_probability2 + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x2e value + END + + DEFINE_PATCH_FUNCTION EFF_resource + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x30 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x30 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_resource + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x30 value + END + + + DEFINE_PATCH_FUNCTION EFF_dicenum + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x38 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_dicenumGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x38 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x38 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_dicenumLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x38 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x38 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_dicenum + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x38 value + END + + + DEFINE_PATCH_FUNCTION EFF_dicesize + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x3c arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_dicesizeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x3c < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x3c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_dicesizeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x3c > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x3c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_dicesize + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x3c value + END + + + DEFINE_PATCH_FUNCTION EFF_savebonus + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x44 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_savebonusGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x44 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x44 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_savebonusLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x44 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x44 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_savebonus + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x44 value + END + + + DEFINE_PATCH_FUNCTION EFF_resistance + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x5c arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_resistanceGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x5c < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x5c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_resistanceLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x5c > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x5c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_resistance + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x5c value + END + + + DEFINE_PATCH_FUNCTION EFF_resist_dispel + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x5c arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_resist_dispelGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x5c < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x5c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_resist_dispelLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x5c > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x5c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_resist_dispel + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x5c value + END + + + DEFINE_PATCH_FUNCTION EFF_parameter3 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x60 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_parameter3GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x60 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x60 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_parameter3LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x60 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x60 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_parameter3 + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x60 value + END + + + DEFINE_PATCH_FUNCTION EFF_parameter4 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x64 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_parameter4GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x64 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x64 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_parameter4LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x64 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x64 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_parameter4 + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x64 value + END + + DEFINE_PATCH_FUNCTION EFF_vvc + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x70 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x70 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_vvc + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x70 value + END + + DEFINE_PATCH_FUNCTION EFF_resource2 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x70 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x70 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_resource2 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x70 value + END + + + DEFINE_PATCH_FUNCTION EFF_caster_xloc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x80 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_caster_xlocGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x80 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x80 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_caster_xlocLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x80 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x80 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_caster_xloc + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x80 value + END + + + DEFINE_PATCH_FUNCTION EFF_caster_yloc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x84 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_caster_ylocGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x84 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x84 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_caster_ylocLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x84 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x84 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_caster_yloc + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x84 value + END + + + DEFINE_PATCH_FUNCTION EFF_target_xloc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x88 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_target_xlocGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x88 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x88 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_target_xlocLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x88 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x88 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_target_xloc + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x88 value + END + + + DEFINE_PATCH_FUNCTION EFF_target_yloc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x8c arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_target_ylocGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x8c < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x8c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_target_ylocLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x8c > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x8c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_target_yloc + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x8c value + END + + + DEFINE_PATCH_FUNCTION EFF_save_vs_spell STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x40 (BYTE_AT 0x40 BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x40 (BYTE_AT 0x40 BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_save_vs_spell STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x40 BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION EFF_save_spells STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x40 (BYTE_AT 0x40 BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x40 (BYTE_AT 0x40 BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_save_spells STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x40 BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION EFF_save_vs_breath STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x40 (BYTE_AT 0x40 BAND 253) + END ELSE BEGIN + WRITE_BYTE 0x40 (BYTE_AT 0x40 BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_save_vs_breath STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x40 BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION EFF_save_breath STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x40 (BYTE_AT 0x40 BAND 253) + END ELSE BEGIN + WRITE_BYTE 0x40 (BYTE_AT 0x40 BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_save_breath STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x40 BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION EFF_save_vs_death STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x40 (BYTE_AT 0x40 BAND 251) + END ELSE BEGIN + WRITE_BYTE 0x40 (BYTE_AT 0x40 BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_save_vs_death STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x40 BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION EFF_save_death STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x40 (BYTE_AT 0x40 BAND 251) + END ELSE BEGIN + WRITE_BYTE 0x40 (BYTE_AT 0x40 BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_save_death STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x40 BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION EFF_save_vs_wand STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x40 (BYTE_AT 0x40 BAND 247) + END ELSE BEGIN + WRITE_BYTE 0x40 (BYTE_AT 0x40 BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_save_vs_wand STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x40 BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION EFF_save_wands STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x40 (BYTE_AT 0x40 BAND 247) + END ELSE BEGIN + WRITE_BYTE 0x40 (BYTE_AT 0x40 BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_save_wands STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x40 BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION EFF_save_vs_polymorph STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x40 (BYTE_AT 0x40 BAND 239) + END ELSE BEGIN + WRITE_BYTE 0x40 (BYTE_AT 0x40 BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_save_vs_polymorph STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x40 BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION EFF_save_polymorph STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x40 (BYTE_AT 0x40 BAND 239) + END ELSE BEGIN + WRITE_BYTE 0x40 (BYTE_AT 0x40 BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_save_polymorph STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x40 BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION EFF_bypass_mirror_image STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x43 (BYTE_AT 0x43 BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x43 (BYTE_AT 0x43 BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_bypass_mirror_image STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x43 BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION EFF_fist_only STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x48 (BYTE_AT 0x48 BAND 251) + END ELSE BEGIN + WRITE_BYTE 0x48 (BYTE_AT 0x48 BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION EFF_read_fist_only STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x48 BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_name1_string + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x8 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_name1_stringGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x8 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x8 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_name1_stringLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x8 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x8 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_name1_string + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x8 value + END + + + DEFINE_PATCH_FUNCTION ITM_name2_string + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0xc arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_name2_stringGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0xc < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0xc arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_name2_stringLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0xc > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0xc arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_name2_string + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0xc value + END + + + DEFINE_PATCH_FUNCTION ITM_enchantment + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x60 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_enchantmentGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x60 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x60 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_enchantmentLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x60 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x60 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_enchantment + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x60 value + END + + + DEFINE_PATCH_FUNCTION ITM_category + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x1c arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_categoryGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x1c < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x1c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_categoryLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x1c > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x1c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_category + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x1c value + END + + DEFINE_PATCH_FUNCTION ITM_inventory + STR_VAR arguments="" RET value + BEGIN + + WRITE_ASCIIE 0x22 "%arguments%" (0x2) + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_inventory + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x22 value (0x2) NULL + END + + + DEFINE_PATCH_FUNCTION ITM_price + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x34 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_priceGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x34 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x34 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_priceLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x34 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x34 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_price + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x34 value + END + + + DEFINE_PATCH_FUNCTION ITM_max_in_stack + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x38 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_max_in_stackGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x38 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x38 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_max_in_stackLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x38 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x38 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_max_in_stack + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x38 value + END + + DEFINE_PATCH_FUNCTION ITM_icon + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x3a "" (8) + END + DEFAULT + WRITE_ASCIIE 0x3a "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_icon + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x3a value + END + + DEFINE_PATCH_FUNCTION ITM_icon_ground + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x44 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x44 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_icon_ground + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x44 value + END + + DEFINE_PATCH_FUNCTION ITM_icon_carried + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x58 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x58 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_icon_carried + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x58 value + END + + + DEFINE_PATCH_FUNCTION ITM_minimum_strength + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x26 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_minimum_strengthGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x26 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x26 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_minimum_strengthLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x26 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x26 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_minimum_strength + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x26 value + END + + + DEFINE_PATCH_FUNCTION ITM_lore + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x42 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_loreGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x42 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x42 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_loreLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x42 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x42 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_lore + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x42 value + END + + + DEFINE_PATCH_FUNCTION ITM_weight + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x4c arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_weightGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x4c < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x4c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_weightLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x4c > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x4c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_weight + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x4c value + END + + + DEFINE_PATCH_FUNCTION ITM_description1_string + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x50 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_description1_stringGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x50 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x50 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_description1_stringLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x50 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x50 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_description1_string + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x50 value + END + + + DEFINE_PATCH_FUNCTION ITM_description2_string + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x54 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_description2_stringGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x54 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x54 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_description2_stringLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x54 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x54 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_description2_string + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x54 value + END + + + DEFINE_PATCH_FUNCTION ITM_num_abils + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x68 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_num_abilsGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x68 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x68 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_num_abilsLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x68 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x68 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_num_abils + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x68 value + END + + + DEFINE_PATCH_FUNCTION ITM_proficiency_code + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x31 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_proficiency_codeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x31 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x31 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_proficiency_codeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x31 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x31 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_proficiency_code + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x31 value + END + + + DEFINE_PATCH_FUNCTION ITM_ability_type + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x0 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_ability_typeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x0 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x0 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_ability_typeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x0 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x0 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_ability_type + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0x0 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ITM_ability_icon_loc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x2 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_ability_icon_locGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x2 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x2 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_ability_icon_locLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x2 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x2 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_ability_icon_loc + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0x2 + offset_base) value + END + + DEFINE_PATCH_FUNCTION ITM_ability_icon + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x4 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x4 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_ability_icon + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x4 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ITM_ability_target + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0xc + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_ability_targetGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0xc + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0xc + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_ability_targetLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0xc + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0xc + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_ability_target + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0xc + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ITM_ability_target_count + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0xd + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_ability_target_countGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0xd + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0xd + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_ability_target_countLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0xd + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0xd + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_ability_target_count + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0xd + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ITM_ability_range + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xe + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_ability_rangeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xe + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xe + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_ability_rangeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xe + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xe + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_ability_range + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0xe + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ITM_launcher_required + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x10 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_launcher_requiredGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x10 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x10 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_launcher_requiredLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x10 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x10 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_launcher_required + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x10 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ITM_speed + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x12 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_speedGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x12 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x12 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_speedLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x12 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x12 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_speed + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x12 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ITM_to_hit + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x14 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_to_hitGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x14 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x14 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_to_hitLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x14 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x14 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_to_hit + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x14 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ITM_ability_dicesize + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x16 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_ability_dicesizeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x16 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x16 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_ability_dicesizeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x16 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x16 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_ability_dicesize + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0x16 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ITM_ability_school + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x17 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_ability_schoolGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x17 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x17 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_ability_schoolLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x17 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x17 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_ability_school + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0x17 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ITM_ability_secondary + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x19 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_ability_secondaryGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x19 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x19 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_ability_secondaryLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x19 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x19 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_ability_secondary + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0x19 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ITM_ability_numdice + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x18 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_ability_numdiceGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x18 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x18 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_ability_numdiceLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x18 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x18 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_ability_numdice + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0x18 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ITM_ability_dicenum + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x18 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_ability_dicenumGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x18 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x18 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_ability_dicenumLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x18 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x18 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_ability_dicenum + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0x18 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ITM_damage_bonus + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x1a + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_damage_bonusGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x1a + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x1a + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_damage_bonusLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x1a + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x1a + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_damage_bonus + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x1a + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ITM_damage_type + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x1c + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_damage_typeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x1c + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x1c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_damage_typeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x1c + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x1c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_damage_type + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x1c + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ITM_effect_num + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x1e + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_effect_numGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x1e + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x1e + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_effect_numLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x1e + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x1e + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_effect_num + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x1e + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ITM_effect_offset + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x20 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_effect_offsetGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x20 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x20 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_effect_offsetLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x20 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x20 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_effect_offset + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x20 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ITM_number_charges + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x22 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_number_chargesGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x22 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x22 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_number_chargesLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x22 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x22 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_number_charges + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x22 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ITM_when_drained + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x24 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_when_drainedGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x24 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x24 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_when_drainedLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x24 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x24 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_when_drained + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0x24 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ITM_strength_bonus + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x26 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_strength_bonusGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x26 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x26 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_strength_bonusLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x26 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x26 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_strength_bonus + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0x26 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ITM_projectile + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x2a + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_projectileGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x2a + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x2a + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_projectileLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x2a + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x2a + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_projectile + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x2a + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ITM_overhand + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x2c + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_overhandGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x2c + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x2c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_overhandLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x2c + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x2c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_overhand + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x2c + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ITM_backhand + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x2e + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_backhandGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x2e + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x2e + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_backhandLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x2e + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x2e + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_backhand + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x2e + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ITM_thrust + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x30 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_thrustGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x30 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x30 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_thrustLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x30 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x30 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_thrust + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x30 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ITM_is_arrow + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x32 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_is_arrowGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x32 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x32 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_is_arrowLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x32 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x32 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_is_arrow + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x32 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ITM_is_bolt + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x34 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_is_boltGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x34 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x34 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_is_boltLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x34 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x34 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_is_bolt + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x34 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ITM_is_missile + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x36 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_is_missileGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x36 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x36 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_is_missileLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x36 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x36 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_is_missile + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x36 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION ITM_opcode + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_opcodeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_opcodeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_opcode + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION ITM_target + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x2 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_targetGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x2 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x2 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_targetLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x2 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x2 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_target + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0x2 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION ITM_power + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x3 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_powerGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x3 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x3 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_powerLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x3 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x3 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_power + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0x3 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION ITM_parameter1 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x4 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_parameter1GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x4 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x4 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_parameter1LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x4 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x4 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_parameter1 + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x4 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION ITM_parameter2 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x8 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_parameter2GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x8 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x8 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_parameter2LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x8 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x8 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_parameter2 + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x8 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION ITM_parameter2a + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x8 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_parameter2aGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x8 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x8 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_parameter2aLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x8 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x8 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_parameter2a + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x8 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION ITM_parameter2b + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_parameter2bGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xa + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_parameter2bLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xa + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_parameter2b + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0xa + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION ITM_timing + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0xc + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_timingGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0xc + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0xc + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_timingLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0xc + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0xc + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_timing + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0xc + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION ITM_duration + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0xe + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_durationGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0xe + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0xe + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_durationLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0xe + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0xe + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_duration + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0xe + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION ITM_probability1 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x12 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_probability1GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x12 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x12 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_probability1LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x12 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x12 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_probability1 + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0x12 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION ITM_probability2 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x13 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_probability2GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x13 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x13 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_probability2LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x13 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x13 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_probability2 + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0x13 + offset_secondary) value + END + + DEFINE_PATCH_FUNCTION ITM_resource + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x14 + offset_secondary) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x14 + offset_secondary) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_resource + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x14 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION ITM_dicenum + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x1c + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_dicenumGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x1c + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x1c + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_dicenumLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x1c + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x1c + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_dicenum + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x1c + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION ITM_dicesize + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x20 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_dicesizeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x20 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x20 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_dicesizeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x20 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x20 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_dicesize + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x20 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION ITM_savebonus + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x44 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_savebonusGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x44 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x44 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_savebonusLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x44 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x44 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_savebonus + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x44 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION ITM_resistance + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x5c + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_resistanceGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x5c + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x5c + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_resistanceLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x5c + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x5c + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_resistance + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x5c + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION ITM_resist_dispel + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0xd + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_resist_dispelGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0xd + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0xd + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_resist_dispelLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0xd + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0xd + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_resist_dispel + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0xd + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION ITM_parameter3 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x60 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_parameter3GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x60 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x60 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_parameter3LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x60 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x60 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_parameter3 + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x60 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION ITM_parameter4 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x64 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_parameter4GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x64 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x64 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_parameter4LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x64 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x64 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_parameter4 + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x64 + offset_secondary) value + END + + DEFINE_PATCH_FUNCTION ITM_vvc + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x70 + offset_secondary) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x70 + offset_secondary) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_vvc + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x70 + offset_secondary) value + END + + DEFINE_PATCH_FUNCTION ITM_resource2 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x70 + offset_secondary) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x70 + offset_secondary) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_resource2 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x70 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION ITM_caster_xloc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x80 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_caster_xlocGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x80 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x80 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_caster_xlocLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x80 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x80 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_caster_xloc + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x80 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION ITM_caster_yloc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x84 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_caster_ylocGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x84 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x84 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_caster_ylocLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x84 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x84 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_caster_yloc + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x84 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION ITM_target_xloc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x88 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_target_xlocGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x88 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x88 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_target_xlocLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x88 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x88 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_target_xloc + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x88 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION ITM_target_yloc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x8c + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_target_ylocGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x8c + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x8c + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_target_ylocLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x8c + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x8c + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_target_yloc + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x8c + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION ITM_dispel + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0xd + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_dispelGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0xd + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0xd + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_dispelLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0xd + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0xd + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_dispel + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0xd + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION ITM_save_bonus + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x28 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_save_bonusGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x28 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x28 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_save_bonusLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x28 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x28 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_save_bonus + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x28 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION ITM_mode + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x2c + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_modeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x2c + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x2c + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_modeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x2c + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x2c + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_mode + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x2c + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION ITM_unsellable STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x18 (BYTE_AT 0x18 BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x18 (BYTE_AT 0x18 BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unsellable STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x18 BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_twohanded STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x18 (BYTE_AT 0x18 BAND 253) + END ELSE BEGIN + WRITE_BYTE 0x18 (BYTE_AT 0x18 BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_twohanded STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x18 BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_droppable STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x18 (BYTE_AT 0x18 BAND 251) + END ELSE BEGIN + WRITE_BYTE 0x18 (BYTE_AT 0x18 BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_droppable STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x18 BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_displayable STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x18 (BYTE_AT 0x18 BAND 247) + END ELSE BEGIN + WRITE_BYTE 0x18 (BYTE_AT 0x18 BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_displayable STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x18 BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_cursed STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x18 (BYTE_AT 0x18 BAND 239) + END ELSE BEGIN + WRITE_BYTE 0x18 (BYTE_AT 0x18 BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_cursed STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x18 BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_not_copyable STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x18 (BYTE_AT 0x18 BAND 223) + END ELSE BEGIN + WRITE_BYTE 0x18 (BYTE_AT 0x18 BOR 32) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_not_copyable STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x18 BAND 32) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_magical STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x18 (BYTE_AT 0x18 BAND 191) + END ELSE BEGIN + WRITE_BYTE 0x18 (BYTE_AT 0x18 BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_magical STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x18 BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_bow STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x18 (BYTE_AT 0x18 BAND 127) + END ELSE BEGIN + WRITE_BYTE 0x18 (BYTE_AT 0x18 BOR 128) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_bow STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x18 BAND 128) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_silver STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_silver STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x19 BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_cold_iron STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BAND 253) + END ELSE BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_cold_iron STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x19 BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_stolen STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BAND 251) + END ELSE BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_stolen STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x19 BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_conversable STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BAND 247) + END ELSE BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_conversable STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x19 BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_forbid_offhand STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BAND 223) + END ELSE BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BOR 32) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_forbid_offhand STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x19 BAND 32) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_chaotic STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_chaotic STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1e BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_evil STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BAND 253) + END ELSE BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_evil STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1e BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_good STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BAND 251) + END ELSE BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_good STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1e BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_GEneutral STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BAND 247) + END ELSE BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_GEneutral STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1e BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_lawful STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BAND 239) + END ELSE BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_lawful STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1e BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_LCneutral STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BAND 223) + END ELSE BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BOR 32) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_LCneutral STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1e BAND 32) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_chaotic_priest STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_chaotic_priest STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1e BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_evil_priest STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BAND 253) + END ELSE BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_evil_priest STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1e BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_good_priest STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BAND 251) + END ELSE BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_good_priest STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1e BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_GEneutral_priest STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BAND 247) + END ELSE BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_GEneutral_priest STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1e BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_lawful_priest STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BAND 239) + END ELSE BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_lawful_priest STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1e BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_LCneutral_priest STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BAND 223) + END ELSE BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BOR 32) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_LCneutral_priest STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1e BAND 32) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_bard STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BAND 191) + END ELSE BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_bard STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1e BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_cleric STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BAND 127) + END ELSE BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BOR 128) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_cleric STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1e BAND 128) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_cleric_mage STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1f (BYTE_AT 0x1f BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x1f (BYTE_AT 0x1f BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_cleric_mage STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1f BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_cleric_thief STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1f (BYTE_AT 0x1f BAND 253) + END ELSE BEGIN + WRITE_BYTE 0x1f (BYTE_AT 0x1f BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_cleric_thief STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1f BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_cleric_ranger STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1f (BYTE_AT 0x1f BAND 251) + END ELSE BEGIN + WRITE_BYTE 0x1f (BYTE_AT 0x1f BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_cleric_ranger STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1f BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_fighter STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1f (BYTE_AT 0x1f BAND 247) + END ELSE BEGIN + WRITE_BYTE 0x1f (BYTE_AT 0x1f BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_fighter STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1f BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_fighter_druid STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1f (BYTE_AT 0x1f BAND 239) + END ELSE BEGIN + WRITE_BYTE 0x1f (BYTE_AT 0x1f BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_fighter_druid STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1f BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_fighter_mage STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1f (BYTE_AT 0x1f BAND 223) + END ELSE BEGIN + WRITE_BYTE 0x1f (BYTE_AT 0x1f BOR 32) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_fighter_mage STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1f BAND 32) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_fighter_cleric STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1f (BYTE_AT 0x1f BAND 191) + END ELSE BEGIN + WRITE_BYTE 0x1f (BYTE_AT 0x1f BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_fighter_cleric STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1f BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_fighter_mage_cleric STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1f (BYTE_AT 0x1f BAND 127) + END ELSE BEGIN + WRITE_BYTE 0x1f (BYTE_AT 0x1f BOR 128) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_fighter_mage_cleric STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1f BAND 128) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_fighter_mage_thief STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_fighter_mage_thief STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x20 BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_fighter_thief STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BAND 253) + END ELSE BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_fighter_thief STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x20 BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_mage STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BAND 251) + END ELSE BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_mage STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x20 BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_mage_thief STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BAND 247) + END ELSE BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_mage_thief STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x20 BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_paladin STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BAND 239) + END ELSE BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_paladin STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x20 BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_ranger STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BAND 223) + END ELSE BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BOR 32) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_ranger STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x20 BAND 32) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_thief STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BAND 191) + END ELSE BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_thief STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x20 BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_elf STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BAND 127) + END ELSE BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BOR 128) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_elf STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x20 BAND 128) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_dwarf STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_dwarf STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x21 BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_half_elf STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BAND 253) + END ELSE BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_half_elf STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x21 BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_halfling STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BAND 251) + END ELSE BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_halfling STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x21 BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_human STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BAND 247) + END ELSE BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_human STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x21 BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_gnome STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BAND 239) + END ELSE BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_gnome STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x21 BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_monk STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BAND 223) + END ELSE BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BOR 32) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_monk STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x21 BAND 32) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_druid STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BAND 191) + END ELSE BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_druid STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x21 BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_half_orc STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BAND 127) + END ELSE BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BOR 128) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_half_orc STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x21 BAND 128) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_cleric_of_talos STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x29 (BYTE_AT 0x29 BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x29 (BYTE_AT 0x29 BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_cleric_of_talos STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x29 BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_cleric_of_helm STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x29 (BYTE_AT 0x29 BAND 253) + END ELSE BEGIN + WRITE_BYTE 0x29 (BYTE_AT 0x29 BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_cleric_of_helm STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x29 BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_cleric_of_lathander STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x29 (BYTE_AT 0x29 BAND 251) + END ELSE BEGIN + WRITE_BYTE 0x29 (BYTE_AT 0x29 BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_cleric_of_lathander STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x29 BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_totemic_druid STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x29 (BYTE_AT 0x29 BAND 247) + END ELSE BEGIN + WRITE_BYTE 0x29 (BYTE_AT 0x29 BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_totemic_druid STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x29 BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_shapeshifter STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x29 (BYTE_AT 0x29 BAND 239) + END ELSE BEGIN + WRITE_BYTE 0x29 (BYTE_AT 0x29 BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_shapeshifter STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x29 BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_avenger STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x29 (BYTE_AT 0x29 BAND 223) + END ELSE BEGIN + WRITE_BYTE 0x29 (BYTE_AT 0x29 BOR 32) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_avenger STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x29 BAND 32) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_barbarian STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x29 (BYTE_AT 0x29 BAND 191) + END ELSE BEGIN + WRITE_BYTE 0x29 (BYTE_AT 0x29 BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_barbarian STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x29 BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_wild_mage STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x29 (BYTE_AT 0x29 BAND 127) + END ELSE BEGIN + WRITE_BYTE 0x29 (BYTE_AT 0x29 BOR 128) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_wild_mage STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x29 BAND 128) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_stalker STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x2b (BYTE_AT 0x2b BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x2b (BYTE_AT 0x2b BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_stalker STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x2b BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_beastmaster STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x2b (BYTE_AT 0x2b BAND 253) + END ELSE BEGIN + WRITE_BYTE 0x2b (BYTE_AT 0x2b BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_beastmaster STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x2b BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_assassin STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x2b (BYTE_AT 0x2b BAND 251) + END ELSE BEGIN + WRITE_BYTE 0x2b (BYTE_AT 0x2b BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_assassin STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x2b BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_bounty_hunter STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x2b (BYTE_AT 0x2b BAND 247) + END ELSE BEGIN + WRITE_BYTE 0x2b (BYTE_AT 0x2b BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_bounty_hunter STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x2b BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_swashbuckler STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x2b (BYTE_AT 0x2b BAND 239) + END ELSE BEGIN + WRITE_BYTE 0x2b (BYTE_AT 0x2b BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_swashbuckler STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x2b BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_blade STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x2b (BYTE_AT 0x2b BAND 223) + END ELSE BEGIN + WRITE_BYTE 0x2b (BYTE_AT 0x2b BOR 32) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_blade STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x2b BAND 32) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_jester STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x2b (BYTE_AT 0x2b BAND 191) + END ELSE BEGIN + WRITE_BYTE 0x2b (BYTE_AT 0x2b BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_jester STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x2b BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_skald STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x2b (BYTE_AT 0x2b BAND 127) + END ELSE BEGIN + WRITE_BYTE 0x2b (BYTE_AT 0x2b BOR 128) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_skald STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x2b BAND 128) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_diviner STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x2d (BYTE_AT 0x2d BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x2d (BYTE_AT 0x2d BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_diviner STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x2d BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_enchanter STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x2d (BYTE_AT 0x2d BAND 253) + END ELSE BEGIN + WRITE_BYTE 0x2d (BYTE_AT 0x2d BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_enchanter STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x2d BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_illusionist STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x2d (BYTE_AT 0x2d BAND 251) + END ELSE BEGIN + WRITE_BYTE 0x2d (BYTE_AT 0x2d BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_illusionist STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x2d BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_invoker STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x2d (BYTE_AT 0x2d BAND 247) + END ELSE BEGIN + WRITE_BYTE 0x2d (BYTE_AT 0x2d BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_invoker STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x2d BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_necromancer STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x2d (BYTE_AT 0x2d BAND 239) + END ELSE BEGIN + WRITE_BYTE 0x2d (BYTE_AT 0x2d BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_necromancer STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x2d BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_transmuter STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x2d (BYTE_AT 0x2d BAND 223) + END ELSE BEGIN + WRITE_BYTE 0x2d (BYTE_AT 0x2d BOR 32) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_transmuter STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x2d BAND 32) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_no_kit STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x2d (BYTE_AT 0x2d BAND 191) + END ELSE BEGIN + WRITE_BYTE 0x2d (BYTE_AT 0x2d BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_no_kit STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x2d BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_archer STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x2d (BYTE_AT 0x2d BAND 127) + END ELSE BEGIN + WRITE_BYTE 0x2d (BYTE_AT 0x2d BOR 128) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_archer STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x2d BAND 128) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_berserker STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x2f (BYTE_AT 0x2f BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x2f (BYTE_AT 0x2f BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_berserker STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x2f BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_wizard_slayer STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x2f (BYTE_AT 0x2f BAND 253) + END ELSE BEGIN + WRITE_BYTE 0x2f (BYTE_AT 0x2f BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_wizard_slayer STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x2f BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_kensai STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x2f (BYTE_AT 0x2f BAND 251) + END ELSE BEGIN + WRITE_BYTE 0x2f (BYTE_AT 0x2f BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_kensai STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x2f BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_cavalier STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x2f (BYTE_AT 0x2f BAND 247) + END ELSE BEGIN + WRITE_BYTE 0x2f (BYTE_AT 0x2f BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_cavalier STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x2f BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_inquisitor STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x2f (BYTE_AT 0x2f BAND 239) + END ELSE BEGIN + WRITE_BYTE 0x2f (BYTE_AT 0x2f BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_inquisitor STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x2f BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_undead_hunter STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x2f (BYTE_AT 0x2f BAND 223) + END ELSE BEGIN + WRITE_BYTE 0x2f (BYTE_AT 0x2f BOR 32) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_undead_hunter STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x2f BAND 32) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_abjurer STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x2f (BYTE_AT 0x2f BAND 191) + END ELSE BEGIN + WRITE_BYTE 0x2f (BYTE_AT 0x2f BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_abjurer STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x2f BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_unusable_conjurer STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x2f (BYTE_AT 0x2f BAND 127) + END ELSE BEGIN + WRITE_BYTE 0x2f (BYTE_AT 0x2f BOR 128) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_unusable_conjurer STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x2f BAND 128) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_add_strength_bonus STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x26 + offset_base) (BYTE_AT (0x26 + offset_base) BAND 254) + END ELSE BEGIN + WRITE_BYTE (0x26 + offset_base) (BYTE_AT (0x26 + offset_base) BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_add_strength_bonus STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x26 + offset_base) BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_breakable STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x26 + offset_base) (BYTE_AT (0x26 + offset_base) BAND 253) + END ELSE BEGIN + WRITE_BYTE (0x26 + offset_base) (BYTE_AT (0x26 + offset_base) BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_breakable STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x26 + offset_base) BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_damage_only STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x26 + offset_base) (BYTE_AT (0x26 + offset_base) BAND 251) + END ELSE BEGIN + WRITE_BYTE (0x26 + offset_base) (BYTE_AT (0x26 + offset_base) BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_damage_only STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x26 + offset_base) BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_to_hit_only STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x26 + offset_base) (BYTE_AT (0x26 + offset_base) BAND 247) + END ELSE BEGIN + WRITE_BYTE (0x26 + offset_base) (BYTE_AT (0x26 + offset_base) BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_to_hit_only STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x26 + offset_base) BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_breaks_sanctuary STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x27 + offset_base) (BYTE_AT (0x27 + offset_base) BAND 253) + END ELSE BEGIN + WRITE_BYTE (0x27 + offset_base) (BYTE_AT (0x27 + offset_base) BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_breaks_sanctuary STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x27 + offset_base) BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_hostile STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x27 + offset_base) (BYTE_AT (0x27 + offset_base) BAND 251) + END ELSE BEGIN + WRITE_BYTE (0x27 + offset_base) (BYTE_AT (0x27 + offset_base) BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_hostile STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x27 + offset_base) BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_recharges_on_rest STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x27 + offset_base) (BYTE_AT (0x27 + offset_base) BAND 247) + END ELSE BEGIN + WRITE_BYTE (0x27 + offset_base) (BYTE_AT (0x27 + offset_base) BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_recharges_on_rest STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x27 + offset_base) BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_save_vs_spell STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x24 + offset_secondary) (BYTE_AT (0x24 + offset_secondary) BAND 254) + END ELSE BEGIN + WRITE_BYTE (0x24 + offset_secondary) (BYTE_AT (0x24 + offset_secondary) BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_save_vs_spell STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x24 + offset_secondary) BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_save_spells STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x40 + offset_secondary) (BYTE_AT (0x40 + offset_secondary) BAND 254) + END ELSE BEGIN + WRITE_BYTE (0x40 + offset_secondary) (BYTE_AT (0x40 + offset_secondary) BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_save_spells STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x40 + offset_secondary) BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_save_vs_breath STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x24 + offset_secondary) (BYTE_AT (0x24 + offset_secondary) BAND 253) + END ELSE BEGIN + WRITE_BYTE (0x24 + offset_secondary) (BYTE_AT (0x24 + offset_secondary) BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_save_vs_breath STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x24 + offset_secondary) BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_save_breath STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x40 + offset_secondary) (BYTE_AT (0x40 + offset_secondary) BAND 253) + END ELSE BEGIN + WRITE_BYTE (0x40 + offset_secondary) (BYTE_AT (0x40 + offset_secondary) BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_save_breath STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x40 + offset_secondary) BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_save_vs_death STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x24 + offset_secondary) (BYTE_AT (0x24 + offset_secondary) BAND 251) + END ELSE BEGIN + WRITE_BYTE (0x24 + offset_secondary) (BYTE_AT (0x24 + offset_secondary) BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_save_vs_death STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x24 + offset_secondary) BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_save_death STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x40 + offset_secondary) (BYTE_AT (0x40 + offset_secondary) BAND 251) + END ELSE BEGIN + WRITE_BYTE (0x40 + offset_secondary) (BYTE_AT (0x40 + offset_secondary) BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_save_death STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x40 + offset_secondary) BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_save_vs_wand STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x40 + offset_secondary) (BYTE_AT (0x40 + offset_secondary) BAND 247) + END ELSE BEGIN + WRITE_BYTE (0x40 + offset_secondary) (BYTE_AT (0x40 + offset_secondary) BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_save_vs_wand STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x40 + offset_secondary) BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_save_wands STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x40 + offset_secondary) (BYTE_AT (0x40 + offset_secondary) BAND 247) + END ELSE BEGIN + WRITE_BYTE (0x40 + offset_secondary) (BYTE_AT (0x40 + offset_secondary) BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_save_wands STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x40 + offset_secondary) BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_save_vs_polymorph STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x24 + offset_secondary) (BYTE_AT (0x24 + offset_secondary) BAND 239) + END ELSE BEGIN + WRITE_BYTE (0x24 + offset_secondary) (BYTE_AT (0x24 + offset_secondary) BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_save_vs_polymorph STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x24 + offset_secondary) BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_save_polymorph STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x40 + offset_secondary) (BYTE_AT (0x40 + offset_secondary) BAND 239) + END ELSE BEGIN + WRITE_BYTE (0x40 + offset_secondary) (BYTE_AT (0x40 + offset_secondary) BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_save_polymorph STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x40 + offset_secondary) BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_bypass_mirror_image STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x27 + offset_secondary) (BYTE_AT (0x27 + offset_secondary) BAND 254) + END ELSE BEGIN + WRITE_BYTE (0x27 + offset_secondary) (BYTE_AT (0x27 + offset_secondary) BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_bypass_mirror_image STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x27 + offset_secondary) BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_fist_only STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x48 + offset_secondary) (BYTE_AT (0x48 + offset_secondary) BAND 251) + END ELSE BEGIN + WRITE_BYTE (0x48 + offset_secondary) (BYTE_AT (0x48 + offset_secondary) BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_fist_only STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x48 + offset_secondary) BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_save_vs_poison STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x24 + offset_secondary) (BYTE_AT (0x24 + offset_secondary) BAND 251) + END ELSE BEGIN + WRITE_BYTE (0x24 + offset_secondary) (BYTE_AT (0x24 + offset_secondary) BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_save_vs_poison STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x24 + offset_secondary) BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_save_vs_wands STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x24 + offset_secondary) (BYTE_AT (0x24 + offset_secondary) BAND 247) + END ELSE BEGIN + WRITE_BYTE (0x24 + offset_secondary) (BYTE_AT (0x24 + offset_secondary) BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_save_vs_wands STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x24 + offset_secondary) BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_save_vs_petrification STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x24 + offset_secondary) (BYTE_AT (0x24 + offset_secondary) BAND 239) + END ELSE BEGIN + WRITE_BYTE (0x24 + offset_secondary) (BYTE_AT (0x24 + offset_secondary) BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION ITM_read_save_vs_petrification STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x24 + offset_secondary) BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION ITM_proficiency STR_VAR arguments="" RET value BEGIN + + PATCH_IF "%arguments%" STRING_COMPARE_CASE "no_change" BEGIN + SET ids_value = IDS_OF_SYMBOL (STATS "%arguments%") + PATCH_IF ids_value>0 BEGIN + WRITE_BYTE 0x31 ids_value + END ELSE BEGIN + PATCH_FAIL "Tried to set nonexistent STATS entry %arguments%" + END + SET value=1 + END + END + DEFINE_PATCH_FUNCTION ITM_read_proficiency STR_VAR arguments="" RET value BEGIN + READ_BYTE 0x31 value_ids + LOOKUP_IDS_SYMBOL_OF_INT value STATS value_ids + END + + + DEFINE_PATCH_FUNCTION PRO_type + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x8 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_typeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x8 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x8 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_typeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x8 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x8 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_type + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x8 value + END + + + DEFINE_PATCH_FUNCTION PRO_speed + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0xa arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_speedGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0xa < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0xa arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_speedLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0xa > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0xa arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_speed + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0xa value + END + + DEFINE_PATCH_FUNCTION PRO_travel_wav + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x10 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x10 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_travel_wav + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x10 value + END + + DEFINE_PATCH_FUNCTION PRO_arrive_wav + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x18 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x18 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_arrive_wav + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x18 value + END + + DEFINE_PATCH_FUNCTION PRO_travel_wav0 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x10 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x10 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_travel_wav0 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x10 value + END + + DEFINE_PATCH_FUNCTION PRO_arrive_wav0 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x18 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x18 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_arrive_wav0 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x18 value + END + + DEFINE_PATCH_FUNCTION PRO_travel_vvc + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x20 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x20 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_travel_vvc + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x20 value + END + + + DEFINE_PATCH_FUNCTION PRO_spark_color_num + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x28 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_spark_color_numGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x28 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x28 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_spark_color_numLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x28 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x28 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_spark_color_num + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x28 value + END + + DEFINE_PATCH_FUNCTION PRO_travel_anim + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x104 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x104 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_travel_anim + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x104 value + END + + DEFINE_PATCH_FUNCTION PRO_shadow_anim + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x10c "" (8) + END + DEFAULT + WRITE_ASCIIE 0x10c "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_shadow_anim + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x10c value + END + + DEFINE_PATCH_FUNCTION PRO_travel_anim0 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x104 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x104 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_travel_anim0 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x104 value + END + + DEFINE_PATCH_FUNCTION PRO_shadow_anim0 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x10c "" (8) + END + DEFAULT + WRITE_ASCIIE 0x10c "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_shadow_anim0 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x10c value + END + + + DEFINE_PATCH_FUNCTION PRO_pro_seq_num + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x114 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_pro_seq_numGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x114 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x114 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_pro_seq_numLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x114 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x114 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_pro_seq_num + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x114 value + END + + + DEFINE_PATCH_FUNCTION PRO_shadow_seq_num + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x115 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_shadow_seq_numGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x115 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x115 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_shadow_seq_numLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x115 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x115 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_shadow_seq_num + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x115 value + END + + + DEFINE_PATCH_FUNCTION PRO_light_intensity + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x116 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_light_intensityGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x116 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x116 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_light_intensityLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x116 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x116 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_light_intensity + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x116 value + END + + + DEFINE_PATCH_FUNCTION PRO_light_width + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x118 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_light_widthGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x118 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x118 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_light_widthLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x118 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x118 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_light_width + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x118 value + END + + + DEFINE_PATCH_FUNCTION PRO_light_height + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x11a arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_light_heightGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x11a < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x11a arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_light_heightLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x11a > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x11a arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_light_height + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x11a value + END + + DEFINE_PATCH_FUNCTION PRO_palette + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x11c "" (8) + END + DEFAULT + WRITE_ASCIIE 0x11c "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_palette + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x11c value + END + + + DEFINE_PATCH_FUNCTION PRO_color_1 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x124 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_color_1GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x124 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x124 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_color_1LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x124 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x124 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_color_1 + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x124 value + END + + + DEFINE_PATCH_FUNCTION PRO_color_2 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x125 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_color_2GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x125 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x125 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_color_2LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x125 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x125 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_color_2 + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x125 value + END + + + DEFINE_PATCH_FUNCTION PRO_color_3 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x126 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_color_3GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x126 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x126 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_color_3LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x126 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x126 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_color_3 + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x126 value + END + + + DEFINE_PATCH_FUNCTION PRO_color_4 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x127 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_color_4GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x127 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x127 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_color_4LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x127 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x127 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_color_4 + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x127 value + END + + + DEFINE_PATCH_FUNCTION PRO_color_5 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x128 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_color_5GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x128 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x128 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_color_5LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x128 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x128 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_color_5 + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x128 value + END + + + DEFINE_PATCH_FUNCTION PRO_color_6 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x129 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_color_6GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x129 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x129 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_color_6LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x129 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x129 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_color_6 + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x129 value + END + + + DEFINE_PATCH_FUNCTION PRO_color_7 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x12a arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_color_7GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x12a < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x12a arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_color_7LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x12a > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x12a arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_color_7 + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x12a value + END + + + DEFINE_PATCH_FUNCTION PRO_smoke_color_1 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x124 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_smoke_color_1GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x124 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x124 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_smoke_color_1LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x124 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x124 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_smoke_color_1 + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x124 value + END + + + DEFINE_PATCH_FUNCTION PRO_smoke_color_2 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x125 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_smoke_color_2GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x125 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x125 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_smoke_color_2LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x125 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x125 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_smoke_color_2 + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x125 value + END + + + DEFINE_PATCH_FUNCTION PRO_smoke_color_3 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x126 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_smoke_color_3GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x126 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x126 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_smoke_color_3LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x126 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x126 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_smoke_color_3 + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x126 value + END + + + DEFINE_PATCH_FUNCTION PRO_smoke_color_4 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x127 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_smoke_color_4GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x127 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x127 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_smoke_color_4LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x127 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x127 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_smoke_color_4 + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x127 value + END + + + DEFINE_PATCH_FUNCTION PRO_smoke_color_5 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x128 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_smoke_color_5GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x128 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x128 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_smoke_color_5LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x128 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x128 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_smoke_color_5 + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x128 value + END + + + DEFINE_PATCH_FUNCTION PRO_smoke_color_6 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x129 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_smoke_color_6GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x129 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x129 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_smoke_color_6LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x129 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x129 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_smoke_color_6 + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x129 value + END + + + DEFINE_PATCH_FUNCTION PRO_smoke_color_7 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x12a arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_smoke_color_7GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x12a < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x12a arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_smoke_color_7LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x12a > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x12a arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_smoke_color_7 + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x12a value + END + + + DEFINE_PATCH_FUNCTION PRO_facing + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x133 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_facingGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x133 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x133 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_facingLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x133 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x133 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_facing + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x133 value + END + + + DEFINE_PATCH_FUNCTION PRO_smoke_anim + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x134 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_smoke_animGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x134 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x134 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_smoke_animLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x134 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x134 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_smoke_anim + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x134 value + END + + DEFINE_PATCH_FUNCTION PRO_trail_anim_1 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x136 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x136 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_trail_anim_1 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x136 value + END + + DEFINE_PATCH_FUNCTION PRO_trail_anim_2 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x13e "" (8) + END + DEFAULT + WRITE_ASCIIE 0x13e "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_trail_anim_2 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x13e value + END + + DEFINE_PATCH_FUNCTION PRO_trail_anim_3 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x146 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x146 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_trail_anim_3 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x146 value + END + + DEFINE_PATCH_FUNCTION PRO_trail_anim_10 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x136 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x136 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_trail_anim_10 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x136 value + END + + DEFINE_PATCH_FUNCTION PRO_trail_anim_20 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x13e "" (8) + END + DEFAULT + WRITE_ASCIIE 0x13e "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_trail_anim_20 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x13e value + END + + DEFINE_PATCH_FUNCTION PRO_trail_anim_30 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x146 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x146 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_trail_anim_30 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x146 value + END + + DEFINE_PATCH_FUNCTION PRO_trail_1_seq_num + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x14e "" (8) + END + DEFAULT + WRITE_ASCIIE 0x14e "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_trail_1_seq_num + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x14e value + END + + DEFINE_PATCH_FUNCTION PRO_trail_2_seq_num + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x150 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x150 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_trail_2_seq_num + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x150 value + END + + DEFINE_PATCH_FUNCTION PRO_trail_3_seq_num + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x152 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x152 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_trail_3_seq_num + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x152 value + END + + + DEFINE_PATCH_FUNCTION PRO_trigger_radius + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x204 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_trigger_radiusGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x204 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x204 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_trigger_radiusLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x204 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x204 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_trigger_radius + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x204 value + END + + + DEFINE_PATCH_FUNCTION PRO_basic_aoe_radius + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x206 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_basic_aoe_radiusGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x206 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x206 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_basic_aoe_radiusLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x206 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x206 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_basic_aoe_radius + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x206 value + END + + DEFINE_PATCH_FUNCTION PRO_trigger_wav + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x208 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x208 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_trigger_wav + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x208 value + END + + DEFINE_PATCH_FUNCTION PRO_trigger_wav0 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x208 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x208 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_trigger_wav0 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x208 value + END + + + DEFINE_PATCH_FUNCTION PRO_explosion_frequency + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x210 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_explosion_frequencyGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x210 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x210 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_explosion_frequencyLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x210 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x210 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_explosion_frequency + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x210 value + END + + + DEFINE_PATCH_FUNCTION PRO_fragment_anim + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x212 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_fragment_animGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x212 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x212 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_fragment_animLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x212 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x212 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_fragment_anim + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x212 value + END + + + DEFINE_PATCH_FUNCTION PRO_secondary_pro + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x214 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_secondary_proGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x214 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x214 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_secondary_proLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x214 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x214 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_secondary_pro + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x214 value + END + + + DEFINE_PATCH_FUNCTION PRO_repetitions + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x216 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_repetitionsGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x216 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x216 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_repetitionsLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x216 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x216 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_repetitions + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x216 value + END + + + DEFINE_PATCH_FUNCTION PRO_explosion_anim + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x217 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_explosion_animGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x217 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x217 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_explosion_animLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x217 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x217 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_explosion_anim + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x217 value + END + + + DEFINE_PATCH_FUNCTION PRO_explosion_color + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x218 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_explosion_colorGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x218 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x218 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_explosion_colorLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x218 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x218 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_explosion_color + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x218 value + END + + + DEFINE_PATCH_FUNCTION PRO_target_anim + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x21a arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_target_animGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x21a < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x21a arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_target_animLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x21a > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x21a arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_target_anim + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x21a value + END + + + DEFINE_PATCH_FUNCTION PRO_explosion_pro + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x21a arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_explosion_proGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x21a < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x21a arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_explosion_proLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x21a > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x21a arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_explosion_pro + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x21a value + END + + DEFINE_PATCH_FUNCTION PRO_explosion_anim_vvc + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x21c "" (8) + END + DEFAULT + WRITE_ASCIIE 0x21c "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_explosion_anim_vvc + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x21c value + END + + DEFINE_PATCH_FUNCTION PRO_ring_anim + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x230 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x230 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_ring_anim + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x230 value + END + + + DEFINE_PATCH_FUNCTION PRO_cone_angle + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x224 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_cone_angleGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x224 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x224 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_cone_angleLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x224 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x224 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_cone_angle + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x224 value + END + + + DEFINE_PATCH_FUNCTION PRO_animation_granularity + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x248 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_animation_granularityGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x248 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x248 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_animation_granularityLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x248 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x248 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_animation_granularity + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x248 value + END + + + DEFINE_PATCH_FUNCTION PRO_animation_granularity_divider + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x24a arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_animation_granularity_dividerGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x24a < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x24a arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_animation_granularity_dividerLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x24a > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x24a arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_animation_granularity_divider + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x24a value + END + + + DEFINE_PATCH_FUNCTION PRO_show_sparkle STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0xc (BYTE_AT 0xc BAND 254) + END ELSE BEGIN + WRITE_BYTE 0xc (BYTE_AT 0xc BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_show_sparkle STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0xc BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION PRO_sparkle_z_coord STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0xc (BYTE_AT 0xc BAND 253) + END ELSE BEGIN + WRITE_BYTE 0xc (BYTE_AT 0xc BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_sparkle_z_coord STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0xc BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION PRO_loop_travel_sound STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0xc (BYTE_AT 0xc BAND 251) + END ELSE BEGIN + WRITE_BYTE 0xc (BYTE_AT 0xc BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_loop_travel_sound STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0xc BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION PRO_loop_arrive_sound STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0xc (BYTE_AT 0xc BAND 247) + END ELSE BEGIN + WRITE_BYTE 0xc (BYTE_AT 0xc BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_loop_arrive_sound STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0xc BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION PRO_sparkle_no_direct_target STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0xc (BYTE_AT 0xc BAND 239) + END ELSE BEGIN + WRITE_BYTE 0xc (BYTE_AT 0xc BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_sparkle_no_direct_target STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0xc BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION PRO_draw_below STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0xc (BYTE_AT 0xc BAND 223) + END ELSE BEGIN + WRITE_BYTE 0xc (BYTE_AT 0xc BOR 32) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_draw_below STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0xc BAND 32) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION PRO_use_palette STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x100 (BYTE_AT 0x100 BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x100 (BYTE_AT 0x100 BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_use_palette STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x100 BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION PRO_enable_smoke STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x100 (BYTE_AT 0x100 BAND 253) + END ELSE BEGIN + WRITE_BYTE 0x100 (BYTE_AT 0x100 BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_enable_smoke STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x100 BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION PRO_use_area_lighting STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x100 (BYTE_AT 0x100 BAND 247) + END ELSE BEGIN + WRITE_BYTE 0x100 (BYTE_AT 0x100 BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_use_area_lighting STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x100 BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION PRO_use_area_height STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x100 (BYTE_AT 0x100 BAND 239) + END ELSE BEGIN + WRITE_BYTE 0x100 (BYTE_AT 0x100 BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_use_area_height STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x100 BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION PRO_enable_shadow STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x100 (BYTE_AT 0x100 BAND 223) + END ELSE BEGIN + WRITE_BYTE 0x100 (BYTE_AT 0x100 BOR 32) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_enable_shadow STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x100 BAND 32) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION PRO_enable_light_spot STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x100 (BYTE_AT 0x100 BAND 191) + END ELSE BEGIN + WRITE_BYTE 0x100 (BYTE_AT 0x100 BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_enable_light_spot STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x100 BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION PRO_enable_brighten STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x100 (BYTE_AT 0x100 BAND 127) + END ELSE BEGIN + WRITE_BYTE 0x100 (BYTE_AT 0x100 BOR 128) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_enable_brighten STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x100 BAND 128) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION PRO_low_brighten STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x101 (BYTE_AT 0x101 BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x101 (BYTE_AT 0x101 BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_low_brighten STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x101 BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION PRO_high_brighten STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x101 (BYTE_AT 0x101 BAND 253) + END ELSE BEGIN + WRITE_BYTE 0x101 (BYTE_AT 0x101 BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_high_brighten STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x101 BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION PRO_keep_pro_visible STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x200 (BYTE_AT 0x200 BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x200 (BYTE_AT 0x200 BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_keep_pro_visible STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x200 BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION PRO_triggered_by_inanimate STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x200 (BYTE_AT 0x200 BAND 253) + END ELSE BEGIN + WRITE_BYTE 0x200 (BYTE_AT 0x200 BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_triggered_by_inanimate STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x200 BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION PRO_triggered_on_condition STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x200 (BYTE_AT 0x200 BAND 251) + END ELSE BEGIN + WRITE_BYTE 0x200 (BYTE_AT 0x200 BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_triggered_on_condition STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x200 BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION PRO_trigger_in_delay STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x200 (BYTE_AT 0x200 BAND 247) + END ELSE BEGIN + WRITE_BYTE 0x200 (BYTE_AT 0x200 BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_trigger_in_delay STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x200 BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION PRO_use_secondary STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x200 (BYTE_AT 0x200 BAND 239) + END ELSE BEGIN + WRITE_BYTE 0x200 (BYTE_AT 0x200 BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_use_secondary STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x200 BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION PRO_use_fragment STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x200 (BYTE_AT 0x200 BAND 223) + END ELSE BEGIN + WRITE_BYTE 0x200 (BYTE_AT 0x200 BOR 32) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_use_fragment STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x200 BAND 32) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION PRO_target_flag_1 STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x200 (BYTE_AT 0x200 BAND 191) + END ELSE BEGIN + WRITE_BYTE 0x200 (BYTE_AT 0x200 BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_target_flag_1 STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x200 BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION PRO_only_enemies STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x200 (BYTE_AT 0x200 BAND 191) + END ELSE BEGIN + WRITE_BYTE 0x200 (BYTE_AT 0x200 BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_only_enemies STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x200 BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION PRO_target_flag_2 STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x200 (BYTE_AT 0x200 BAND 127) + END ELSE BEGIN + WRITE_BYTE 0x200 (BYTE_AT 0x200 BOR 128) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_target_flag_2 STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x200 BAND 128) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION PRO_num_is_mage_level STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x201 (BYTE_AT 0x201 BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x201 (BYTE_AT 0x201 BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_num_is_mage_level STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x201 BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION PRO_num_is_priest_level STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x201 (BYTE_AT 0x201 BAND 253) + END ELSE BEGIN + WRITE_BYTE 0x201 (BYTE_AT 0x201 BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_num_is_priest_level STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x201 BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION PRO_use_vvc STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x201 (BYTE_AT 0x201 BAND 251) + END ELSE BEGIN + WRITE_BYTE 0x201 (BYTE_AT 0x201 BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_use_vvc STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x201 BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION PRO_is_cone STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x201 (BYTE_AT 0x201 BAND 247) + END ELSE BEGIN + WRITE_BYTE 0x201 (BYTE_AT 0x201 BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_is_cone STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x201 BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION PRO_go_through_walls STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x201 (BYTE_AT 0x201 BAND 239) + END ELSE BEGIN + WRITE_BYTE 0x201 (BYTE_AT 0x201 BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_go_through_walls STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x201 BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION PRO_delay_explosion STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x201 (BYTE_AT 0x201 BAND 191) + END ELSE BEGIN + WRITE_BYTE 0x201 (BYTE_AT 0x201 BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_delay_explosion STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x201 BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION PRO_only_one_target STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x201 (BYTE_AT 0x201 BAND 127) + END ELSE BEGIN + WRITE_BYTE 0x201 (BYTE_AT 0x201 BOR 128) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_only_one_target STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x201 BAND 128) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION PRO_random_speed STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x240 (BYTE_AT 0x240 BAND 253) + END ELSE BEGIN + WRITE_BYTE 0x240 (BYTE_AT 0x240 BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION PRO_read_random_speed STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x240 BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_name1_string + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x8 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_name1_stringGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x8 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x8 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_name1_stringLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x8 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x8 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_name1_string + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x8 value + END + + + DEFINE_PATCH_FUNCTION SPL_name2_string + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0xc arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_name2_stringGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0xc < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0xc arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_name2_stringLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0xc > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0xc arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_name2_string + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0xc value + END + + DEFINE_PATCH_FUNCTION SPL_casting_sound + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x10 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x10 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_casting_sound + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x10 value + END + + + DEFINE_PATCH_FUNCTION SPL_flags + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x18 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_flagsGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x18 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x18 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_flagsLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x18 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x18 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_flags + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x18 value + END + + + DEFINE_PATCH_FUNCTION SPL_spell_type_num + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x1c arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_spell_type_numGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x1c < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x1c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_spell_type_numLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x1c > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x1c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_spell_type_num + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x1c value + END + + + DEFINE_PATCH_FUNCTION SPL_priest_type + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x20 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_priest_typeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x20 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x20 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_priest_typeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x20 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x20 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_priest_type + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x20 value + END + + + DEFINE_PATCH_FUNCTION SPL_casting_animation + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x22 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_casting_animationGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x22 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x22 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_casting_animationLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x22 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x22 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_casting_animation + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x22 value + END + + + DEFINE_PATCH_FUNCTION SPL_primary + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x25 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_primaryGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x25 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x25 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_primaryLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x25 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x25 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_primary + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x25 value + END + + + DEFINE_PATCH_FUNCTION SPL_school_code + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x25 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_school_codeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x25 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x25 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_school_codeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x25 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x25 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_school_code + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x25 value + END + + + DEFINE_PATCH_FUNCTION SPL_secondary + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x27 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_secondaryGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x27 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x27 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_secondaryLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x27 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x27 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_secondary + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x27 value + END + + + DEFINE_PATCH_FUNCTION SPL_level + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x34 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_levelGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x34 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x34 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_levelLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x34 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x34 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_level + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x34 value + END + + DEFINE_PATCH_FUNCTION SPL_icon + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x3a "" (8) + END + DEFAULT + WRITE_ASCIIE 0x3a "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_icon + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x3a value + END + + + DEFINE_PATCH_FUNCTION SPL_description1_string + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x50 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_description1_stringGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x50 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x50 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_description1_stringLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x50 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x50 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_description1_string + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x50 value + END + + + DEFINE_PATCH_FUNCTION SPL_description2_string + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x54 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_description2_stringGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x54 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x54 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_description2_stringLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x54 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x54 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_description2_string + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x54 value + END + + + DEFINE_PATCH_FUNCTION SPL_num_abils + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x68 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_num_abilsGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x68 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x68 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_num_abilsLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x68 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x68 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_num_abils + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x68 value + END + + + DEFINE_PATCH_FUNCTION SPL_ability_type + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x0 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_ability_typeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x0 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x0 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_ability_typeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x0 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x0 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_ability_type + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0x0 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION SPL_ability_icon_loc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x2 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_ability_icon_locGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x2 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x2 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_ability_icon_locLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x2 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x2 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_ability_icon_loc + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x2 + offset_base) value + END + + DEFINE_PATCH_FUNCTION SPL_ability_icon + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x4 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x4 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_ability_icon + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x4 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION SPL_ability_range + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xe + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_ability_rangeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xe + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xe + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_ability_rangeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xe + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xe + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_ability_range + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0xe + offset_base) value + END + + + DEFINE_PATCH_FUNCTION SPL_ability_target + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0xc + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_ability_targetGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0xc + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0xc + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_ability_targetLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0xc + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0xc + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_ability_target + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0xc + offset_base) value + END + + + DEFINE_PATCH_FUNCTION SPL_ability_min_level + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x10 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_ability_min_levelGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x10 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x10 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_ability_min_levelLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x10 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x10 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_ability_min_level + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x10 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION SPL_ability_damage_type + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x1c + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_ability_damage_typeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x1c + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x1c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_ability_damage_typeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x1c + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x1c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_ability_damage_type + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x1c + offset_base) value + END + + + DEFINE_PATCH_FUNCTION SPL_ability_dicesize + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x16 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_ability_dicesizeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x16 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x16 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_ability_dicesizeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x16 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x16 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_ability_dicesize + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x16 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION SPL_ability_charges + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x22 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_ability_chargesGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x22 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x22 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_ability_chargesLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x22 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x22 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_ability_charges + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x22 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION SPL_ability_unknown_late + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x24 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_ability_unknown_lateGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x24 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x24 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_ability_unknown_lateLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x24 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x24 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_ability_unknown_late + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x24 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION SPL_projectile + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x26 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_projectileGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x26 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x26 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_projectileLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x26 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x26 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_projectile + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x26 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION SPL_effect_number + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x1e + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_effect_numberGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x1e + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x1e + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_effect_numberLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x1e + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x1e + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_effect_number + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x1e + offset_base) value + END + + + DEFINE_PATCH_FUNCTION SPL_casting_time + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x12 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_casting_timeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x12 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x12 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_casting_timeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x12 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x12 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_casting_time + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x12 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION SPL_opcode + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_opcodeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_opcodeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_opcode + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION SPL_target + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x2 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_targetGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x2 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x2 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_targetLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x2 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x2 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_target + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0x2 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION SPL_power + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x3 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_powerGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x3 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x3 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_powerLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x3 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x3 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_power + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0x3 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION SPL_parameter1 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x4 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_parameter1GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x4 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x4 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_parameter1LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x4 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x4 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_parameter1 + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x4 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION SPL_parameter2 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x8 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_parameter2GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x8 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x8 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_parameter2LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x8 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x8 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_parameter2 + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x8 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION SPL_parameter2a + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x8 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_parameter2aGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x8 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x8 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_parameter2aLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0x8 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0x8 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_parameter2a + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0x8 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION SPL_parameter2b + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_parameter2bGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xa + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_parameter2bLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xa + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_parameter2b + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0xa + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION SPL_timing + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0xc + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_timingGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0xc + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0xc + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_timingLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0xc + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0xc + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_timing + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0xc + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION SPL_duration + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0xe + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_durationGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0xe + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0xe + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_durationLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0xe + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0xe + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_duration + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0xe + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION SPL_probability1 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x12 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_probability1GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x12 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x12 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_probability1LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x12 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x12 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_probability1 + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0x12 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION SPL_probability2 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x13 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_probability2GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x13 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x13 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_probability2LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0x13 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0x13 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_probability2 + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0x13 + offset_secondary) value + END + + DEFINE_PATCH_FUNCTION SPL_resource + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x14 + offset_secondary) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x14 + offset_secondary) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_resource + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x14 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION SPL_dicenum + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x1c + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_dicenumGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x1c + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x1c + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_dicenumLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x1c + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x1c + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_dicenum + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x1c + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION SPL_dicesize + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x20 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_dicesizeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x20 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x20 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_dicesizeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x20 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x20 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_dicesize + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x20 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION SPL_savebonus + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x28 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_savebonusGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x28 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x28 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_savebonusLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x28 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x28 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_savebonus + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x28 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION SPL_resistance + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x5c + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_resistanceGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x5c + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x5c + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_resistanceLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x5c + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x5c + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_resistance + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x5c + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION SPL_resist_dispel + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0xd + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_resist_dispelGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0xd + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0xd + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_resist_dispelLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0xd + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0xd + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_resist_dispel + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0xd + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION SPL_parameter3 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x60 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_parameter3GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x60 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x60 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_parameter3LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x60 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x60 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_parameter3 + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x60 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION SPL_parameter4 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x64 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_parameter4GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x64 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x64 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_parameter4LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x64 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x64 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_parameter4 + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x64 + offset_secondary) value + END + + DEFINE_PATCH_FUNCTION SPL_vvc + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x70 + offset_secondary) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x70 + offset_secondary) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_vvc + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x70 + offset_secondary) value + END + + DEFINE_PATCH_FUNCTION SPL_resource2 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x70 + offset_secondary) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x70 + offset_secondary) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_resource2 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x70 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION SPL_caster_xloc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x80 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_caster_xlocGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x80 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x80 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_caster_xlocLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x80 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x80 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_caster_xloc + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x80 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION SPL_caster_yloc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x84 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_caster_ylocGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x84 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x84 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_caster_ylocLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x84 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x84 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_caster_yloc + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x84 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION SPL_target_xloc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x88 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_target_xlocGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x88 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x88 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_target_xlocLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x88 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x88 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_target_xloc + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x88 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION SPL_target_yloc + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x8c + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_target_ylocGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x8c + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x8c + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_target_ylocLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x8c + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x8c + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_target_yloc + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x8c + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION SPL_dispel + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0xd + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_dispelGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0xd + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0xd + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_dispelLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT (0xd + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE (0xd + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_dispel + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE (0xd + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION SPL_save_bonus + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x28 + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_save_bonusGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x28 + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x28 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_save_bonusLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x28 + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x28 + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_save_bonus + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x28 + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION SPL_mode + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x2c + offset_secondary) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_modeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x2c + offset_secondary) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x2c + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_modeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x2c + offset_secondary) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x2c + offset_secondary) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_mode + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x2c + offset_secondary) value + END + + + DEFINE_PATCH_FUNCTION SPL_breaks_sanctuary STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BAND 253) + END ELSE BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_breaks_sanctuary STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x19 BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_breaks_invisibility STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BAND 251) + END ELSE BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_breaks_invisibility STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x19 BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_hostile STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BAND 251) + END ELSE BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_hostile STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x19 BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_no_LOS STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BAND 247) + END ELSE BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_no_LOS STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x19 BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_outdoors_only STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BAND 223) + END ELSE BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BOR 32) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_outdoors_only STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x19 BAND 32) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_not_magical STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BAND 191) + END ELSE BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_not_magical STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x19 BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_contingency STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BAND 127) + END ELSE BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BOR 128) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_contingency STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x19 BAND 128) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_not_wild_dead STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BAND 191) + END ELSE BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_not_wild_dead STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x19 BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_not_wild_surge STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BAND 127) + END ELSE BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BOR 128) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_not_wild_surge STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x19 BAND 128) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_not_in_combat STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1a (BYTE_AT 0x1a BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x1a (BYTE_AT 0x1a BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_not_in_combat STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1a BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_bypass_II STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1b (BYTE_AT 0x1b BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x1b (BYTE_AT 0x1b BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_bypass_II STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1b BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_castable_when_silenced STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1b (BYTE_AT 0x1b BAND 253) + END ELSE BEGIN + WRITE_BYTE 0x1b (BYTE_AT 0x1b BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_castable_when_silenced STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1b BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_unusable_chaotic_priest STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_unusable_chaotic_priest STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1e BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_unusable_evil_priest STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BAND 253) + END ELSE BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_unusable_evil_priest STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1e BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_unusable_good_priest STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BAND 251) + END ELSE BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_unusable_good_priest STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1e BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_unusable_GEneutral_priest STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BAND 247) + END ELSE BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_unusable_GEneutral_priest STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1e BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_unusable_lawful_priest STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BAND 239) + END ELSE BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_unusable_lawful_priest STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1e BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_unusable_LCneutral_priest STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BAND 223) + END ELSE BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BOR 32) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_unusable_LCneutral_priest STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1e BAND 32) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_unusable_abjurer STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BAND 191) + END ELSE BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_unusable_abjurer STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1e BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_unusable_conjurer STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BAND 127) + END ELSE BEGIN + WRITE_BYTE 0x1e (BYTE_AT 0x1e BOR 128) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_unusable_conjurer STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1e BAND 128) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_unusable_diviner STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1f (BYTE_AT 0x1f BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x1f (BYTE_AT 0x1f BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_unusable_diviner STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1f BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_unusable_enchanter STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1f (BYTE_AT 0x1f BAND 253) + END ELSE BEGIN + WRITE_BYTE 0x1f (BYTE_AT 0x1f BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_unusable_enchanter STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1f BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_unusable_illusionist STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1f (BYTE_AT 0x1f BAND 251) + END ELSE BEGIN + WRITE_BYTE 0x1f (BYTE_AT 0x1f BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_unusable_illusionist STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1f BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_unusable_invoker STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1f (BYTE_AT 0x1f BAND 247) + END ELSE BEGIN + WRITE_BYTE 0x1f (BYTE_AT 0x1f BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_unusable_invoker STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1f BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_unusable_necromancer STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1f (BYTE_AT 0x1f BAND 239) + END ELSE BEGIN + WRITE_BYTE 0x1f (BYTE_AT 0x1f BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_unusable_necromancer STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1f BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_unusable_transmuter STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1f (BYTE_AT 0x1f BAND 223) + END ELSE BEGIN + WRITE_BYTE 0x1f (BYTE_AT 0x1f BOR 32) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_unusable_transmuter STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1f BAND 32) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_unusable_generalist STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1f (BYTE_AT 0x1f BAND 191) + END ELSE BEGIN + WRITE_BYTE 0x1f (BYTE_AT 0x1f BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_unusable_generalist STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1f BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_unusable_cleric STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BAND 191) + END ELSE BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_unusable_cleric STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x21 BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_unusable_druid STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BAND 127) + END ELSE BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BOR 128) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_unusable_druid STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x21 BAND 128) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_save_vs_spell STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x24 + offset_secondary) (BYTE_AT (0x24 + offset_secondary) BAND 254) + END ELSE BEGIN + WRITE_BYTE (0x24 + offset_secondary) (BYTE_AT (0x24 + offset_secondary) BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_save_vs_spell STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x24 + offset_secondary) BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_save_spells STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x40 + offset_secondary) (BYTE_AT (0x40 + offset_secondary) BAND 254) + END ELSE BEGIN + WRITE_BYTE (0x40 + offset_secondary) (BYTE_AT (0x40 + offset_secondary) BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_save_spells STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x40 + offset_secondary) BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_save_vs_breath STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x24 + offset_secondary) (BYTE_AT (0x24 + offset_secondary) BAND 253) + END ELSE BEGIN + WRITE_BYTE (0x24 + offset_secondary) (BYTE_AT (0x24 + offset_secondary) BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_save_vs_breath STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x24 + offset_secondary) BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_save_breath STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x40 + offset_secondary) (BYTE_AT (0x40 + offset_secondary) BAND 253) + END ELSE BEGIN + WRITE_BYTE (0x40 + offset_secondary) (BYTE_AT (0x40 + offset_secondary) BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_save_breath STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x40 + offset_secondary) BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_save_vs_death STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x24 + offset_secondary) (BYTE_AT (0x24 + offset_secondary) BAND 251) + END ELSE BEGIN + WRITE_BYTE (0x24 + offset_secondary) (BYTE_AT (0x24 + offset_secondary) BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_save_vs_death STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x24 + offset_secondary) BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_save_death STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x40 + offset_secondary) (BYTE_AT (0x40 + offset_secondary) BAND 251) + END ELSE BEGIN + WRITE_BYTE (0x40 + offset_secondary) (BYTE_AT (0x40 + offset_secondary) BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_save_death STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x40 + offset_secondary) BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_save_vs_wand STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x40 + offset_secondary) (BYTE_AT (0x40 + offset_secondary) BAND 247) + END ELSE BEGIN + WRITE_BYTE (0x40 + offset_secondary) (BYTE_AT (0x40 + offset_secondary) BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_save_vs_wand STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x40 + offset_secondary) BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_save_wands STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x40 + offset_secondary) (BYTE_AT (0x40 + offset_secondary) BAND 247) + END ELSE BEGIN + WRITE_BYTE (0x40 + offset_secondary) (BYTE_AT (0x40 + offset_secondary) BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_save_wands STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x40 + offset_secondary) BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_save_vs_polymorph STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x24 + offset_secondary) (BYTE_AT (0x24 + offset_secondary) BAND 239) + END ELSE BEGIN + WRITE_BYTE (0x24 + offset_secondary) (BYTE_AT (0x24 + offset_secondary) BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_save_vs_polymorph STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x24 + offset_secondary) BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_save_polymorph STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x40 + offset_secondary) (BYTE_AT (0x40 + offset_secondary) BAND 239) + END ELSE BEGIN + WRITE_BYTE (0x40 + offset_secondary) (BYTE_AT (0x40 + offset_secondary) BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_save_polymorph STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x40 + offset_secondary) BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_bypass_mirror_image STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x27 + offset_secondary) (BYTE_AT (0x27 + offset_secondary) BAND 254) + END ELSE BEGIN + WRITE_BYTE (0x27 + offset_secondary) (BYTE_AT (0x27 + offset_secondary) BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_bypass_mirror_image STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x27 + offset_secondary) BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_fist_only STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x48 + offset_secondary) (BYTE_AT (0x48 + offset_secondary) BAND 251) + END ELSE BEGIN + WRITE_BYTE (0x48 + offset_secondary) (BYTE_AT (0x48 + offset_secondary) BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_fist_only STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x48 + offset_secondary) BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_save_vs_poison STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x24 + offset_secondary) (BYTE_AT (0x24 + offset_secondary) BAND 251) + END ELSE BEGIN + WRITE_BYTE (0x24 + offset_secondary) (BYTE_AT (0x24 + offset_secondary) BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_save_vs_poison STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x24 + offset_secondary) BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_save_vs_wands STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x24 + offset_secondary) (BYTE_AT (0x24 + offset_secondary) BAND 247) + END ELSE BEGIN + WRITE_BYTE (0x24 + offset_secondary) (BYTE_AT (0x24 + offset_secondary) BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_save_vs_wands STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x24 + offset_secondary) BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_save_vs_petrification STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x24 + offset_secondary) (BYTE_AT (0x24 + offset_secondary) BAND 239) + END ELSE BEGIN + WRITE_BYTE (0x24 + offset_secondary) (BYTE_AT (0x24 + offset_secondary) BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_save_vs_petrification STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x24 + offset_secondary) BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_save_vs_spells STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x24 + offset_secondary) (BYTE_AT (0x24 + offset_secondary) BAND 254) + END ELSE BEGIN + WRITE_BYTE (0x24 + offset_secondary) (BYTE_AT (0x24 + offset_secondary) BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_save_vs_spells STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x24 + offset_secondary) BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_ignore_primary_target STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x25 + offset_secondary) (BYTE_AT (0x25 + offset_secondary) BAND 251) + END ELSE BEGIN + WRITE_BYTE (0x25 + offset_secondary) (BYTE_AT (0x25 + offset_secondary) BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_ignore_primary_target STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x25 + offset_secondary) BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_ignore_secondary_target STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x25 + offset_secondary) (BYTE_AT (0x25 + offset_secondary) BAND 247) + END ELSE BEGIN + WRITE_BYTE (0x25 + offset_secondary) (BYTE_AT (0x25 + offset_secondary) BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_ignore_secondary_target STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x25 + offset_secondary) BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_ignore_difficulty STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x27 + offset_secondary) (BYTE_AT (0x27 + offset_secondary) BAND 253) + END ELSE BEGIN + WRITE_BYTE (0x27 + offset_secondary) (BYTE_AT (0x27 + offset_secondary) BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_ignore_difficulty STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x27 + offset_secondary) BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_does_not_wake_sleeper STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x2d + offset_secondary) (BYTE_AT (0x2d + offset_secondary) BAND 251) + END ELSE BEGIN + WRITE_BYTE (0x2d + offset_secondary) (BYTE_AT (0x2d + offset_secondary) BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_does_not_wake_sleeper STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x2d + offset_secondary) BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_save_for_half STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x2d + offset_secondary) (BYTE_AT (0x2d + offset_secondary) BAND 254) + END ELSE BEGIN + WRITE_BYTE (0x2d + offset_secondary) (BYTE_AT (0x2d + offset_secondary) BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_save_for_half STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x2d + offset_secondary) BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION SPL_drain_hp_to_caster STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x2c + offset_secondary) (BYTE_AT (0x2c + offset_secondary) BAND 254) + END ELSE BEGIN + WRITE_BYTE (0x2c + offset_secondary) (BYTE_AT (0x2c + offset_secondary) BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION SPL_read_drain_hp_to_caster STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x2c + offset_secondary) BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION STO_store_type_code + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x8 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_store_type_codeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x8 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x8 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_store_type_codeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x8 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x8 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_store_type_code + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x8 value + END + + + DEFINE_PATCH_FUNCTION STO_name_string + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0xc arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_name_stringGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0xc < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0xc arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_name_stringLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0xc > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0xc arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_name_string + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0xc value + END + + + DEFINE_PATCH_FUNCTION STO_sell_markup + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x14 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_sell_markupGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x14 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x14 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_sell_markupLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x14 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x14 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_sell_markup + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x14 value + END + + + DEFINE_PATCH_FUNCTION STO_buy_markup + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x18 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_buy_markupGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x18 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x18 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_buy_markupLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x18 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x18 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_buy_markup + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x18 value + END + + + DEFINE_PATCH_FUNCTION STO_depreciation_rate + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x1c arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_depreciation_rateGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x1c < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x1c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_depreciation_rateLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x1c > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x1c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_depreciation_rate + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x1c value + END + + + DEFINE_PATCH_FUNCTION STO_will_depreciate + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x1d arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_will_depreciateGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x1d < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x1d arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_will_depreciateLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF BYTE_AT 0x1d > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_BYTE 0x1d arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_will_depreciate + STR_VAR arguments=~null~ RET value + BEGIN + READ_BYTE 0x1d value + END + + + DEFINE_PATCH_FUNCTION STO_stealing_failure_rate + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x20 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_stealing_failure_rateGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x20 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x20 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_stealing_failure_rateLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x20 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x20 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_stealing_failure_rate + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x20 value + END + + + DEFINE_PATCH_FUNCTION STO_space + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x22 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_spaceGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x22 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x22 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_spaceLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT 0x22 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT 0x22 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_space + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT 0x22 value + END + + + DEFINE_PATCH_FUNCTION STO_lore + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x3c arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_loreGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x3c < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x3c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_loreLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x3c > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x3c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_lore + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x3c value + END + + + DEFINE_PATCH_FUNCTION STO_identify_cost + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x40 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_identify_costGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x40 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x40 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_identify_costLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x40 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x40 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_identify_cost + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x40 value + END + + DEFINE_PATCH_FUNCTION STO_rumors + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x44 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x44 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_rumors + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x44 value + END + + DEFINE_PATCH_FUNCTION STO_rumors_donation + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x54 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x54 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_rumors_donation + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x54 value + END + + + DEFINE_PATCH_FUNCTION STO_price_peasant + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x60 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_price_peasantGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x60 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x60 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_price_peasantLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x60 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x60 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_price_peasant + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x60 value + END + + + DEFINE_PATCH_FUNCTION STO_price_merchant + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x64 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_price_merchantGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x64 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x64 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_price_merchantLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x64 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x64 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_price_merchant + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x64 value + END + + + DEFINE_PATCH_FUNCTION STO_price_noble + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x68 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_price_nobleGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x68 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x68 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_price_nobleLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x68 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x68 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_price_noble + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x68 value + END + + + DEFINE_PATCH_FUNCTION STO_price_royal + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x6c arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_price_royalGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x6c < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x6c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_price_royalLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x6c > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x6c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_price_royal + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x6c value + END + + DEFINE_PATCH_FUNCTION STO_item_resource + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x0 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x0 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_item_resource + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x0 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION STO_item_charges_1 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_item_charges_1GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xa + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_item_charges_1LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xa + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xa + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_item_charges_1 + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0xa + offset_base) value + END + + + DEFINE_PATCH_FUNCTION STO_item_charges_2 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xc + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_item_charges_2GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xc + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xc + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_item_charges_2LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xc + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xc + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_item_charges_2 + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0xc + offset_base) value + END + + + DEFINE_PATCH_FUNCTION STO_item_charges_3 + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xe + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_item_charges_3GT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xe + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xe + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_item_charges_3LT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF SHORT_AT (0xe + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_SHORT (0xe + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_item_charges_3 + STR_VAR arguments=~null~ RET value + BEGIN + READ_SHORT (0xe + offset_base) value + END + + + DEFINE_PATCH_FUNCTION STO_item_num_in_stock + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x14 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_item_num_in_stockGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x14 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x14 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_item_num_in_stockLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x14 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x14 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_item_num_in_stock + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x14 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION STO_items_infinite + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x18 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_items_infiniteGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x18 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x18 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_items_infiniteLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x18 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x18 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_items_infinite + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x18 + offset_base) value + END + + DEFINE_PATCH_FUNCTION STO_cure_resource + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x0 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x0 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_cure_resource + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x0 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION STO_item_bought + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x0 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_item_boughtGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x0 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x0 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_item_boughtLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x0 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x0 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_item_bought + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x0 + offset_base) value + END + + DEFINE_PATCH_FUNCTION STO_cure + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x0 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x0 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_cure + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x0 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION STO_cure_price + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x8 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_cure_priceGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x8 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x8 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_cure_priceLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x8 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x8 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_cure_price + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x8 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION STO_drinkname_string + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x8 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_drinkname_stringGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x8 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x8 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_drinkname_stringLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x8 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x8 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_drinkname_string + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x8 + offset_base) value + END + + DEFINE_PATCH_FUNCTION STO_special_rumor + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x0 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x0 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_special_rumor + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x0 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION STO_drink_price + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0xc + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_drink_priceGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0xc + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0xc + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_drink_priceLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0xc + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0xc + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_drink_price + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0xc + offset_base) value + END + + + DEFINE_PATCH_FUNCTION STO_intoxication + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x10 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_intoxicationGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x10 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x10 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_intoxicationLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x10 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x10 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_intoxication + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x10 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION STO_rumor_rate + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x10 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_rumor_rateGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x10 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x10 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_rumor_rateLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x10 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x10 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_rumor_rate + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x10 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION STO_room_peasant STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x5c + offset_base) (BYTE_AT (0x5c + offset_base) BAND 254) + END ELSE BEGIN + WRITE_BYTE (0x5c + offset_base) (BYTE_AT (0x5c + offset_base) BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_room_peasant STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x5c + offset_base) BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION STO_room_merchant STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x5c + offset_base) (BYTE_AT (0x5c + offset_base) BAND 253) + END ELSE BEGIN + WRITE_BYTE (0x5c + offset_base) (BYTE_AT (0x5c + offset_base) BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_room_merchant STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x5c + offset_base) BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION STO_room_noble STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x5c + offset_base) (BYTE_AT (0x5c + offset_base) BAND 251) + END ELSE BEGIN + WRITE_BYTE (0x5c + offset_base) (BYTE_AT (0x5c + offset_base) BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_room_noble STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x5c + offset_base) BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION STO_room_royal STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x5c + offset_base) (BYTE_AT (0x5c + offset_base) BAND 247) + END ELSE BEGIN + WRITE_BYTE (0x5c + offset_base) (BYTE_AT (0x5c + offset_base) BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_room_royal STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x5c + offset_base) BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION STO_can_buy STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x10 + offset_base) (BYTE_AT (0x10 + offset_base) BAND 254) + END ELSE BEGIN + WRITE_BYTE (0x10 + offset_base) (BYTE_AT (0x10 + offset_base) BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_can_buy STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x10 + offset_base) BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION STO_can_sell STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x10 + offset_base) (BYTE_AT (0x10 + offset_base) BAND 253) + END ELSE BEGIN + WRITE_BYTE (0x10 + offset_base) (BYTE_AT (0x10 + offset_base) BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_can_sell STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x10 + offset_base) BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION STO_can_identify STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x10 + offset_base) (BYTE_AT (0x10 + offset_base) BAND 251) + END ELSE BEGIN + WRITE_BYTE (0x10 + offset_base) (BYTE_AT (0x10 + offset_base) BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_can_identify STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x10 + offset_base) BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION STO_can_steal STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x10 + offset_base) (BYTE_AT (0x10 + offset_base) BAND 247) + END ELSE BEGIN + WRITE_BYTE (0x10 + offset_base) (BYTE_AT (0x10 + offset_base) BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_can_steal STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x10 + offset_base) BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION STO_can_buy_cures STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x10 + offset_base) (BYTE_AT (0x10 + offset_base) BAND 239) + END ELSE BEGIN + WRITE_BYTE (0x10 + offset_base) (BYTE_AT (0x10 + offset_base) BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_can_buy_cures STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x10 + offset_base) BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION STO_can_donate STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x10 + offset_base) (BYTE_AT (0x10 + offset_base) BAND 223) + END ELSE BEGIN + WRITE_BYTE (0x10 + offset_base) (BYTE_AT (0x10 + offset_base) BOR 32) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_can_donate STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x10 + offset_base) BAND 32) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION STO_can_buy_drinks STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x10 + offset_base) (BYTE_AT (0x10 + offset_base) BAND 191) + END ELSE BEGIN + WRITE_BYTE (0x10 + offset_base) (BYTE_AT (0x10 + offset_base) BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_can_buy_drinks STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x10 + offset_base) BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION STO_quality_bit_0 STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x10 + offset_base) (BYTE_AT (0x10 + offset_base) BAND 253) + END ELSE BEGIN + WRITE_BYTE (0x10 + offset_base) (BYTE_AT (0x10 + offset_base) BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_quality_bit_0 STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x10 + offset_base) BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION STO_quality_bit_1 STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x10 + offset_base) (BYTE_AT (0x10 + offset_base) BAND 251) + END ELSE BEGIN + WRITE_BYTE (0x10 + offset_base) (BYTE_AT (0x10 + offset_base) BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_quality_bit_1 STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x10 + offset_base) BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION STO_fence STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x11 + offset_base) (BYTE_AT (0x11 + offset_base) BAND 239) + END ELSE BEGIN + WRITE_BYTE (0x11 + offset_base) (BYTE_AT (0x11 + offset_base) BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_fence STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x11 + offset_base) BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION STO_state_identified STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x10 + offset_base) (BYTE_AT (0x10 + offset_base) BAND 254) + END ELSE BEGIN + WRITE_BYTE (0x10 + offset_base) (BYTE_AT (0x10 + offset_base) BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_state_identified STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x10 + offset_base) BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION STO_state_unstealable STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x10 + offset_base) (BYTE_AT (0x10 + offset_base) BAND 253) + END ELSE BEGIN + WRITE_BYTE (0x10 + offset_base) (BYTE_AT (0x10 + offset_base) BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_state_unstealable STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x10 + offset_base) BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION STO_state_stolen STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x10 + offset_base) (BYTE_AT (0x10 + offset_base) BAND 251) + END ELSE BEGIN + WRITE_BYTE (0x10 + offset_base) (BYTE_AT (0x10 + offset_base) BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION STO_read_state_stolen STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x10 + offset_base) BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION VEF_ticks_until_start + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x0 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VEF_ticks_until_startGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x0 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x0 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VEF_ticks_until_startLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x0 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x0 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VEF_read_ticks_until_start + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x0 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION VEF_ticks_until_loop + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x8 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VEF_ticks_until_loopGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x8 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x8 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VEF_ticks_until_loopLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x8 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x8 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VEF_read_ticks_until_loop + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x8 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION VEF_resource_type + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0xc + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VEF_resource_typeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0xc + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0xc + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VEF_resource_typeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0xc + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0xc + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VEF_read_resource_type + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0xc + offset_base) value + END + + DEFINE_PATCH_FUNCTION VEF_resource + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x10 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x10 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VEF_read_resource + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x10 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION VEF_continuous + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x18 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VEF_continuousGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x18 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x18 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VEF_continuousLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x18 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x18 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VEF_read_continuous + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x18 + offset_base) value + END + + DEFINE_PATCH_FUNCTION VVC_anim + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x8 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x8 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_anim + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x8 value + END + + DEFINE_PATCH_FUNCTION VVC_anim0 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x8 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x8 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_anim0 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x8 value + END + + + DEFINE_PATCH_FUNCTION VVC_x_pos + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x28 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_x_posGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x28 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x28 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_x_posLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x28 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x28 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_x_pos + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x28 value + END + + + DEFINE_PATCH_FUNCTION VVC_y_pos + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x2c arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_y_posGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x2c < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x2c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_y_posLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x2c > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x2c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_y_pos + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x2c value + END + + + DEFINE_PATCH_FUNCTION VVC_orientation + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x30 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_orientationGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x30 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x30 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_orientationLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x30 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x30 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_orientation + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x30 value + END + + + DEFINE_PATCH_FUNCTION VVC_frame_rate + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x34 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_frame_rateGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x34 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x34 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_frame_rateLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x34 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x34 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_frame_rate + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x34 value + END + + + DEFINE_PATCH_FUNCTION VVC_num_orient + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x38 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_num_orientGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x38 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x38 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_num_orientLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x38 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x38 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_num_orient + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x38 value + END + + DEFINE_PATCH_FUNCTION VVC_palette + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x44 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x44 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_palette + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x44 value + END + + + DEFINE_PATCH_FUNCTION VVC_z_pos + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x4c arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_z_posGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x4c < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x4c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_z_posLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x4c > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x4c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_z_pos + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x4c value + END + + + DEFINE_PATCH_FUNCTION VVC_ctr_x + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x50 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_ctr_xGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x50 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x50 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_ctr_xLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x50 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x50 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_ctr_x + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x50 value + END + + + DEFINE_PATCH_FUNCTION VVC_ctr_y + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x54 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_ctr_yGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x54 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x54 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_ctr_yLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x54 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x54 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_ctr_y + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x54 value + END + + + DEFINE_PATCH_FUNCTION VVC_brightness + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x58 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_brightnessGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x58 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x58 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_brightnessLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x58 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x58 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_brightness + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x58 value + END + + + DEFINE_PATCH_FUNCTION VVC_num_frames + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x5c arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_num_framesGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x5c < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x5c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_num_framesLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x5c > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x5c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_num_frames + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x5c value + END + + + DEFINE_PATCH_FUNCTION VVC_seq_start + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x68 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_seq_startGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x68 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x68 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_seq_startLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x68 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x68 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_seq_start + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x68 value + END + + + DEFINE_PATCH_FUNCTION VVC_seq_middle + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x6c arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_seq_middleGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x6c < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x6c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_seq_middleLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x6c > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x6c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_seq_middle + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x6c value + END + + + DEFINE_PATCH_FUNCTION VVC_seq_current + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x70 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_seq_currentGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x70 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x70 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_seq_currentLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x70 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x70 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_seq_current + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x70 value + END + + + DEFINE_PATCH_FUNCTION VVC_continuous + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x74 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_continuousGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x74 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x74 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_continuousLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x74 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x74 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_continuous + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x74 value + END + + DEFINE_PATCH_FUNCTION VVC_wav_start + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x78 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x78 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_wav_start + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x78 value + END + + DEFINE_PATCH_FUNCTION VVC_wav_middle + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x80 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x80 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_wav_middle + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x80 value + END + + DEFINE_PATCH_FUNCTION VVC_wav_start0 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x78 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x78 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_wav_start0 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x78 value + END + + DEFINE_PATCH_FUNCTION VVC_wav_middle0 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x80 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x80 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_wav_middle0 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x80 value + END + + DEFINE_PATCH_FUNCTION VVC_alpha + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x88 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x88 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_alpha + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x88 value + END + + + DEFINE_PATCH_FUNCTION VVC_seq_end + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x90 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_seq_endGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x90 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x90 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_seq_endLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x90 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x90 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_seq_end + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x90 value + END + + DEFINE_PATCH_FUNCTION VVC_wav_end + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x94 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x94 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_wav_end + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x94 value + END + + DEFINE_PATCH_FUNCTION VVC_wav_end0 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x94 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x94 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_wav_end0 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x94 value + END + + + DEFINE_PATCH_FUNCTION VVC_transparent STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x18 (BYTE_AT 0x18 BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x18 (BYTE_AT 0x18 BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_transparent STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x18 BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION VVC_translucent STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x18 (BYTE_AT 0x18 BAND 253) + END ELSE BEGIN + WRITE_BYTE 0x18 (BYTE_AT 0x18 BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_translucent STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x18 BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION VVC_translucent_shadow STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x18 (BYTE_AT 0x18 BAND 251) + END ELSE BEGIN + WRITE_BYTE 0x18 (BYTE_AT 0x18 BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_translucent_shadow STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x18 BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION VVC_blended STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x18 (BYTE_AT 0x18 BAND 247) + END ELSE BEGIN + WRITE_BYTE 0x18 (BYTE_AT 0x18 BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_blended STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x18 BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION VVC_mirror_x STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x18 (BYTE_AT 0x18 BAND 239) + END ELSE BEGIN + WRITE_BYTE 0x18 (BYTE_AT 0x18 BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_mirror_x STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x18 BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION VVC_mirror_y STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x18 (BYTE_AT 0x18 BAND 223) + END ELSE BEGIN + WRITE_BYTE 0x18 (BYTE_AT 0x18 BOR 32) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_mirror_y STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x18 BAND 32) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION VVC_clip STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x18 (BYTE_AT 0x18 BAND 191) + END ELSE BEGIN + WRITE_BYTE 0x18 (BYTE_AT 0x18 BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_clip STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x18 BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION VVC_copy_from_back STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x18 (BYTE_AT 0x18 BAND 127) + END ELSE BEGIN + WRITE_BYTE 0x18 (BYTE_AT 0x18 BOR 128) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_copy_from_back STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x18 BAND 128) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION VVC_clear_fill STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_clear_fill STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x19 BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION VVC_3d_blend STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BAND 253) + END ELSE BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_3d_blend STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x19 BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION VVC_ignore_wall STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BAND 251) + END ELSE BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_ignore_wall STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x19 BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION VVC_ignore_timestop STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BAND 247) + END ELSE BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_ignore_timestop STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x19 BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION VVC_ignore_dream STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BAND 239) + END ELSE BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_ignore_dream STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x19 BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION VVC_2d_blend STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BAND 223) + END ELSE BEGIN + WRITE_BYTE 0x19 (BYTE_AT 0x19 BOR 32) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_2d_blend STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x19 BAND 32) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION VVC_not_light_source STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1a (BYTE_AT 0x1a BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x1a (BYTE_AT 0x1a BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_not_light_source STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1a BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION VVC_light_source STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1a (BYTE_AT 0x1a BAND 253) + END ELSE BEGIN + WRITE_BYTE 0x1a (BYTE_AT 0x1a BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_light_source STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1a BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION VVC_internal_brightness STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1a (BYTE_AT 0x1a BAND 251) + END ELSE BEGIN + WRITE_BYTE 0x1a (BYTE_AT 0x1a BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_internal_brightness STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1a BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION VVC_timestopped STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1a (BYTE_AT 0x1a BAND 247) + END ELSE BEGIN + WRITE_BYTE 0x1a (BYTE_AT 0x1a BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_timestopped STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1a BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION VVC_sepia STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x1b (BYTE_AT 0x1b BAND 251) + END ELSE BEGIN + WRITE_BYTE 0x1b (BYTE_AT 0x1b BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_sepia STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x1b BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION VVC_looping STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_looping STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x20 BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION VVC_special_lighting STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BAND 253) + END ELSE BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_special_lighting STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x20 BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION VVC_modify_for_height STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BAND 251) + END ELSE BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_modify_for_height STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x20 BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION VVC_draw_animation STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BAND 247) + END ELSE BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_draw_animation STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x20 BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION VVC_custom_palette STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BAND 239) + END ELSE BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BOR 16) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_custom_palette STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x20 BAND 16) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION VVC_purgeable STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BAND 223) + END ELSE BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BOR 32) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_purgeable STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x20 BAND 32) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION VVC_ignore_wallgroups STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BAND 191) + END ELSE BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BOR 64) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_ignore_wallgroups STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x20 BAND 64) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION VVC_mid_level_brighten STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BAND 127) + END ELSE BEGIN + WRITE_BYTE 0x20 (BYTE_AT 0x20 BOR 128) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_mid_level_brighten STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x20 BAND 128) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION VVC_high_level_brighten STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x21 (BYTE_AT 0x21 BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_high_level_brighten STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x21 BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION VVC_orbit_target STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x40 (BYTE_AT 0x40 BAND 254) + END ELSE BEGIN + WRITE_BYTE 0x40 (BYTE_AT 0x40 BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_orbit_target STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x40 BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION VVC_relative_to_target STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x40 (BYTE_AT 0x40 BAND 253) + END ELSE BEGIN + WRITE_BYTE 0x40 (BYTE_AT 0x40 BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_relative_to_target STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x40 BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION VVC_ignore_orientation STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE 0x40 (BYTE_AT 0x40 BAND 247) + END ELSE BEGIN + WRITE_BYTE 0x40 (BYTE_AT 0x40 BOR 8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION VVC_read_ignore_orientation STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT 0x40 BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION WMP_width + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x18 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_widthGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x18 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x18 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_widthLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x18 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x18 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_width + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x18 value + END + + + DEFINE_PATCH_FUNCTION WMP_height + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x1c arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_heightGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x1c < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x1c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_heightLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x1c > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x1c arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_height + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x1c value + END + + DEFINE_PATCH_FUNCTION WMP_icons + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x40 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x40 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_icons + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x40 value + END + + + DEFINE_PATCH_FUNCTION WMP_global_name_string + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x24 arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_global_name_stringGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x24 < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x24 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_global_name_stringLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT 0x24 > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG 0x24 arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_global_name_string + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG 0x24 value + END + + DEFINE_PATCH_FUNCTION WMP_map + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII 0x10 "" (8) + END + DEFAULT + WRITE_ASCIIE 0x10 "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_map + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII 0x10 value + END + + DEFINE_PATCH_FUNCTION WMP_short_name + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x0 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x0 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_short_name + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x0 + offset_base) value + END + + DEFINE_PATCH_FUNCTION WMP_resource + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x8 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x8 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_resource + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x8 + offset_base) value + END + + DEFINE_PATCH_FUNCTION WMP_long_name + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x10 + offset_base) "" (0x20) + END + DEFAULT + WRITE_ASCIIE (0x10 + offset_base) "%arguments%" (0x20) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_long_name + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x10 + offset_base) value (0x20) NULL + END + + + DEFINE_PATCH_FUNCTION WMP_sequence + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x34 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_sequenceGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x34 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x34 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_sequenceLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x34 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x34 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_sequence + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x34 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION WMP_x + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x38 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_xGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x38 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x38 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_xLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x38 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x38 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_x + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x38 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION WMP_y + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x3c + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_yGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x3c + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x3c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_yLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x3c + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x3c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_y + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x3c + offset_base) value + END + + + DEFINE_PATCH_FUNCTION WMP_name_string + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x40 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_name_stringGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x40 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x40 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_name_stringLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x40 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x40 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_name_string + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x40 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION WMP_tooltip_string + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x44 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_tooltip_stringGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x44 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x44 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_tooltip_stringLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x44 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x44 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_tooltip_string + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x44 + offset_base) value + END + + DEFINE_PATCH_FUNCTION WMP_loadscreen + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x48 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x48 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_loadscreen + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x48 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION WMP_area_link_ind_north + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x50 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_area_link_ind_northGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x50 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x50 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_area_link_ind_northLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x50 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x50 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_area_link_ind_north + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x50 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION WMP_area_link_ind_west + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x58 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_area_link_ind_westGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x58 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x58 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_area_link_ind_westLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x58 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x58 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_area_link_ind_west + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x58 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION WMP_area_link_ind_south + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x60 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_area_link_ind_southGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x60 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x60 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_area_link_ind_southLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x60 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x60 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_area_link_ind_south + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x60 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION WMP_area_link_ind_east + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x68 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_area_link_ind_eastGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x68 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x68 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_area_link_ind_eastLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x68 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x68 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_area_link_ind_east + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x68 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION WMP_area_link_num_north + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x54 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_area_link_num_northGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x54 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x54 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_area_link_num_northLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x54 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x54 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_area_link_num_north + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x54 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION WMP_area_link_num_west + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x5c + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_area_link_num_westGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x5c + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x5c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_area_link_num_westLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x5c + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x5c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_area_link_num_west + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x5c + offset_base) value + END + + + DEFINE_PATCH_FUNCTION WMP_area_link_num_south + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x64 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_area_link_num_southGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x64 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x64 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_area_link_num_southLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x64 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x64 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_area_link_num_south + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x64 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION WMP_area_link_num_east + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x6c + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_area_link_num_eastGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x6c + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x6c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_area_link_num_eastLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x6c + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x6c + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_area_link_num_east + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x6c + offset_base) value + END + + + DEFINE_PATCH_FUNCTION WMP_link_dest_ind + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x0 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_link_dest_indGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x0 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x0 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_link_dest_indLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x0 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x0 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_link_dest_ind + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x0 + offset_base) value + END + + DEFINE_PATCH_FUNCTION WMP_entrance + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x4 + offset_base) "" (0x20) + END + DEFAULT + WRITE_ASCIIE (0x4 + offset_base) "%arguments%" (0x20) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_entrance + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x4 + offset_base) value (0x20) NULL + END + + + DEFINE_PATCH_FUNCTION WMP_link_travtime_div_four + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x24 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_link_travtime_div_fourGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x24 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x24 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_link_travtime_div_fourLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x24 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x24 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_link_travtime_div_four + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x24 + offset_base) value + END + + DEFINE_PATCH_FUNCTION WMP_random_area_1 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x2c + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x2c + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_random_area_1 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x2c + offset_base) value + END + + DEFINE_PATCH_FUNCTION WMP_random_area_2 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x34 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x34 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_random_area_2 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x34 + offset_base) value + END + + DEFINE_PATCH_FUNCTION WMP_random_area_3 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x3c + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x3c + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_random_area_3 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x3c + offset_base) value + END + + DEFINE_PATCH_FUNCTION WMP_random_area_4 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x44 + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x44 + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_random_area_4 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x44 + offset_base) value + END + + DEFINE_PATCH_FUNCTION WMP_random_area_5 + STR_VAR arguments="" RET value + BEGIN + + PATCH_MATCH "%arguments%" WITH + no_change BEGIN END + null BEGIN + WRITE_ASCII (0x4c + offset_base) "" (8) + END + DEFAULT + WRITE_ASCIIE (0x4c + offset_base) "%arguments%" (8) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_random_area_5 + STR_VAR arguments=~null~ RET value + BEGIN + READ_ASCII (0x4c + offset_base) value + END + + + DEFINE_PATCH_FUNCTION WMP_random_prob + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x54 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_random_probGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x54 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x54 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_random_probLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x54 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x54 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_random_prob + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x54 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION WMP_link_entryloc_code + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x28 + offset_base) arguments + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_link_entryloc_codeGT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x28 + offset_base) < arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x28 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_link_entryloc_codeLT + STR_VAR arguments="" RET value + BEGIN + LPF fail_unless_int STR_VAR value="%arguments%" expression="" END + PATCH_IF LONG_AT (0x28 + offset_base) > arguments BEGIN + PATCH_IF "%arguments%" STRING_COMPARE no_change BEGIN + WRITE_LONG (0x28 + offset_base) arguments + END + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_link_entryloc_code + STR_VAR arguments=~null~ RET value + BEGIN + READ_LONG (0x28 + offset_base) value + END + + + DEFINE_PATCH_FUNCTION WMP_visible STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x30 + offset_base) (BYTE_AT (0x30 + offset_base) BAND 254) + END ELSE BEGIN + WRITE_BYTE (0x30 + offset_base) (BYTE_AT (0x30 + offset_base) BOR 1) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_visible STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x30 + offset_base) BAND 1) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION WMP_visible_from_adjacent STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x30 + offset_base) (BYTE_AT (0x30 + offset_base) BAND 253) + END ELSE BEGIN + WRITE_BYTE (0x30 + offset_base) (BYTE_AT (0x30 + offset_base) BOR 2) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_visible_from_adjacent STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x30 + offset_base) BAND 2) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION WMP_reachable STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x30 + offset_base) (BYTE_AT (0x30 + offset_base) BAND 251) + END ELSE BEGIN + WRITE_BYTE (0x30 + offset_base) (BYTE_AT (0x30 + offset_base) BOR 4) + END + SET value=1 + END + DEFINE_PATCH_FUNCTION WMP_read_reachable STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x30 + offset_base) BAND 4) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + + DEFINE_PATCH_FUNCTION WMP_visited STR_VAR arguments="" RET value BEGIN + LPF fail_unless_boolean STR_VAR value="%arguments%" expression="" END + PATCH_IF arguments=0 BEGIN + WRITE_BYTE (0x30 + offset_base) (BYTE_AT (0x30 + offset_base) BAND 247) + END ELSE BEGIN + WRITE_BYTE (0x30 + offset_base) (BYTE_AT (0x30 + offset_base) BOR 8) + END + SET value=1 + + END + + DEFINE_PATCH_FUNCTION WMP_read_visited STR_VAR arguments="" RET value BEGIN + PATCH_IF (BYTE_AT (0x30 + offset_base) BAND 8) = 0 BEGIN + SET value=0 + END ELSE BEGIN + SET value=1 + END + END + + diff --git a/iwdification/spl/cdi3sklm.spl b/iwdification/spl/cdi3sklm.spl deleted file mode 100644 index 450f023..0000000 Binary files a/iwdification/spl/cdi3sklm.spl and /dev/null differ diff --git a/iwdification/spl/cdia126.spl b/iwdification/spl/cdia126.spl deleted file mode 100644 index 6f69ff6..0000000 Binary files a/iwdification/spl/cdia126.spl and /dev/null differ diff --git a/iwdification/spl/cdia204.spl b/iwdification/spl/cdia204.spl deleted file mode 100644 index 8be151d..0000000 Binary files a/iwdification/spl/cdia204.spl and /dev/null differ diff --git a/iwdification/spl/cdia216.spl b/iwdification/spl/cdia216.spl deleted file mode 100644 index d8e98e0..0000000 Binary files a/iwdification/spl/cdia216.spl and /dev/null differ diff --git a/iwdification/spl/cdia225.spl b/iwdification/spl/cdia225.spl deleted file mode 100644 index 8a3cebf..0000000 Binary files a/iwdification/spl/cdia225.spl and /dev/null differ diff --git a/iwdification/spl/cdia227.spl b/iwdification/spl/cdia227.spl deleted file mode 100644 index 433612d..0000000 Binary files a/iwdification/spl/cdia227.spl and /dev/null differ diff --git a/iwdification/spl/cdia327.spl b/iwdification/spl/cdia327.spl deleted file mode 100644 index 5bc6cf2..0000000 Binary files a/iwdification/spl/cdia327.spl and /dev/null differ diff --git a/iwdification/spl/cdia328.spl b/iwdification/spl/cdia328.spl deleted file mode 100644 index 6881477..0000000 Binary files a/iwdification/spl/cdia328.spl and /dev/null differ diff --git a/iwdification/spl/cdia411.spl b/iwdification/spl/cdia411.spl deleted file mode 100644 index cc8c6ca..0000000 Binary files a/iwdification/spl/cdia411.spl and /dev/null differ diff --git a/iwdification/spl/cdia422.spl b/iwdification/spl/cdia422.spl deleted file mode 100644 index 3c7babd..0000000 Binary files a/iwdification/spl/cdia422.spl and /dev/null differ diff --git a/iwdification/spl/cdia422a.spl b/iwdification/spl/cdia422a.spl deleted file mode 100644 index 9ac71db..0000000 Binary files a/iwdification/spl/cdia422a.spl and /dev/null differ diff --git a/iwdification/spl/cdia426.spl b/iwdification/spl/cdia426.spl deleted file mode 100644 index 026032c..0000000 Binary files a/iwdification/spl/cdia426.spl and /dev/null differ diff --git a/iwdification/spl/cdia427.spl b/iwdification/spl/cdia427.spl deleted file mode 100644 index 28cd8f0..0000000 Binary files a/iwdification/spl/cdia427.spl and /dev/null differ diff --git a/iwdification/spl/cdia428.spl b/iwdification/spl/cdia428.spl deleted file mode 100644 index 54636ee..0000000 Binary files a/iwdification/spl/cdia428.spl and /dev/null differ diff --git a/iwdification/spl/cdia429.spl b/iwdification/spl/cdia429.spl deleted file mode 100644 index f26111c..0000000 Binary files a/iwdification/spl/cdia429.spl and /dev/null differ diff --git a/iwdification/spl/cdia430.spl b/iwdification/spl/cdia430.spl deleted file mode 100644 index 2733b2c..0000000 Binary files a/iwdification/spl/cdia430.spl and /dev/null differ diff --git a/iwdification/spl/cdia430b.spl b/iwdification/spl/cdia430b.spl deleted file mode 100644 index 2735796..0000000 Binary files a/iwdification/spl/cdia430b.spl and /dev/null differ diff --git a/iwdification/spl/cdia431.spl b/iwdification/spl/cdia431.spl deleted file mode 100644 index b622c6c..0000000 Binary files a/iwdification/spl/cdia431.spl and /dev/null differ diff --git a/iwdification/spl/cdia432.spl b/iwdification/spl/cdia432.spl deleted file mode 100644 index 7f62962..0000000 Binary files a/iwdification/spl/cdia432.spl and /dev/null differ diff --git a/iwdification/spl/cdia432y.spl b/iwdification/spl/cdia432y.spl deleted file mode 100644 index 14a1a19..0000000 Binary files a/iwdification/spl/cdia432y.spl and /dev/null differ diff --git a/iwdification/spl/cdia480.spl b/iwdification/spl/cdia480.spl deleted file mode 100644 index 50f8400..0000000 Binary files a/iwdification/spl/cdia480.spl and /dev/null differ diff --git a/iwdification/spl/cdia481.spl b/iwdification/spl/cdia481.spl deleted file mode 100644 index cbbfb7b..0000000 Binary files a/iwdification/spl/cdia481.spl and /dev/null differ diff --git a/iwdification/spl/cdia482.spl b/iwdification/spl/cdia482.spl deleted file mode 100644 index 3b0a49d..0000000 Binary files a/iwdification/spl/cdia482.spl and /dev/null differ diff --git a/iwdification/spl/cdia524.spl b/iwdification/spl/cdia524.spl deleted file mode 100644 index ec5ffed..0000000 Binary files a/iwdification/spl/cdia524.spl and /dev/null differ diff --git a/iwdification/spl/cdia524b.spl b/iwdification/spl/cdia524b.spl deleted file mode 100644 index 21a734c..0000000 Binary files a/iwdification/spl/cdia524b.spl and /dev/null differ diff --git a/iwdification/spl/cdia525.spl b/iwdification/spl/cdia525.spl deleted file mode 100644 index 958681d..0000000 Binary files a/iwdification/spl/cdia525.spl and /dev/null differ diff --git a/iwdification/spl/cdia526.spl b/iwdification/spl/cdia526.spl deleted file mode 100644 index fe7a39d..0000000 Binary files a/iwdification/spl/cdia526.spl and /dev/null differ diff --git a/iwdification/spl/cdia528.spl b/iwdification/spl/cdia528.spl deleted file mode 100644 index e4246aa..0000000 Binary files a/iwdification/spl/cdia528.spl and /dev/null differ diff --git a/iwdification/spl/cdia531.spl b/iwdification/spl/cdia531.spl deleted file mode 100644 index 7f1614d..0000000 Binary files a/iwdification/spl/cdia531.spl and /dev/null differ diff --git a/iwdification/spl/cdia532.spl b/iwdification/spl/cdia532.spl deleted file mode 100644 index 3ad6484..0000000 Binary files a/iwdification/spl/cdia532.spl and /dev/null differ diff --git a/iwdification/spl/cdia533.spl b/iwdification/spl/cdia533.spl deleted file mode 100644 index 3c5bf01..0000000 Binary files a/iwdification/spl/cdia533.spl and /dev/null differ diff --git a/iwdification/spl/cdia534.spl b/iwdification/spl/cdia534.spl deleted file mode 100644 index 5668799..0000000 Binary files a/iwdification/spl/cdia534.spl and /dev/null differ diff --git a/iwdification/spl/cdia610.spl b/iwdification/spl/cdia610.spl deleted file mode 100644 index 3b99937..0000000 Binary files a/iwdification/spl/cdia610.spl and /dev/null differ diff --git a/iwdification/spl/cdia626.spl b/iwdification/spl/cdia626.spl deleted file mode 100644 index 68b6b1f..0000000 Binary files a/iwdification/spl/cdia626.spl and /dev/null differ diff --git a/iwdification/spl/cdia626a.spl b/iwdification/spl/cdia626a.spl deleted file mode 100644 index 7b6c35f..0000000 Binary files a/iwdification/spl/cdia626a.spl and /dev/null differ diff --git a/iwdification/spl/cdia627.spl b/iwdification/spl/cdia627.spl deleted file mode 100644 index 842e66b..0000000 Binary files a/iwdification/spl/cdia627.spl and /dev/null differ diff --git a/iwdification/spl/cdia628.spl b/iwdification/spl/cdia628.spl deleted file mode 100644 index dfc8769..0000000 Binary files a/iwdification/spl/cdia628.spl and /dev/null differ diff --git a/iwdification/spl/cdia629.spl b/iwdification/spl/cdia629.spl deleted file mode 100644 index ec10b86..0000000 Binary files a/iwdification/spl/cdia629.spl and /dev/null differ diff --git a/iwdification/spl/cdia630.spl b/iwdification/spl/cdia630.spl deleted file mode 100644 index 8d0828e..0000000 Binary files a/iwdification/spl/cdia630.spl and /dev/null differ diff --git a/iwdification/spl/cdia631.spl b/iwdification/spl/cdia631.spl deleted file mode 100644 index 287dfbf..0000000 Binary files a/iwdification/spl/cdia631.spl and /dev/null differ diff --git a/iwdification/spl/cdia631b.spl b/iwdification/spl/cdia631b.spl deleted file mode 100644 index 0b7f12f..0000000 Binary files a/iwdification/spl/cdia631b.spl and /dev/null differ diff --git a/iwdification/spl/cdia632.spl b/iwdification/spl/cdia632.spl deleted file mode 100644 index 5fb8073..0000000 Binary files a/iwdification/spl/cdia632.spl and /dev/null differ diff --git a/iwdification/spl/cdia706.spl b/iwdification/spl/cdia706.spl deleted file mode 100644 index d72743b..0000000 Binary files a/iwdification/spl/cdia706.spl and /dev/null differ diff --git a/iwdification/spl/cdia709.spl b/iwdification/spl/cdia709.spl deleted file mode 100644 index b84f26d..0000000 Binary files a/iwdification/spl/cdia709.spl and /dev/null differ diff --git a/iwdification/spl/cdia724.spl b/iwdification/spl/cdia724.spl deleted file mode 100644 index f6cdc87..0000000 Binary files a/iwdification/spl/cdia724.spl and /dev/null differ diff --git a/iwdification/spl/cdia725.spl b/iwdification/spl/cdia725.spl deleted file mode 100644 index afe0057..0000000 Binary files a/iwdification/spl/cdia725.spl and /dev/null differ diff --git a/iwdification/spl/cdia725t.spl b/iwdification/spl/cdia725t.spl deleted file mode 100644 index 641f005..0000000 Binary files a/iwdification/spl/cdia725t.spl and /dev/null differ diff --git a/iwdification/spl/cdia725u.spl b/iwdification/spl/cdia725u.spl deleted file mode 100644 index 0389975..0000000 Binary files a/iwdification/spl/cdia725u.spl and /dev/null differ diff --git a/iwdification/spl/cdia725v.spl b/iwdification/spl/cdia725v.spl deleted file mode 100644 index 336fb0d..0000000 Binary files a/iwdification/spl/cdia725v.spl and /dev/null differ diff --git a/iwdification/spl/cdia725w.spl b/iwdification/spl/cdia725w.spl deleted file mode 100644 index 2533430..0000000 Binary files a/iwdification/spl/cdia725w.spl and /dev/null differ diff --git a/iwdification/spl/cdia725x.spl b/iwdification/spl/cdia725x.spl deleted file mode 100644 index 9d01fc0..0000000 Binary files a/iwdification/spl/cdia725x.spl and /dev/null differ diff --git a/iwdification/spl/cdia725y.spl b/iwdification/spl/cdia725y.spl deleted file mode 100644 index 5e216fb..0000000 Binary files a/iwdification/spl/cdia725y.spl and /dev/null differ diff --git a/iwdification/spl/cdia725z.spl b/iwdification/spl/cdia725z.spl deleted file mode 100644 index c383044..0000000 Binary files a/iwdification/spl/cdia725z.spl and /dev/null differ diff --git a/iwdification/spl/cdia726.spl b/iwdification/spl/cdia726.spl deleted file mode 100644 index eea3380..0000000 Binary files a/iwdification/spl/cdia726.spl and /dev/null differ diff --git a/iwdification/spl/cdia801.spl b/iwdification/spl/cdia801.spl deleted file mode 100644 index fafa60f..0000000 Binary files a/iwdification/spl/cdia801.spl and /dev/null differ diff --git a/iwdification/spl/cdia802.spl b/iwdification/spl/cdia802.spl deleted file mode 100644 index 71a91d5..0000000 Binary files a/iwdification/spl/cdia802.spl and /dev/null differ diff --git a/iwdification/spl/cdia806.spl b/iwdification/spl/cdia806.spl deleted file mode 100644 index bf026de..0000000 Binary files a/iwdification/spl/cdia806.spl and /dev/null differ diff --git a/iwdification/spl/cdia814.spl b/iwdification/spl/cdia814.spl deleted file mode 100644 index 366eb43..0000000 Binary files a/iwdification/spl/cdia814.spl and /dev/null differ diff --git a/iwdification/spl/cdia901.spl b/iwdification/spl/cdia901.spl deleted file mode 100644 index 9159262..0000000 Binary files a/iwdification/spl/cdia901.spl and /dev/null differ diff --git a/iwdification/spl/cdibar0.spl b/iwdification/spl/cdibar0.spl deleted file mode 100644 index c4dd108..0000000 Binary files a/iwdification/spl/cdibar0.spl and /dev/null differ diff --git a/iwdification/spl/cdibar1.spl b/iwdification/spl/cdibar1.spl deleted file mode 100644 index eecf35a..0000000 Binary files a/iwdification/spl/cdibar1.spl and /dev/null differ diff --git a/iwdification/spl/cdibar2.spl b/iwdification/spl/cdibar2.spl deleted file mode 100644 index 901bcea..0000000 Binary files a/iwdification/spl/cdibar2.spl and /dev/null differ diff --git a/iwdification/spl/cdibar3.spl b/iwdification/spl/cdibar3.spl deleted file mode 100644 index ea355c1..0000000 Binary files a/iwdification/spl/cdibar3.spl and /dev/null differ diff --git a/iwdification/spl/cdibar4.spl b/iwdification/spl/cdibar4.spl deleted file mode 100644 index b020943..0000000 Binary files a/iwdification/spl/cdibar4.spl and /dev/null differ diff --git a/iwdification/spl/cdibar5.spl b/iwdification/spl/cdibar5.spl deleted file mode 100644 index 68abb93..0000000 Binary files a/iwdification/spl/cdibar5.spl and /dev/null differ diff --git a/iwdification/spl/cdibar6.spl b/iwdification/spl/cdibar6.spl deleted file mode 100644 index 74579b2..0000000 Binary files a/iwdification/spl/cdibar6.spl and /dev/null differ diff --git a/iwdification/spl/cdibara.spl b/iwdification/spl/cdibara.spl deleted file mode 100644 index a9c565a..0000000 Binary files a/iwdification/spl/cdibara.spl and /dev/null differ diff --git a/iwdification/spl/cdibarb.spl b/iwdification/spl/cdibarb.spl deleted file mode 100644 index 5a96ab0..0000000 Binary files a/iwdification/spl/cdibarb.spl and /dev/null differ diff --git a/iwdification/spl/cdibarc.spl b/iwdification/spl/cdibarc.spl deleted file mode 100644 index ba93bc8..0000000 Binary files a/iwdification/spl/cdibarc.spl and /dev/null differ diff --git a/iwdification/spl/cdibard.spl b/iwdification/spl/cdibard.spl deleted file mode 100644 index 7b4ca44..0000000 Binary files a/iwdification/spl/cdibard.spl and /dev/null differ diff --git a/iwdification/spl/cdibare.spl b/iwdification/spl/cdibare.spl deleted file mode 100644 index ef70bcd..0000000 Binary files a/iwdification/spl/cdibare.spl and /dev/null differ diff --git a/iwdification/spl/cdibare0.spl b/iwdification/spl/cdibare0.spl deleted file mode 100644 index 8c49eda..0000000 Binary files a/iwdification/spl/cdibare0.spl and /dev/null differ diff --git a/iwdification/spl/cdibarf.spl b/iwdification/spl/cdibarf.spl deleted file mode 100644 index e3dc331..0000000 Binary files a/iwdification/spl/cdibarf.spl and /dev/null differ diff --git a/iwdification/spl/cdibombb.spl b/iwdification/spl/cdibombb.spl deleted file mode 100644 index 28d855d..0000000 Binary files a/iwdification/spl/cdibombb.spl and /dev/null differ diff --git a/iwdification/spl/cdid112.spl b/iwdification/spl/cdid112.spl deleted file mode 100644 index c969c38..0000000 Binary files a/iwdification/spl/cdid112.spl and /dev/null differ diff --git a/iwdification/spl/cdid114.spl b/iwdification/spl/cdid114.spl deleted file mode 100644 index c7ec157..0000000 Binary files a/iwdification/spl/cdid114.spl and /dev/null differ diff --git a/iwdification/spl/cdid115.spl b/iwdification/spl/cdid115.spl deleted file mode 100644 index 3ac8138..0000000 Binary files a/iwdification/spl/cdid115.spl and /dev/null differ diff --git a/iwdification/spl/cdid115d.spl b/iwdification/spl/cdid115d.spl deleted file mode 100644 index 94a2fc7..0000000 Binary files a/iwdification/spl/cdid115d.spl and /dev/null differ diff --git a/iwdification/spl/cdid217.spl b/iwdification/spl/cdid217.spl deleted file mode 100644 index ed17dc3..0000000 Binary files a/iwdification/spl/cdid217.spl and /dev/null differ diff --git a/iwdification/spl/cdid218.spl b/iwdification/spl/cdid218.spl deleted file mode 100644 index 1d4578a..0000000 Binary files a/iwdification/spl/cdid218.spl and /dev/null differ diff --git a/iwdification/spl/cdid219.spl b/iwdification/spl/cdid219.spl deleted file mode 100644 index b7eb995..0000000 Binary files a/iwdification/spl/cdid219.spl and /dev/null differ diff --git a/iwdification/spl/cdid220.spl b/iwdification/spl/cdid220.spl deleted file mode 100644 index 9b02883..0000000 Binary files a/iwdification/spl/cdid220.spl and /dev/null differ diff --git a/iwdification/spl/cdid316.spl b/iwdification/spl/cdid316.spl deleted file mode 100644 index 547e450..0000000 Binary files a/iwdification/spl/cdid316.spl and /dev/null differ diff --git a/iwdification/spl/cdid316b.spl b/iwdification/spl/cdid316b.spl deleted file mode 100644 index 826da21..0000000 Binary files a/iwdification/spl/cdid316b.spl and /dev/null differ diff --git a/iwdification/spl/cdid316g.spl b/iwdification/spl/cdid316g.spl deleted file mode 100644 index 3b174c8..0000000 Binary files a/iwdification/spl/cdid316g.spl and /dev/null differ diff --git a/iwdification/spl/cdid320.spl b/iwdification/spl/cdid320.spl deleted file mode 100644 index 3ccc33e..0000000 Binary files a/iwdification/spl/cdid320.spl and /dev/null differ diff --git a/iwdification/spl/cdid321.spl b/iwdification/spl/cdid321.spl deleted file mode 100644 index 2b0501c..0000000 Binary files a/iwdification/spl/cdid321.spl and /dev/null differ diff --git a/iwdification/spl/cdid322.spl b/iwdification/spl/cdid322.spl deleted file mode 100644 index 0acee87..0000000 Binary files a/iwdification/spl/cdid322.spl and /dev/null differ diff --git a/iwdification/spl/cdid323.spl b/iwdification/spl/cdid323.spl deleted file mode 100644 index dd29721..0000000 Binary files a/iwdification/spl/cdid323.spl and /dev/null differ diff --git a/iwdification/spl/cdid323d.spl b/iwdification/spl/cdid323d.spl deleted file mode 100644 index 8f5f426..0000000 Binary files a/iwdification/spl/cdid323d.spl and /dev/null differ diff --git a/iwdification/spl/cdid324.spl b/iwdification/spl/cdid324.spl deleted file mode 100644 index 186c4b3..0000000 Binary files a/iwdification/spl/cdid324.spl and /dev/null differ diff --git a/iwdification/spl/cdid325.spl b/iwdification/spl/cdid325.spl deleted file mode 100644 index 5da1744..0000000 Binary files a/iwdification/spl/cdid325.spl and /dev/null differ diff --git a/iwdification/spl/cdid326.spl b/iwdification/spl/cdid326.spl deleted file mode 100644 index 8614d66..0000000 Binary files a/iwdification/spl/cdid326.spl and /dev/null differ diff --git a/iwdification/spl/cdid327.spl b/iwdification/spl/cdid327.spl deleted file mode 100644 index 51b9771..0000000 Binary files a/iwdification/spl/cdid327.spl and /dev/null differ diff --git a/iwdification/spl/cdid330.spl b/iwdification/spl/cdid330.spl deleted file mode 100644 index e005561..0000000 Binary files a/iwdification/spl/cdid330.spl and /dev/null differ diff --git a/iwdification/spl/cdid331.spl b/iwdification/spl/cdid331.spl deleted file mode 100644 index 7d6a4ed..0000000 Binary files a/iwdification/spl/cdid331.spl and /dev/null differ diff --git a/iwdification/spl/cdid418.spl b/iwdification/spl/cdid418.spl deleted file mode 100644 index 8fda624..0000000 Binary files a/iwdification/spl/cdid418.spl and /dev/null differ diff --git a/iwdification/spl/cdid419.spl b/iwdification/spl/cdid419.spl deleted file mode 100644 index b4285eb..0000000 Binary files a/iwdification/spl/cdid419.spl and /dev/null differ diff --git a/iwdification/spl/cdid420.spl b/iwdification/spl/cdid420.spl deleted file mode 100644 index 47e573f..0000000 Binary files a/iwdification/spl/cdid420.spl and /dev/null differ diff --git a/iwdification/spl/cdid420b.spl b/iwdification/spl/cdid420b.spl deleted file mode 100644 index b596b58..0000000 Binary files a/iwdification/spl/cdid420b.spl and /dev/null differ diff --git a/iwdification/spl/cdid421.spl b/iwdification/spl/cdid421.spl deleted file mode 100644 index f8a939a..0000000 Binary files a/iwdification/spl/cdid421.spl and /dev/null differ diff --git a/iwdification/spl/cdid421b.spl b/iwdification/spl/cdid421b.spl deleted file mode 100644 index 2bbe9c7..0000000 Binary files a/iwdification/spl/cdid421b.spl and /dev/null differ diff --git a/iwdification/spl/cdid421g.spl b/iwdification/spl/cdid421g.spl deleted file mode 100644 index 5fa33ff..0000000 Binary files a/iwdification/spl/cdid421g.spl and /dev/null differ diff --git a/iwdification/spl/cdid422.spl b/iwdification/spl/cdid422.spl deleted file mode 100644 index 6bdb814..0000000 Binary files a/iwdification/spl/cdid422.spl and /dev/null differ diff --git a/iwdification/spl/cdid423.spl b/iwdification/spl/cdid423.spl deleted file mode 100644 index d2d7296..0000000 Binary files a/iwdification/spl/cdid423.spl and /dev/null differ diff --git a/iwdification/spl/cdid424.spl b/iwdification/spl/cdid424.spl deleted file mode 100644 index 13f4bcb..0000000 Binary files a/iwdification/spl/cdid424.spl and /dev/null differ diff --git a/iwdification/spl/cdid425.spl b/iwdification/spl/cdid425.spl deleted file mode 100644 index 54ff22c..0000000 Binary files a/iwdification/spl/cdid425.spl and /dev/null differ diff --git a/iwdification/spl/cdid426.spl b/iwdification/spl/cdid426.spl deleted file mode 100644 index 501ebcb..0000000 Binary files a/iwdification/spl/cdid426.spl and /dev/null differ diff --git a/iwdification/spl/cdid427.spl b/iwdification/spl/cdid427.spl deleted file mode 100644 index 252dd98..0000000 Binary files a/iwdification/spl/cdid427.spl and /dev/null differ diff --git a/iwdification/spl/cdid428.spl b/iwdification/spl/cdid428.spl deleted file mode 100644 index d8c5635..0000000 Binary files a/iwdification/spl/cdid428.spl and /dev/null differ diff --git a/iwdification/spl/cdid428a.spl b/iwdification/spl/cdid428a.spl deleted file mode 100644 index fc3e25b..0000000 Binary files a/iwdification/spl/cdid428a.spl and /dev/null differ diff --git a/iwdification/spl/cdid428b.spl b/iwdification/spl/cdid428b.spl deleted file mode 100644 index 8e8b93d..0000000 Binary files a/iwdification/spl/cdid428b.spl and /dev/null differ diff --git a/iwdification/spl/cdid518.spl b/iwdification/spl/cdid518.spl deleted file mode 100644 index 766e382..0000000 Binary files a/iwdification/spl/cdid518.spl and /dev/null differ diff --git a/iwdification/spl/cdid519.spl b/iwdification/spl/cdid519.spl deleted file mode 100644 index d19df0a..0000000 Binary files a/iwdification/spl/cdid519.spl and /dev/null differ diff --git a/iwdification/spl/cdid520.spl b/iwdification/spl/cdid520.spl deleted file mode 100644 index 772ff9d..0000000 Binary files a/iwdification/spl/cdid520.spl and /dev/null differ diff --git a/iwdification/spl/cdid521.spl b/iwdification/spl/cdid521.spl deleted file mode 100644 index c226d26..0000000 Binary files a/iwdification/spl/cdid521.spl and /dev/null differ diff --git a/iwdification/spl/cdid522.spl b/iwdification/spl/cdid522.spl deleted file mode 100644 index 887cac3..0000000 Binary files a/iwdification/spl/cdid522.spl and /dev/null differ diff --git a/iwdification/spl/cdid522b.spl b/iwdification/spl/cdid522b.spl deleted file mode 100644 index 33c955c..0000000 Binary files a/iwdification/spl/cdid522b.spl and /dev/null differ diff --git a/iwdification/spl/cdid523.spl b/iwdification/spl/cdid523.spl deleted file mode 100644 index d2a8e22..0000000 Binary files a/iwdification/spl/cdid523.spl and /dev/null differ diff --git a/iwdification/spl/cdid615.spl b/iwdification/spl/cdid615.spl deleted file mode 100644 index 0e8d8e1..0000000 Binary files a/iwdification/spl/cdid615.spl and /dev/null differ diff --git a/iwdification/spl/cdid617.spl b/iwdification/spl/cdid617.spl deleted file mode 100644 index 46dee85..0000000 Binary files a/iwdification/spl/cdid617.spl and /dev/null differ diff --git a/iwdification/spl/cdid618.spl b/iwdification/spl/cdid618.spl deleted file mode 100644 index b5794e1..0000000 Binary files a/iwdification/spl/cdid618.spl and /dev/null differ diff --git a/iwdification/spl/cdid714.spl b/iwdification/spl/cdid714.spl deleted file mode 100644 index b9ba8e2..0000000 Binary files a/iwdification/spl/cdid714.spl and /dev/null differ diff --git a/iwdification/spl/cdid716.spl b/iwdification/spl/cdid716.spl deleted file mode 100644 index e493578..0000000 Binary files a/iwdification/spl/cdid716.spl and /dev/null differ diff --git a/iwdification/spl/cdid733.spl b/iwdification/spl/cdid733.spl deleted file mode 100644 index 617f228..0000000 Binary files a/iwdification/spl/cdid733.spl and /dev/null differ diff --git a/iwdification/spl/cdid734.spl b/iwdification/spl/cdid734.spl deleted file mode 100644 index 68ae10a..0000000 Binary files a/iwdification/spl/cdid734.spl and /dev/null differ diff --git a/iwdification/spl/cdid735.spl b/iwdification/spl/cdid735.spl deleted file mode 100644 index 65c6a0b..0000000 Binary files a/iwdification/spl/cdid735.spl and /dev/null differ diff --git a/iwdification/spl/cdid736.spl b/iwdification/spl/cdid736.spl deleted file mode 100644 index 638bd65..0000000 Binary files a/iwdification/spl/cdid736.spl and /dev/null differ diff --git a/iwdification/spl/cdid737.spl b/iwdification/spl/cdid737.spl deleted file mode 100644 index 3c37f3a..0000000 Binary files a/iwdification/spl/cdid737.spl and /dev/null differ diff --git a/iwdification/spl/cdid739.spl b/iwdification/spl/cdid739.spl deleted file mode 100644 index 97c3787..0000000 Binary files a/iwdification/spl/cdid739.spl and /dev/null differ diff --git a/iwdification/spl/cdidree.spl b/iwdification/spl/cdidree.spl new file mode 100644 index 0000000..5f55ae6 Binary files /dev/null and b/iwdification/spl/cdidree.spl differ diff --git a/iwdification/spl/cdidrif.spl b/iwdification/spl/cdidrif.spl new file mode 100644 index 0000000..a6be100 Binary files /dev/null and b/iwdification/spl/cdidrif.spl differ diff --git a/iwdification/spl/cdievade.spl b/iwdification/spl/cdievade.spl new file mode 100644 index 0000000..99cdb18 Binary files /dev/null and b/iwdification/spl/cdievade.spl differ diff --git a/iwdification/spl/cdifire6.spl b/iwdification/spl/cdifire6.spl deleted file mode 100644 index 1164cde..0000000 Binary files a/iwdification/spl/cdifire6.spl and /dev/null differ diff --git a/iwdification/spl/cdifros6.spl b/iwdification/spl/cdifros6.spl deleted file mode 100644 index aff820e..0000000 Binary files a/iwdification/spl/cdifros6.spl and /dev/null differ diff --git a/iwdification/spl/cdiphase.spl b/iwdification/spl/cdiphase.spl deleted file mode 100644 index ac470f6..0000000 Binary files a/iwdification/spl/cdiphase.spl and /dev/null differ diff --git a/iwdification/spl/cdiplid.spl b/iwdification/spl/cdiplid.spl new file mode 100644 index 0000000..a86d94b Binary files /dev/null and b/iwdification/spl/cdiplid.spl differ diff --git a/iwdification/spl/cdiplif.spl b/iwdification/spl/cdiplif.spl new file mode 100644 index 0000000..7cbd35e Binary files /dev/null and b/iwdification/spl/cdiplif.spl differ diff --git a/iwdification/spl/cdiplse.spl b/iwdification/spl/cdiplse.spl new file mode 100644 index 0000000..7b82c81 Binary files /dev/null and b/iwdification/spl/cdiplse.spl differ diff --git a/iwdification/spl/cdirwf00.spl b/iwdification/spl/cdirwf00.spl deleted file mode 100644 index 101e87c..0000000 Binary files a/iwdification/spl/cdirwf00.spl and /dev/null differ diff --git a/iwdification/spl/cdirwf99.spl b/iwdification/spl/cdirwf99.spl deleted file mode 100644 index dd2de1b..0000000 Binary files a/iwdification/spl/cdirwf99.spl and /dev/null differ diff --git a/iwdification/spl/cdisalfi.spl b/iwdification/spl/cdisalfi.spl deleted file mode 100644 index 3c00d4b..0000000 Binary files a/iwdification/spl/cdisalfi.spl and /dev/null differ diff --git a/iwdification/spl/cdisalfr.spl b/iwdification/spl/cdisalfr.spl deleted file mode 100644 index 32c9a8d..0000000 Binary files a/iwdification/spl/cdisalfr.spl and /dev/null differ diff --git a/iwdification/spl/cdishdw1.spl b/iwdification/spl/cdishdw1.spl deleted file mode 100644 index 417f206..0000000 Binary files a/iwdification/spl/cdishdw1.spl and /dev/null differ diff --git a/iwdification/spl/cdishmbl.spl b/iwdification/spl/cdishmbl.spl deleted file mode 100644 index db814e0..0000000 Binary files a/iwdification/spl/cdishmbl.spl and /dev/null differ diff --git a/iwdification/spl/cditrdie.spl b/iwdification/spl/cditrdie.spl deleted file mode 100644 index 5ce1a85..0000000 Binary files a/iwdification/spl/cditrdie.spl and /dev/null differ diff --git a/iwdification/spl/cdiumbr1.spl b/iwdification/spl/cdiumbr1.spl deleted file mode 100644 index 21f4419..0000000 Binary files a/iwdification/spl/cdiumbr1.spl and /dev/null differ diff --git a/iwdification/spl/cdiumbr2.spl b/iwdification/spl/cdiumbr2.spl deleted file mode 100644 index de1de9b..0000000 Binary files a/iwdification/spl/cdiumbr2.spl and /dev/null differ diff --git a/iwdification/spl/spcl922.spl b/iwdification/spl/spcl922.spl new file mode 100644 index 0000000..c35cb24 Binary files /dev/null and b/iwdification/spl/spcl922.spl differ diff --git a/iwdification/ssl/libdata.txt b/iwdification/ssl/libdata.txt new file mode 100644 index 0000000..da2fd71 --- /dev/null +++ b/iwdification/ssl/libdata.txt @@ -0,0 +1,23 @@ +5 101 Charm ITEM_CHARM * +24 101 Panic ITEM_PANIC * +25 101 Poison ITEM_POISON * +38 101 Silence ITEM_SILENCE * +39 101 Sleep ITEM_SLEEP * +40 101 Slow ITEM_SLOW * +45 101 Stun ITEM_STUN * +55 101 Slay ITEM_SLAY * +109 101 Hold ITEM_HOLD * +128 101 ConfuseProof ITEM_CONFUSION * +134 101 Petrify ITEM_PETRIFY * +175 101 Hold ITEM_HOLD * +185 101 Hold ITEM_HOLD * +216 101 LevelDrain ITEM_LEVELDRAIN * +217 101 Sleep ITEM_SLEEP * +238 101 Disintegrate ITEM_DISINTEGRATE * +spwi112 206 MagicMissile ITEM_MM * +spwi813 206 Maze ITEM_MAZE * +spin774 206 PsiMaze ITEM_PSIMAZE ITEM_PSIONIC_SEEN +spin974 206 PsiBlast ITEM_PSIBLAST ITEM_PSIONIC_SEEN +spin910 206 PsiDom ITEM_PSIDOM ITEM_PSIONIC_SEEN +spin909 206 EgoWhip ITEM_EGOWHIP ITEM_PSIONIC_SEEN +spwi215 206 Antiweb ITEM_ANTIWEB * diff --git a/iwdification/ssl/library.slb b/iwdification/ssl/library.slb new file mode 100644 index 0000000..1746d0a --- /dev/null +++ b/iwdification/ssl/library.slb @@ -0,0 +1,596 @@ +TRIGGER=AttackedByPlayer + OR(14) + AttackedBy([GOODCUTOFF.0.0.0.0.SUMMONED],DEFAULT) + AttackedBy([PC],DEFAULT) + AttackedBy([FAMILIAR],DEFAULT) + AttackedBy([ALLY],DEFAULT) + AttackedBy([CONTROLLED],DEFAULT) + AttackedBy([CHARMED],DEFAULT) + SpellCastOnMe([GOODCUTOFF.0.0.0.0.SUMMONED],0) + SpellCastOnMe([GOODCUTOFF],WIZARD_BLINDNESS) + SpellCastOnMe([GOODCUTOFF],WIZARD_FEEBLEMIND) + SpellCastOnMe([GOODCUTOFF],WIZARD_CHARM_PERSON) + SpellCastOnMe([GOODCUTOFF],WIZARD_DIRE_CHARM) + SpellCastOnMe([GOODCUTOFF],CLERIC_CHARM_PERSON) + SpellCastOnMe([GOODCUTOFF],CLERIC_MENTAL_DOMINATION) + SpellCastOnMe([GOODCUTOFF],WIZARD_RAY_OF_ENFEEBLEMENT) +TRIGGER=PlayersInRange + OR(6) + Range(Player1,40) + Range(Player2,40) + Range(Player3,40) + Range(Player4,40) + Range(Player5,40) + Range(Player6,40) +TRIGGER=PlayersInShortRange + OR(6) + Range(Player1,20) + Range(Player2,20) + Range(Player3,20) + Range(Player4,20) + Range(Player5,20) + Range(Player6,20) +TRIGGER=Silence + True() +TRIGGER=SpellTurn + !CheckStatGT(scstarget,0,WIZARD_SPELL_DEFLECTION) + !CheckStatGT(scstarget,0,WIZARD_SPELL_TURNING) + !CheckStatGT(scstarget,0,WIZARD_SPELL_TRAP) + !CheckStat(scstarget,1,CLERIC_SHIELD_OF_THE_ARCHONS) +TRIGGER=SpellTurnNarrow + !CheckStatGT(scstarget,0,WIZARD_SPELL_TURNING) + !CheckStatGT(scstarget,0,WIZARD_SPELL_TRAP) + !CheckStat(scstarget,1,CLERIC_SHIELD_OF_THE_ARCHONS) +TRIGGER=BackstabSafe + !StateCheck(scstarget,STATE_MIRRORIMAGE) + !CheckStatGT(scstarget,0,STONESKINS) +TRIGGER=ArrowSafe + OR(2) + !CheckStat(scstarget,1,WIZARD_PROTECTION_FROM_NORMAL_MISSILES) + GlobalTimerNotExpired("DMWWseePNM","LOCALS") + OR(2) + !CheckStatGT(scstarget,0,CLERIC_PHYSICAL_MIRROR) + GlobalTimerNotExpired("DMWWseePNM","LOCALS") + OR(2) + !HasItemEquiped("shld24",scstarget) + GlobalTimerNotExpired("DMWWseePNM","LOCALS") +TRIGGER=ArrowSafeBG1 + OR(2) + !CheckStat(scstarget,1,WIZARD_PROTECTION_FROM_NORMAL_MISSILES) + GlobalTimerNotExpired("DMWWseePNM","LOCALS") +TRIGGER=Enemy + Allegiance(Myself,ENEMY) + !Allegiance(scstarget,ENEMY) +TRIGGER=Helpless + !StateCheck(scstarget,STATE_IMMOBILE) + !CheckStatGT(scstarget,0,HELD) +TRIGGER=Disabled + !StateCheck(scstarget,STATE_DISABLED) + !CheckStatGT(scstarget,0,HELD) +TRIGGER=Confused + !StateCheck(scstarget,STATE_CONFUSED) +TRIGGER=ConfuseProof + !CheckStatGT(scstarget,0,CLERIC_CHAOTIC_COMMANDS) + !CheckSpellState(scstarget,STATE_ENRAGED) + !General(scstarget,UNDEAD) +TRIGGER=Paralyse + !Kit(scstarget,UNDEADHUNTER) + !Kit(scstarget,INQUISITOR) + !CheckStatGT(scstarget,0,CLERIC_FREE_ACTION) + !General(scstarget,UNDEAD) +TRIGGER=FreeAction +TRIGGER=Poison + \* blank *\ +TRIGGER=Charm + !Kit(scstarget,CAVALIER) + !Kit(scstarget,INQUISITOR) + !Race(scstarget,ELF) + !CheckStatGT(scstarget,0,CLERIC_CHAOTIC_COMMANDS) + !General(scstarget,UNDEAD) + !CheckSpellState(scstarget,STATE_ENRAGED) +TRIGGER=Stun + !CheckStatGT(scstarget,0,CLERIC_CHAOTIC_COMMANDS) + !CheckSpellState(scstarget,STATE_ENRAGED) +TRIGGER=Slow + \* blank *\ +TRIGGER=Panic + !Kit(scstarget,CAVALIER) + !CheckStatGT(scstarget,0,WIZARD_RESIST_FEAR) + !General(scstarget,UNDEAD) + !CheckSpellState(scstarget,STATE_ENRAGED) +TRIGGER=Stoneskin + !CheckStatGT(scstarget,0,STONESKINS) +TRIGGER=Sleep + !Race(scstarget,ELF) + !CheckStatGT(scstarget,0,CLERIC_CHAOTIC_COMMANDS) + !CheckSpellState(scstarget,STATE_ENRAGED) +TRIGGER=MirrorImage + !StateCheck(scstarget,STATE_MIRRORIMAGE) +TRIGGER=ResistAcid + !CheckStatGT(scstarget,50,RESISTACID) +TRIGGER=ResistMagicDamage + !CheckStatGT(scstarget,30,MAGICDAMAGERESISTANCE) +TRIGGER=ResistMagicDamage100 + !CheckStatGT(scstarget,99,MAGICDAMAGERESISTANCE) +TRIGGER=ResistFire + !CheckStatGT(scstarget,50,RESISTFIRE) +TRIGGER=ResistCold + !CheckStatGT(scstarget,50,RESISTCOLD) +TRIGGER=ResistCold100 + !CheckStatGT(scstarget,99,RESISTCOLD) +TRIGGER=ResistElectric + !CheckStatGT(scstarget,50,RESISTELECTRICITY) +TRIGGER=ResistElectric65 + !CheckStatGT(scstarget,65,RESISTELECTRICITY) +TRIGGER=MR + !CheckStatGT(scstarget,50,RESISTMAGIC) +TRIGGER=MR100 + !CheckStatGT(scstarget,99,RESISTMAGIC) +TRIGGER=MRTouch + /* blank */ +TRIGGER=MR100Touch + /* blank */ +TRIGGER=Slay + !CheckSpellState(scstarget,DEATH_WARD) +TRIGGER=Disintegrate + !CheckSpellState(scstarget,DEATH_WARD) +TRIGGER=Hold + !Kit(scstarget,UNDEADHUNTER) + !Kit(scstarget,INQUISITOR) + !CheckStatGT(scstarget,0,CLERIC_FREE_ACTION) + !CheckSpellState(scstarget,STATE_ENRAGED) +TRIGGER=Petrify + !CheckStatGT(scstarget,0,WIZARD_PROTECTION_FROM_PETRIFICATION) +TRIGGER=Maze + !CheckStatGT(scstarget,0,CLERIC_CHAOTIC_COMMANDS) + !CheckSpellState(scstarget,STATE_ENRAGED) +TRIGGER=Elven + !Race(scstarget,ELF) +TRIGGER=MinorGlobe + !CheckStatGT(scstarget,0,MINORGLOBE) +TRIGGER=TruesightSafe + !CheckStatGT(Player1,0,TRUE_SIGHT) + !CheckStatGT(Player2,0,TRUE_SIGHT) + !CheckStatGT(Player3,0,TRUE_SIGHT) + !CheckStatGT(Player4,0,TRUE_SIGHT) + !CheckStatGT(Player5,0,TRUE_SIGHT) + !CheckStatGT(Player6,0,TRUE_SIGHT) + !CheckStatGT(NearestEnemyOf(Myself),0,TRUE_SIGHT) + !CheckStatGT(SecondNearestEnemyOf(Myself),0,TRUE_SIGHT) + !CheckStatGT(ThirdNearestEnemyOf(Myself),0,TRUE_SIGHT) +TRIGGER=MagicMissile + !CheckSpellState(scstarget,WIZARD_SHIELD) +TRIGGER=SlashingSafe + CheckStatLT(scstarget,75,RESISTSLASHING) +TRIGGER=PiercingSafe + CheckStatLT(scstarget,75,RESISTPIERCING) +TRIGGER=CrushingSafe + CheckStatLT(scstarget,75,RESISTCRUSHING) +TRIGGER=MissileSafe + CheckStatLT(scstarget,75,RESISTMISSILE) +TRIGGER=NullSafe + /* blank */ +TRIGGER=MultipleDamageTypeSafe + OR(3) + CheckStatLT(scstarget,75,RESISTCRUSHING) + CheckStatLT(scstarget,75,RESISTPIERCING) + CheckStatLT(scstarget,75,RESISTSLASHING) +TRIGGER=PsiBlast + True() +TRIGGER=PsiMaze + !CheckStatGT(scstarget,0,CLERIC_CHAOTIC_COMMANDS) + !CheckSpellState(Myself,STATE_ENRAGED) +TRIGGER=PsiDom + !Kit(scstarget,INQUISITOR) + !CheckStatGT(scstarget,0,CLERIC_CHAOTIC_COMMANDS) +TRIGGER=EgoWhip + !CheckStatGT(scstarget,0,CLERIC_CHAOTIC_COMMANDS) +TRIGGER=ProjectForce + /* blank */ +TRIGGER=L1safe + /* blank */ +TRIGGER=L2safe + /* blank */ +TRIGGER=LevelDrain + !Kit(scstarget,UNDEADHUNTER) + !CheckSpellState(scstarget,NEGATIVE_PLANE_PROTECTION) + !CheckSpellState(scstarget,STATE_ENRAGED) +TARGET=PlayersInRandomOrder + Player4 + Player5 + Player6 + Player3 + Player2 + Player1 +TARGET=PlayersInOrder + Player1 + Player2 + Player3 + Player4 + Player5 + Player6 +TARGET=EnemiesInReverseOrder + EighthNearestEnemyOf(Myself) + SeventhNearestEnemyOf(Myself) + SixthNearestEnemyOf(Myself) + FifthNearestEnemyOf(Myself) + FourthNearestEnemyOf(Myself) + ThirdNearestEnemyOf(Myself) + SecondNearestEnemyOf(Myself) + NearestEnemyOf(Myself) +TARGET=EnemiesInOrder + NearestEnemyOf(Myself) + SecondNearestEnemyOf(Myself) + ThirdNearestEnemyOf(Myself) + FourthNearestEnemyOf(Myself) + FifthNearestEnemyOf(Myself) + SixthNearestEnemyOf(Myself) + SeventhNearestEnemyOf(Myself) + EighthNearestEnemyOf(Myself) +TARGET=EnemiesInOrderShort + NearestEnemyOf(Myself) + SecondNearestEnemyOf(Myself) + ThirdNearestEnemyOf(Myself) +TARGET=DistantEnemies + FarthestEnemyOf(Myself) + SecondFarthestEnemyOf(Myself) + ThirdFarthestEnemyOf(Myself) + FourthFarthestEnemyOf(Myself) + FifthFarthestEnemyOf(Myself) + SixthFarthestEnemyOf(Myself) +TARGET=PCsInOrder + [PC] + SecondNearest([PC]) + ThirdNearest([PC]) + FourthNearest([PC]) + FifthNearest([PC]) + SixthNearest([PC]) +TARGET=PCsInOrderShort + [PC] + SecondNearest([PC]) + ThirdNearest([PC]) +TARGET=PCsInReverseOrder + SixthNearest([PC]) + FifthNearest([PC]) + FourthNearest([PC]) + ThirdNearest([PC]) + SecondNearest([PC]) + [PC] +TARGET=PCsPreferringStrong + [PC.0.0.FIGHTER] + [PC.0.0.RANGER] + [PC.0.0.PALADIN] + [PC.0.0.FIGHTER_THIEF] + [PC.0.0.BARD] + [PC.0.0.THIEF] + [PC] + SecondNearest([PC]) + ThirdNearest([PC]) +TARGET=PCsPreferringWeak + [PC.0.0.MAGE] + [PC.0.0.MAGE_THIEF] + [PC.0.0.MAGE_ALL] + [PC.0.0.THIEF] + [PC.0.0.BARD] + [PC.0.0.THIEF_ALL] + [PC.0.0.CLERIC] + [PC] + SecondNearest([PC]) + ThirdNearest([PC]) +TARGET=PCSpellcasters + [PC.0.0.MAGE_ALL] + [PC.0.0.CLERIC_ALL] + [PC.0.0.DRUID_ALL] + [PC.0.0.BARD] +TARGET=PCMages + [PC.0.0.MAGE_ALL] + SecondNearest([PC.0.0.MAGE_ALL]) + ThirdNearest([PC.0.0.MAGE_ALL]) + [PC.0.0.BARD] +TARGET=CloseEnemies + NearestEnemyOf(Myself) + SecondNearestEnemyOf(Myself) + ThirdNearestEnemyOf(Myself) +TARGET=LastAttacker + LastAttackerOf(Myself) +TARGET=NearestPC + [PC] +TARGET=NearestEnemy + NearestEnemyOf(Myself) +TARGET=Summons + [GOODCUTOFF.0.0.0.0.SUMMONED] + SecondNearest([GOODCUTOFF.0.0.0.0.SUMMONED]) + ThirdNearest([GOODCUTOFF.0.0.0.0.SUMMONED]) + FourthNearest([GOODCUTOFF.0.0.0.0.SUMMONED]) + FifthNearest([GOODCUTOFF.0.0.0.0.SUMMONED]) + SixthNearest([GOODCUTOFF.0.0.0.0.SUMMONED]) +TARGET=Beholders + [0.0.BEHOLDER] + SecondNearest([0.0.BEHOLDER]) + ThirdNearest([0.0.BEHOLDER]) + FourthNearest([0.0.BEHOLDER]) + FifthNearest([0.0.BEHOLDER]) +TARGET=VillainsInOrder + [ENEMY] + SecondNearest([ENEMY]) + ThirdNearest([ENEMY]) + FourthNearest([ENEMY]) + FifthNearest([ENEMY]) +TARGET=HumanoidVillains + [ENEMY.HUMANOID] + SecondNearest([ENEMY.HUMANOID]) + ThirdNearest([ENEMY.HUMANOID]) + FourthNearest([ENEMY.HUMANOID]) + FifthNearest([ENEMY.HUMANOID]) +TARGET=Celestials + [GOODCUTOFF.0.0.0.182] +TARGET=PCMages + [PC.0.0.MAGE_ALL] + SecondNearest([PC.0.0.MAGE_ALL]) + ThirdNearest([PC.0.0.MAGE_ALL]) + [PC.0.0.BARD] +TARGET=PCFighters + [PC.0.0.FIGHTER_ALL] + SecondNearest([PC.0.0.FIGHTER_ALL]) + [PC.0.0.PALADIN] + SecondNearest([PC.0.0.PALADIN]) + [PC.0.0.RANGER_ALL] + SecondNearest([PC.0.0.RANGER_ALL]) +TRIGGER=DirectDamageSafe + /* blank */ +TRIGGER=NotUndead + !General(Myself,UNDEAD) + !Class(Myself,SKELETON_WARRIOR) +TRIGGER=Imprisonment + !CheckSpellState(scstarget,STATE_ENRAGED) +TRIGGER=ProtectionFromMagicEnergy + CheckStatGT(scstarget,0,PROTECTION_FROM_MAGIC_ENERGY) +TRIGGER=PriorityBreach + CheckSpellState(scstarget,PRIORITY_BREACH) +TRIGGER=ResistMagicTarget + !CheckStatLT(scstarget,40,RESISTMAGIC) +TRIGGER=SpellProtectionTarget + CheckSpellState(scstarget,BUFF_PRO_SPELLS) +TRIGGER=SpellShieldTarget + CheckStatGT(scstarget,0,WIZARD_SPELL_SHIELD) +TRIGGER=AvoidDispel + !StateCheck(Player1,STATE_DISABLED) + !CheckStatGT(Player1,0,CLERIC_INSECT_PLAGUE) + !Allegiance(Player1,ENEMY) + !StateCheck(Player2,STATE_DISABLED) + !CheckStatGT(Player2,0,CLERIC_INSECT_PLAGUE) + !Allegiance(Player2,ENEMY) + !StateCheck(Player3,STATE_DISABLED) + !CheckStatGT(Player3,0,CLERIC_INSECT_PLAGUE) + !Allegiance(Player3,ENEMY) + !StateCheck(Player4,STATE_DISABLED) + !CheckStatGT(Player4,0,CLERIC_INSECT_PLAGUE) + !Allegiance(Player4,ENEMY) + !StateCheck(Player5,STATE_DISABLED) + !CheckStatGT(Player5,0,CLERIC_INSECT_PLAGUE) + !Allegiance(Player5,ENEMY) + !StateCheck(Player6,STATE_DISABLED) + !CheckStatGT(Player6,0,CLERIC_INSECT_PLAGUE) + !Allegiance(Player6,ENEMY) +TRIGGER=AvoidDispelIgnoreInsects + !StateCheck(Player1,STATE_DISABLED) + !Allegiance(Player1,ENEMY) + !StateCheck(Player2,STATE_DISABLED) + !Allegiance(Player2,ENEMY) + !StateCheck(Player3,STATE_DISABLED) + !Allegiance(Player3,ENEMY) + !StateCheck(Player4,STATE_DISABLED) + !Allegiance(Player4,ENEMY) + !StateCheck(Player5,STATE_DISABLED) + !Allegiance(Player5,ENEMY) + !StateCheck(Player6,STATE_DISABLED) + !Allegiance(Player6,ENEMY) +TRIGGER=AvoidDispellingMalison + !CheckStatGT(Player1,0,WIZARD_GREATER_MALISON) + !CheckStatGT(Player2,0,WIZARD_GREATER_MALISON) + !CheckStatGT(Player3,0,WIZARD_GREATER_MALISON) + !CheckStatGT(Player4,0,WIZARD_GREATER_MALISON) + !CheckStatGT(Player5,0,WIZARD_GREATER_MALISON) + !CheckStatGT(Player6,0,WIZARD_GREATER_MALISON) +TRIGGER=SpellTrap + CheckStat(scstarget,1,WIZARD_SPELL_TRAP) +TRIGGER=SpellImmunity + CheckStatGT(scstarget,0,WIZARD_SPELL_IMMUNITY) +TRIGGER=BreachTarget + OR(4) + CheckSpellState(scstarget,BUFF_PRO_WEAPONS) + CheckSpellState(scstarget,BUFF_PRO_DAMAGE) + CheckSpellState(scstarget,BUFF_ENHANCEMENT) + CheckSpellState(scstarget,BUFF_PRO_EFFECT) +TRIGGER=MalisonSafe + !CheckStatGT(Player1,0,WIZARD_GREATER_MALISON) + !CheckStatGT(Player2,0,WIZARD_GREATER_MALISON) + !CheckStatGT(Player3,0,WIZARD_GREATER_MALISON) + !CheckStatGT(Player4,0,WIZARD_GREATER_MALISON) + !CheckStatGT(Player5,0,WIZARD_GREATER_MALISON) + !CheckStatGT(Player6,0,WIZARD_GREATER_MALISON) +TRIGGER=ILackSpellTurning + !CheckStatGT(Myself,0,WIZARD_SPELL_TURNING) + !CheckStatGT(Myself,0,WIZARD_SPELL_TRAP) + !CheckStatGT(Myself,0,WIZARD_SPELL_DEFLECTION) +TRIGGER=ILackStoneskin + !CheckStatGT(Myself,0,STONESKINS) +TRIGGER=ILackImprovedHaste + !CheckStatGT(Myself,0,IMPROVEDHASTE) +TRIGGER=ILackRighteousMagic + !CheckStatGT(Myself,0,SCRIPTINGSTATE6) +TRIGGER=ILackHolyMight + !CheckStatGT(Myself,0,SCRIPTINGSTATE6) +TRIGGER=StoneskinFailing + !CheckStatGT(Myself,1,STONESKINS) +TRIGGER=ILackSpellProtection + !CheckStatGT(Myself,0,WIZARD_SPELL_TURNING) + !CheckStatGT(Myself,0,WIZARD_SPELL_TRAP) + !CheckStatGT(Myself,0,WIZARD_SPELL_DEFLECTION) +TRIGGER=ILackWeaponProtection + !CheckStatGT(Myself,0,PROTECTION_FROM_MAGIC_WEAPONS) +TRIGGER=ILackDefensiveHarmony + CheckStat(Myself,0,CLERIC_DEFENSIVE_HARMONY) +TRIGGER=NotMalisoned + !CheckStatGT(scstarget,0,WIZARD_GREATER_MALISON) +TRIGGER=LowerMRTarget + CheckStatGT(scstarget,39,RESISTMAGIC) +TRIGGER=ProtectionFromMagicScroll + CheckSpellState(scstarget,SCROLL_OF_PROTECTION_FROM_MAGIC) +TRIGGER=TruesightAlreadyCast + !CheckStatGT(FourthNearest([ENEMY]),0,TRUE_SIGHT) + !CheckStatGT(ThirdNearest([ENEMY]),0,TRUE_SIGHT) + !CheckStatGT(SecondNearest([ENEMY]),0,TRUE_SIGHT) + !CheckStatGT([ENEMY],0,TRUE_SIGHT) + !CheckStatGT(Myself,0,TRUE_SIGHT) +TRIGGER=IllusionTarget + OR(4) + StateCheck(scstarget,STATE_MIRRORIMAGE) + Gender(scstarget,ILLUSIONARY) + StateCheck(scstarget,STATE_IMPROVEDINVISIBILITY) + StateCheck(scstarget,STATE_INVISIBLE) +TRIGGER=SpellDeflectionBruteForce + !CheckStat(scstarget,0,WIZARD_SPELL_DEFLECTION) +TRIGGER=SpellTurningBruteForce + OR(2) + CheckStatGT(scstarget,0,WIZARD_SPELL_DEFLECTION) + CheckStatGT(scstarget,0,WIZARD_SPELL_TURNING) +TRIGGER=Domination + !CheckStatGT(scstarget,0,CLERIC_CHAOTIC_COMMANDS) + !CheckSpellState(scstarget,STATE_ENRAGED) +TRIGGER=ChaoticCommands + !CheckStatGT(scstarget,0,CLERIC_CHAOTIC_COMMANDS) +TRIGGER=DeathWard + CheckStat(scstarget,0,SCRIPTINGSTATE2) +TRIGGER=ILackBladeBarrier + !CheckStatGT(Myself,0,CLERIC_BLADE_BARRIER) +TRIGGER=ProtectionFromMagicWeapons + !CheckSpellState(scstarget,PROTECTION_FROM_MAGICAL_WEAPONS) +TRIGGER=BeholderNeedingHelp + OR(4) + StateCheck(scstarget,STATE_BLIND) + StateCheck(scstarget,STATE_CONFUSED) + StateCheck(scstarget,STATE_CHARMED) + CheckStatGT(scstarget,0,CLERIC_INSECT_PLAGUE) + Race(scstarget,BEHOLDER) +TRIGGER=Balduran + OR(2) + !GlobalTimerExpired("SeeBounce","LOCALS") + !HasItem("wa2shiel",scstarget) +TRIGGER=BeholderEyestalkDefences + OR(4) + CheckStatGT(scstarget,0,CLERIC_PHYSICAL_MIRROR) + CheckStatGT(scstarget,0,CLERIC_CHAOTIC_COMMANDS) + CheckStatGT(scstarget,0,WIZARD_PROTECTION_FROM_PETRIFICATION) + CheckStatGT(scstarget,0,SCRIPTINGSTATE2) +TRIGGER=BeholderAntimagicTarget + OR(8) + CheckStatGT(scstarget,0,STONESKINS) + CheckStatGT(scstarget,0,WIZARD_PROTECTION_FROM_MAGIC_WEAPONS) + StateCheck(scstarget,STATE_INVISIBLE) + StateCheck(scstarget,STATE_IMPROVEDINVISIBILITY) + StateCheck(scstarget,STATE_BLESS) + StateCheck(scstarget,STATE_CHANT) + StateCheck(scstarget,STATE_HASTED) + StateCheck(scstarget,STATE_MIRRORIMAGE) +TRIGGER=HiveMotherAntimagicTarget + OR(12) + CheckStatGT(scstarget,0,STONESKINS) + CheckStatGT(scstarget,0,WIZARD_PROTECTION_FROM_MAGIC_WEAPONS) + CheckStatGT(scstarget,0,MINORGLOBE) + StateCheck(scstarget,STATE_INVISIBLE) + StateCheck(scstarget,STATE_IMPROVEDINVISIBILITY) + StateCheck(scstarget,STATE_BLESS) + StateCheck(scstarget,STATE_CHANT) + StateCheck(scstarget,STATE_HASTED) + StateCheck(scstarget,STATE_MIRRORIMAGE) + CheckStatGT(scstarget,0,WIZARD_SPELL_TURNING) + CheckStatGT(scstarget,0,WIZARD_SPELL_DEFLECTION) + CheckStatGT(scstarget,0,WIZARD_SPELL_TRAP) +TRIGGER=Doomed + !CheckSpellState(Myself,DOOM) +TRIGGER=IAmNotRaging + !CheckSpellState(Myself,STATE_ENRAGED) +TRIGGER=ILackKai + !CheckSpellState(Myself,KENSAI_KIA) +TRIGGER=ILackGreaterWhirlwind + !CheckStat(Myself,5,SCRIPTINGSTATE4) +TRIGGER=ILackWhirlwind + !CheckStatGT(Myself,3,SCRIPTINGSTATE4) +TRIGGER=ILackSmite + !CheckStat(Myself,5,SCRIPTINGSTATE4) +TRIGGER=ILackPrecisionStrike + !CheckStat(Myself,3,SCRIPTINGSTATE4) + !CheckStat(Myself,5,SCRIPTINGSTATE4) +TRIGGER=ILackPowerAttack + !CheckStat(Myself,2,SCRIPTINGSTATE4) +TRIGGER=ILackAssassination + !CheckStat(Myself,4,SCRIPTINGSTATE4) +TRIGGER=ILackPoison + !CheckSpellState(Myself,POISON_WEAPON) +TRIGGER=ILackQuiveringPalm + !CheckStatGT(Myself,0,SCRIPTINGSTATE4) +TRIGGER=ILackFireShieldRed + !CheckSpellState(Myself,RED_FIRESHIELD) +TRIGGER=ILackShield + !CheckSpellState(Myself,WIZARD_SHIELD) +TRIGGER=ILackCalledShot + !CheckSpellState(Myself,ARCHER_CALL_SHOT) +TRIGGER=PoisonOrInvisible + OR(2) + StateCheck(Myself,STATE_INVISIBLE) + CheckSpellState(Myself,POISON_WEAPON) +TRIGGER=NoInsects + !CheckStatGT(scstarget,0,CLERIC_INSECT_PLAGUE) +TRIGGER=SpellProtectionTargetSpellThrust + CheckSpellState(scstarget,PRO_SPELLS_LEVEL_FIVE_MINUS) + !CheckStatGT(scstarget,0,MINORGLOBE) +TRIGGER=SpellProtectionTargetSecretWord + OR(2) + CheckSpellState(scstarget,PRO_SPELLS_LEVEL_FIVE_MINUS) + CheckSpellState(scstarget,PRO_SPELLS_LEVEL_SIX_SEVEN_EIGHT) +TRIGGER=SpellProtectionTargetPierceMagic + OR(3) + CheckStatGT(scstarget,0,WIZARD_SPELL_TURNING) + CheckStatGT(scstarget,0,WIZARD_SPELL_DEFLECTION) + CheckStatGT(scstarget,0,MINORGLOBE) +TRIGGER=Imprison + !CheckSpellState(scstarget,STATE_ENRAGED) +TRIGGER=AoEFireball + NextTriggerObject(scstarget) + Range(NearestAllyOf(Myself),15) + NextTriggerObject(scstarget) + OR(3) + !Range(NearestEnemyOfType([0.HUMANOID]),22) + CheckStatGT(NearestEnemyOfType([0.HUMANOID]),59,RESISTFIRE) + CheckStatGT(NearestEnemyOfType([0.HUMANOID]),0,MINORGLOBE) +TRIGGER=AoEFriendly + NextTriggerObject(scstarget) + Range(NearestAllyOf(Myself),15) +TRIGGER=AoEDisabled + !StateCheck(scstarget,STATE_DISABLED) + NextTriggerObject(scstarget) + Range(NearestAllyOf(Myself),15) + NextTriggerObject(scstarget) + OR(2) + !StateCheck(NearestAllyOf(Myself),STATE_DISABLED) + !StateCheck(SecondNearestAllyOf(Myself),STATE_DISABLED) + NextTriggerObject(scstarget) + OR(2) + !StateCheck(NearestAllyOf(Myself),STATE_DISABLED) + Range(SecondNearestAllyOf(Myself),15) +TRIGGER=AoEHelpless + !StateCheck(scstarget,STATE_HELPLESS) + NextTriggerObject(scstarget) + Range(NearestAllyOf(Myself),15) + NextTriggerObject(scstarget) + OR(2) + !StateCheck(NearestAllyOf(Myself),STATE_HELPLESS) + !StateCheck(SecondNearestAllyOf(Myself),STATE_HELPLESS) + NextTriggerObject(scstarget) + OR(2) + !StateCheck(NearestAllyOf(Myself),STATE_HELPLESS) + Range(SecondNearestAllyOf(Myself),15) + + + diff --git a/iwdification/ssl/ssl.exe b/iwdification/ssl/ssl.exe new file mode 100644 index 0000000..501d99b Binary files /dev/null and b/iwdification/ssl/ssl.exe differ diff --git a/iwdification/ssl/ssl.pl b/iwdification/ssl/ssl.pl new file mode 100644 index 0000000..01cacba --- /dev/null +++ b/iwdification/ssl/ssl.pl @@ -0,0 +1,1215 @@ +#!/usr/bin/perl + +my $scsline=""; +# my $defaultlibraryfile="scsii/ssl/library.slb"; +# my $autolibfile="scsii/ssl/autolib.slb"; +# my $sslfiles="sslfiles.txt"; +my $outputroot="ssl_out"; +my $outputoverride="no"; +my $location="none"; +my @scsarray=(); +my @trigger=(); +my @action=(); +my @output=(); +my $inloop="No"; +my $combine=""; + +my @target=(); +my @targetcondition=(); + +my %targethash=(); +my %targetlist=(); + +my %triggerhash=(); +my %triggerlist=(); + +my @defaulttrigger=(); + + +my @filelist=(); +##################################################### +sub process_user_input { + +# The format is: +# +# perl ssl.pl " -o -l " +# +# library.slb and autolib.slb are always checked in the working directory +# unless they don't exist +# +# input files can be given without suffix; if they are, we append .ssl . Ditto if library files are +# given without .slb +# +# if output directory is blank, output to input directory/ssl_out +# +# The variable list has form IsVampire=True&IsLich=False . Each occurrence of the entry before the = sign is replaced +# by the respective entry after the = sign + + @instructions=split(' ',$userinput); + %varhash=(); + $libfiles=0; + $booleans=0; + $aretherefiles=0; + $suffix=".ssl"; + foreach $1 (@instructions) { + chomp $1; + if ($1 eq "-l") { + $suffix=".slb"; + $libfiles=1; + $outputloc=0; + $booleans=0; + } + elsif ($1 eq "-o") { + $outputloc=1; + $libfiles=0; + $booleans=0; + } + elsif ($1 eq "-b") { + $outputloc=0; + $libfiles=0; + $booleans=1; + } + elsif ($1=~m/=/ eq "1") { + $therearevars="Yes"; + @vararraytemp=split('&',$1); + foreach $2 (@vararraytemp) { + @vararraytemp2=split('=',$2); + $varhash{$vararraytemp2[0]}=$vararraytemp2[1]; + } + } + elsif ($outputloc eq 1) { + $outputroot=$1; + $outputoverride="yes"; + } + elsif ($booleans eq 1) { + push @booleanlist,$1; + } + else { + $dotcheck=substr $1,-4,1; + if (length $1<4 or $dotcheck ne ".") { + $1=join('',$1,$suffix); + } + if ($libfiles eq 0 & $booleans eq 0) { + push @filelist,$1; + $aretherefiles=1; + } + else { + push @librarylist,$1; + } + } + + } + + if ($aretherefiles eq "0") { + get_files() + } + + +} + + +##################################################### +sub get_files { + unless (open (infile, lc $sslfiles)) { + die "FATAL ERROR (no input files have been specified and SSL cannot find file list)"; + } + @temparray=; + close(infile); + foreach $1 (@temparray) { + chomp $1; + $dotcheck=substr $1,-4,1; + if (length $1<4 or $dotcheck ne ".") { + $1=join('',$1,".ssl"); + } + push @filelist,$1; + } +} + +##################################################### +sub read_library { + +# push @librarylist, $defaultlibraryfile,$autolibfile; + +foreach $1 (@librarylist) { + $libraryfile=$1; + $libraryfile=~s/\\/\//g; + unless (open (infile, lc $libraryfile)) { + if ($libraryfile eq $defaultlibraryfile) { + print "NOTE: Cannot find the default library file\n" + } + elsif ($libraryfile eq $autolibfile) { + print "NOTE: Cannot find the auto-generated library file\n" + } + else { + die "FATAL ERROR (Cannot find library file $libraryfile)"; + } + } + @library=; + close(infile); + foreach $1 (@library) { + chomp $1; + $scsline=$1; + strip_spaces(); + $checktarget=substr $1,0,6; + $checktrigger=substr $1,0,7; + $checktargetreplace=substr $1,0,14; + $checktriggerreplace=substr $1,0,15; + if ($checktargetreplace eq 'TARGET_REPLACE') { + $keyname=substr $scsline,15; + $targetlist{$keyname}=1; + $libtype="target"; + @{ $targethash{$keyname} } = (); + } + elsif ($checktriggerreplace eq 'TRIGGER_REPLACE') { + $keyname=substr $scsline,16; + $triggerlist{$keyname}=1; + $libtype="trigger"; + @{ $triggerhash{$keyname} } = (); + } + elsif ($checktarget eq 'TARGET') { + $keyname=substr $scsline,7; + $targetlist{$keyname}=1; + $libtype="target"; + } + elsif ($checktrigger eq 'TRIGGER') { + $keyname=substr $scsline,8; + $triggerlist{$keyname}=1; + $libtype="trigger"; + } + elsif ($libtype eq "target") { + push @{ $targethash{$keyname} },$scsline; + } + elsif ($libtype eq "trigger") { + push @{ $triggerhash{$keyname} },$scsline; + } + } +} +} +############################################################ +sub read_input { + unless (open (infile, lc $inputfile)) { + die "cannot find input file"; + } + @scsarray=; + foreach (@scsarray) { + chomp; + } + close (infile); +} +################################################################ +sub work_out_outputfile { + + substr $outputfile,-4,4,".baf"; + if ($outputroot ne "") { + #$outputroot="ssl_out"; + if ($outputfile=~m/\\/ eq "1") { ### delimited by \ + @outputarray=split(/\\/,$outputfile); + } + elsif ($outputfile=~m/\// eq "1") { ### delimited by / + @outputarray=split(/\//,$outputfile); + } + if ($outputfile=~m/\\/ eq "1" or $outputfile=~m/\// eq "1") { + $outputarraylength=scalar @outputarray; + $outputres=$outputarray[$outputarraylength-1]; + $outputarray[$outputarraylength-1]=$outputroot; + if ($outputoverride eq "no") { + $outputdir=join("\/",@outputarray); + } + else { + $outputdir=$outputroot; + } + $outputfile=join("\/",$outputdir,$outputres); + if (-e $outputdir ne "1") { + print "$outputdir \n"; + system "mkdir $outputdir"; + } + } + } + + +} +############################################################ +sub write_output { + + + unless (open(outfile, ">$outputfile")) { + die "FATAL ERROR: SSL cannot open the output file $outputfile"; + } + foreach $1 (@output) { + print outfile "$1\n"; + } + close(outfile); +} + +############################################################ + +sub strip_spaces { + @temparray=split ("//",$scsline); + $scsline=$temparray[0]; + @temparray=split(' ',$scsline); + $scsline=join(' ',@temparray); +} + + +############################################################## + +sub extract_from_brackets { + + $firstbracket=1+index $scsline,"("; + $lastbracket=rindex $scsline,")"; + $size=$lastbracket-$firstbracket; + $scsline=substr $scsline, $firstbracket,$size; + +} + +############################################################## + +sub check_ssl_booleans { + + $abort_print=0; + @temp=(); + foreach $b_line (@output_trial) { + if ($b_line=~m/SSLBoolean/ eq "1") { + $abort_print = 1; + $f_b=1 + index $b_line,"("; + $l_b=rindex $b_line,")"; + $sz=$l_b-$f_b; + $b_line = substr $b_line, $f_b, $sz; + @bool_list=split('\|',$b_line); + foreach $var (@bool_list) { + foreach $possible (@booleanlist) { + if ($var eq $possible) { + $abort_print=0; + } + } + } + } + else { + push @temp,$b_line; + } + } + @output_trial = @temp; +} + +############################################################### + +sub extract_targets { + + $arg1=@_[0]; + + @targetsubarray=(); + @temparray=split('\*',$arg1); + @targetexclude=split('&',$temparray[1]); + @targetconsider=split('&',$temparray[0]); + foreach $8 (@targetconsider) { + $label=0; + if ($targethash{$8}[0] eq "") { + die "Unrecognised TargetBlock ($8) near line $linenum"; + } + while ($targethash{$8}[$label] ne "") { + $inexclude=0; + foreach $7 (@targetexclude) { + if ($7 eq $targethash{$8}[$label]) { + $inexclude=1; + } + } + if ($inexclude eq 0) { + push @targetsubarray,$targethash{$8}[$label]; + } + $label=$label+1; + } + } +} + +############################################################### + +sub process_line { + if ($location eq "none") { + if ($scsline=~m/DEFAULT TRIGGER/ eq "1") { + extract_from_brackets(); + if ($scsline eq "") { + @defaulttrigger=() + } + else { + @defaulttrigger=split('&',$scsline) + } + } + elsif ($scsline eq "BEGIN_ACTION_DEFINITION") { + $location="actiondefinename"; + } + elsif ($scsline eq "IF TRIGGER") { + @trigger=(); + @target=(); + @targetcondition=(); + $triggerindex="0"; + $inloop="No"; + @looplist=(); + $location="trigger"; + $combine=""; + $combinetype=""; + $ignorethisblock="No"; + } + elsif ($scsline eq "IF") { + $location="bafblock"; + $baflocation="triggers"; + @bafactionarray=(); + $ignorethisblock="No"; + @bafblock=(); + push @bafblock,$scsline; + } + elsif ($scsline eq "END") { + die "Unexpected END [1] at line $linenum"; + } + elsif ($scsline eq "THEN DO") { + die "1: Unexpected THEN DO at line $linenum"; + } + elsif ($scsline=~m/VARIABLE/ eq "1") { + } + elsif ($scsline ne "") { + push @output, $scsline; + } + return; + } + elsif ($location eq "actiondefinename") { + + if ($scsline=~m/Name/ eq "1") { + extract_from_brackets(); + $definename=$scsline; + $definenamehash{$definename}=1; + @{ $defineaction{$definename}}=(); + @{ $definetrigger{$definename}}=(); + } + elsif ($scsline=~m/RANDOMIZE/ eq "1") { + extract_from_brackets(); + $randomaction{$definename}=$scsline; + } + elsif ($scsline eq "TRIGGER") { + $location="actiondefinetrigger"; + } + else { + die "Syntax error in action_define block near line $linenum"; + } + } + elsif ($location eq "actiondefinetrigger") { + strip_spaces(); + if ($scsline eq "ACTION") { + $location="actiondefineaction"; + } + elsif ($scsline eq "") { + } + else { + push @{ $definetrigger{$definename} },$scsline; + } + } + elsif ($location eq "actiondefineaction") { + strip_spaces(); + if ($scsline eq "END") { + $location="none"; + } + elsif ($scsline eq "") { + } + else { + push @{ $defineaction{$definename} },$scsline; + } + } + + + elsif ($location eq "trigger") { + if ($scsline=~m/ConditionalTargetBlock/ eq "1") { + extract_from_brackets(); + @condarray=split(';',$scsline); + extract_targets($condarray[0]); + push @target,@targetsubarray; + foreach $x (@targetsubarray) { + push @targetcondition,$condarray[1]; + } + } + elsif ($scsline=~m/TargetBlock/ eq "1") { + extract_from_brackets(); + extract_targets($scsline); + push @target,@targetsubarray; + foreach $x (@targetsubarray) { + push @targetcondition,"None"; + } + } + elsif ($scsline=~m/Target\(/ eq "1") { + extract_from_brackets(); + @temparray=split('&',$scsline); + push @target,@temparray; + } + elsif ($scsline=~m/TriggerBlock/ eq "1") { + extract_from_brackets(); + @triggerlist=split('\|',$scsline); + foreach $2 (@triggerlist) { + $label=0; + $triggerdefined="No"; + while($triggerhash{$2}[$label] ne "") { + push @trigger,$triggerhash{$2}[$label]; + $label=$label+1; + $triggerdefined="Yes"; + } + if ($triggerdefined eq "No") { + die "Unrecognised TriggerBlock: $2, near line $linenum"; + } + } + } + elsif ($scsline=~m/Multiple/ eq "1") { + extract_from_brackets; + @temparray=split(';',$scsline); + @multiplearray=split('&',$temparray[0]); + extract_targets($temparray[1]); + foreach $8 (@targetsubarray) { + foreach $9 (@multiplearray) { + $temp=$9; + $temp=~s/scsmultiple/$8/g; + push @trigger,$temp; + } + } + + } + elsif ($scsline=~m/IgnoreBlock/ eq "1") { + extract_from_brackets; + @temparray=split('\|',$scsline); + foreach $8 (@temparray) { + if ($8 eq "True") { + $ignorethisblock="Yes"; + } + } + + } + elsif ($scsline=~m/RequireBlock/ eq "1") { + extract_from_brackets; + @temparray=split('\|',$scsline); + $requirecheck="No"; + foreach $8 (@temparray) { + if ($8 eq "True") { + $requirecheck="Yes"; + } + } + if ($requirecheck eq "No") { + $ignorethisblock="Yes"; + } + + } + elsif ($scsline=~m/THEN DO/ eq "1") { + $location="action"; + $combine="No"; + @action=(); + @alwaysaction=(); + @continueaction=(); + } + elsif ($scsline eq "IF") { + die "Unexpected IF at line $linenum"; + } + elsif ($scsline eq "IF TRIGGER") { + die "Unexpected IF TRIGGER at line $linenum"; + } + elsif ($scsline eq "THEN") { + die "2: Unexpected THEN DO at line $linenum"; + } + elsif ($scsline eq "END") { + die "Unexpected END [2] at line $linenum"; + } + else { + push @trigger, $scsline; + } + return; + } + + elsif ($location eq "action") { + strip_spaces(); + if ($scsline=~m/ActionCondition\(/ eq "1") { + extract_from_brackets(); + push @action, $scsline; + } + elsif ($scsline=~m/Action\(/ eq "1") { + extract_from_brackets; + push @action, $scsline; + } + elsif ($scsline=~m/Combine\(/ eq "1") { + $combine="Yes"; + extract_from_brackets; + $combinetype=$scsline; + } + elsif ($scsline=~m/OnContinue\(/ eq "1") { + extract_from_brackets; + push @continueaction, $scsline; + } + elsif ($scsline eq "END") { + $location="none"; + process_block(); + } + elsif ($scsline eq "IF") { + die "Unexpected IF at line $linenum"; + } + elsif ($scsline eq "IF TRIGGER") { + die "Unexpected IF TRIGGER at line $linenum"; + } + elsif ($scsline eq "THEN") { + die "Unexpected THEN at line $linenum"; + } + elsif ($scsline eq "THEN DO") { + die "3: Unexpected THEN DO at line $linenum"; + } + else { + push @alwaysaction, $scsline; + } + return; + } + elsif ($location="bafblock") { + strip_spaces(); + if ($scsline eq "END") { + $location="none"; + if ($ignorethisresponse eq "No") { + push @bafblock,@bafactionarray; + } + push @bafblock,$scsline; + + if ($ignorethisblock eq "No") { + push @output, @bafblock; + push @output, ""; + } + } + elsif ($scsline=~m/RESPONSE/ eq "1") { + $baflocation="responses"; + if ($ignorethisresponse eq "No") { + push @bafblock,@bafactionarray; + } + @bafactionarray=(); + push @bafactionarray,$scsline; + $ignorethisresponse = "No"; + + } + elsif ($scsline=~m/IgnoreBlock/ eq "1") { + extract_from_brackets; + @temparray=split('\|',$scsline); + foreach $8 (@temparray) { + if ($8 eq "True") { + if ($baflocation eq "responses") { + $ignorethisresponse="Yes"; + } else { + $ignorethisblock="Yes"; + } + } + } + + } + elsif ($scsline=~m/RequireBlock/ eq "1") { + extract_from_brackets; + @temparray=split('\|',$scsline); + $requirecheck="No"; + foreach $8 (@temparray) { + if ($8 eq "True") { + $requirecheck="Yes"; + } + } + if ($requirecheck eq "No") { + if ($baflocation eq "responses") { + $ignorethisresponse="Yes"; + } else { + $ignorethisblock="Yes"; + } + } + + } + else { + if ($baflocation eq "responses") { + push @bafactionarray,$scsline; + } else { + push @bafblock,$scsline; + } + } + return; + } +} + +############################################################################## +sub streamline_trigger { + + my %sthash=(); + my @starray=(); + foreach $st (@trigger) { + if ($ornumber>0) { + $ornumber=$ornumber-1; + push @starray,$st; + } + elsif ($st=~m/OR\(/ eq "1") { + $firstbracket=1+index $st,"("; + $lastbracket=rindex $st,")"; + $size=$lastbracket-$firstbracket; + $ornumber=substr $st, $firstbracket,$size; + push @starray,$st; + } + elsif ($sthash{$st} ne "Yes") { + push @starray,$st; + $sthash{$st}="Yes"; + } + + } + + @trigger=@starray; + +} + +############################################################################## +sub get_combine_top { + %combinehash=(); + $firsttimethrough="Yes"; + foreach $forcombine (@action) { + @temp=split('\|',$forcombine); + @actionargs=split(',',$temp[0]); + if ($definenamehash{$actionargs[0]} eq "1") { + @temptriggertop=@{ $definetrigger{$actionargs[0]} }; + $statelabel=0; + foreach $replace (@actionargs) { + $replacelabel=join ('',"scsargument",$statelabel); + $triggerlabel=0; + foreach (@temptriggertop) { + $temptriggertop[$triggerlabel]=~s/$replacelabel/$actionargs[$statelabel]/g; + $triggerlabel=$triggerlabel+1; + } + $statelabel=$statelabel+1; + } + } + elsif ($actionargs[0] eq "Literal") { + @temptriggertop=(); + if ($actionargs[2] ne "") { + @temparray=split('&',$actionargs[2]); + foreach $11 (@temparray) { + $temp=$11; + $temp=~s/\\/,/g; + push @temptriggertop,$temp; + } + } + } + elsif ($actionargs[0] eq "LiteralRandomTarget" or $actionargs[0] eq "SpellReplaceRandom") { + die "Error near line $linenum: $actionargs[0] is not valid at present in Combine() "; + } + else { + die "Error near line $linenum: $actionargs[0] is not a recognised action type"; + } + + %temphash=(); + foreach $forcombine2 (@temptriggertop) { + $temphash{$forcombine2}="1"; + } + if ($firsttimethrough eq "Yes") { + %combinehash=%temphash; + @combinearray=@temptriggertop; + $firsttimethrough="No"; + } + else { + @keys=keys %combinehash; + foreach $forcombine2 (@keys) { + if ($temphash{$forcombine2} eq "1") { + $combinehash{$forcombine2}=1; + } + else { + $combinehash{$forcombine2}=0; + } + } + } + } +} +########################################################################### +sub process_block { + + if ($ignorethisblock eq "Yes") { + return; + } + + streamline_trigger(); + if ($combine eq "Yes") { + get_combine_top(); + @triggertop=(); + foreach $processlabel (@combinearray) { + if ($combinehash{$processlabel} eq "1") { + push @triggertop,$processlabel; + } + } + @actiontop="RESPONSE #100\n Continue()"; + @target=reverse @target; + @targetcondition=reverse @targetcondition; + $condition=""; + block_print(); + $combine ="No"; + @target=('LastSeenBy(Myself)'); + push @trigger, "See(LastSeenBy(Myself))"; + @targetcondition=(); + } + if (scalar @action eq 0) { + push @action,"Literal"; + } + foreach $2 (@action) { + @actionsplit=(); + @actionsplit=split('\|',$2); + if ($actionsplit[1] ne "") { + $prob1=$actionsplit[1]; + $prob2=$actionsplit[2]; + } + else { + $prob1=100; + $prob2=0; + } + @actionsplit=split(';',$actionsplit[0]); + if ($actionsplit[1] ne "") { + @temparray=split('&',@actionsplit[1]); + $condition=join("\n",@temparray); + } + else { + $condition=""; + } + @actionargs=split (',',$actionsplit[0]); + make_action(); + + if ($abort_print eq "0") { + block_print(); + } + } +} +############################################################################ +sub make_action { + + @triggertop=(); + @actiontop=(); + @randomreplace=(); + $abort_print=0; + + if ($definenamehash{$actionargs[0]} eq "1") { + @triggertop=@{ $definetrigger{$actionargs[0]} }; + check_ssl_booleans(); + @actiontop=@{ $defineaction{$actionargs[0]} }; + check_ssl_booleans(); + $statelabel=0; + if ($randomaction{$actionargs[0]} ne "") { + $replacelabel=join ('',"scsargument",$randomaction{$actionargs[0]}); + @randomreplace=@actionargs; + splice (@randomreplace,0,$randomaction{$actionargs[0]}-1); + @tempactiontop=@actiontop; + @actiontop=(); + $actionlabel=0; + foreach $replace (@randomreplace) { + foreach $tempstring (@tempactiontop) { + $actiontop[$actionlabel]=$tempstring; + $actiontop[$actionlabel]=~s/$replacelabel/$replace/g; + $actionlabel=$actionlabel+1; + } + } + } + foreach $replace (@actionargs) { + $replacelabel=join ('',"scsargument",$statelabel); + $triggerlabel=0; + foreach (@triggertop) { + $triggertop[$triggerlabel]=~s/$replacelabel/$actionargs[$statelabel]/g; + $triggerlabel=$triggerlabel+1; + } + $actionlabel=0; + foreach (@actiontop) { + $actiontop[$actionlabel]=~s/$replacelabel/$actionargs[$statelabel]/g; + $actionlabel=$actionlabel+1; + } + $statelabel=$statelabel+1; + } + $replacelabel="scsprob1"; + $actionlabel=0; + foreach (@actiontop) { + $actiontop[$actionlabel]=~s/$replacelabel/$prob1/g; + $actionlabel=$actionlabel+1; + } + push @actiontop, @alwaysaction; + } + + elsif ($actionargs[0] eq "SpellReplaceRandom") { + $triggertop[0]="!GlobalTimerNotExpired(\"castspell\",\"LOCALS\")"; + $triggertop[1]="HaveSpell($actionargs[1])"; + $label="2"; + $labelB="0"; + while($actionargs[$label] ne "") { + $actiontop[$labelB]="RESPONSE #$prob1"; + $labelB=$labelB+1; + $actiontop[$labelB]="SetGlobalTimer(\"castspell\",\"LOCALS\",6)"; + $labelB=$labelB+1; + $actiontop[$labelB]="RemoveSpell($actionargs[1])"; + $labelB=$labelB+1; + $actiontop[$labelB]="SpellNoDec(scstarget,$actionargs[$label])"; + push @actiontop, @alwaysaction; + $labelB=#$actiontop; + $labelB=$labelB+1; + $label=$label+1; + } + } + + elsif ($actionargs[0] eq "Literal") { + $actiontop[0]="RESPONSE #$prob1"; + @temparray=split('&',$actionargs[1]); + foreach $11 (@temparray) { + $temp=$11; + $temp=~s/\\/,/g; + push @actiontop,$temp; + } + push @actiontop, @alwaysaction; + if ($actionargs[2] ne "") { + @temparray=split('&',$actionargs[2]); + foreach $11 (@temparray) { + $temp=$11; + $temp=~s/\\/,/g; + push @triggertop,$temp; + } + } + } + elsif ($actionargs[0] eq "LiteralRandomTarget") { + @literalactionarray=(); + @temparray=split('&',$actionargs[1]); + foreach $11 (@temparray) { + $temp=$11; + $temp=~s/\\/,/g; + push @literalactionarray,$temp; + } + if ($actionargs[2] ne "") { + @temparray=split('&',$actionargs[2]); + } + else { + @temparray=(); + } + foreach $11 (@temparray) { + $temp=$11; + $temp=~s/\\/,/g; + push @literalconditionarray,$temp; + } + + $label=0; + extract_targets($actionargs[3]); + foreach $8 (@targetsubarray) { + push @actiontop,"RESPONSE #$prob1"; + foreach $9 (@literalactionarray) { + $temp=$9; + $temp=~s/scsrandom/$8/g; + push @actiontop,$temp; + } + push @actiontop,@alwaysaction; + + } + push @triggertop,@literalconditionarray; + } + + else { + die "unrecognised Action : $actionargs[0], near line $linenum"; + } + if ($prob2 ne "0") { + push @actiontop, "RESPONSE #$prob2"; + push @actiontop, @continueaction; + push @actiontop, "Continue()"; + } +} + +########################################################################################### +sub sub_target { + + $arg1=@_[0]; + $arg2=@_[1]; + $arg1=~s/scstarget/$arg2/g; + return $arg1; +} +########################################################################################### +sub block_print { + + if (@target[0] eq "") { + push @target, "NODEFINEDTARGET"; + } + $conditioncounter=0; + foreach $3 (@target) { + @output_trial=(); + push @output_trial, "IF"; + push @output_trial, @defaulttrigger; + foreach $4 (@triggertop) { + push @output_trial, sub_target($4,$3); + } + if ($combine ne "Yes" and $3 ne "LastSeenBy(Myself)" and $3 ne "NODEFINEDTARGET") { + push @output_trial, "See($3)"; + } + if ($condition ne "") { + push @output_trial, sub_target($condition,$3); + } + foreach $4 (@trigger) { + push @output_trial, sub_target($4,$3); + } + if ($targetcondition[$conditioncounter] ne "None" and $targetcondition[$conditioncounter] ne "") { + @condarray=split('&',$targetcondition[$conditioncounter]); + foreach $4 (@condarray) { + push @output_trial, sub_target($4,$3); + } + } + if ($combine eq "Yes") { + push @output_trial, "See($3)"; + push @output_trial, "False()"; + } + push @output_trial, "THEN"; + foreach $4 (@actiontop) { + push @output_trial, sub_target($4,$3); + } + push @output_trial, "END"; + push @output_trial, ""; + $conditioncounter=$conditioncounter+1; + check_ssl_booleans; + if ($abort_print eq "0") { + push @output,@output_trial; + } + + } +} + +#################################################################### + +sub process_include_blocks { + + $linenum=0; + while ($linenum < scalar @scsarray) { + $scsline=$scsarray[$linenum]; + strip_spaces(); + if ($scsline=~m/INCLUDE FILE/ eq "1") { + if ($therearevars=="Yes") { + foreach $1 (keys %varhash) { + $old=$1; + $new=$varhash{$old}; + $scsline=~s/$old/$new/; + } + } + + extract_from_brackets; + $scsline=~s/\\/\//g; + unless (open (infile, lc $scsline)) { + die "FATAL ERROR (SSL cannot find file requested [$scsline] at line $linenum)"; + } + @temparray=; + close(infile); + splice(@scsarray,$linenum,1,@temparray); + } + else { + $linenum=$linenum+1; + } + + } +} + +################################################################### + + + +sub work_out_outer_loops { + + $linenum=0; + $loopdepth=0; + while ($linenum < scalar @scsarray) { + $scsline=$scsarray[$linenum]; + if ($therearevars=="Yes") { + foreach $1 (keys %varhash) { + $old=$1; + $new=$varhash{$old}; + $scsline=~s/$old/$new/; + $scsarray[$linenum]=$scsline; + } + } + if ($scsline=~m/BEGIN OUTER LOOP/ eq "1" and $loopdepth eq 0) { + extract_from_brackets; + @temparray1=split('\|\|',$scsline); + $loopvariable=$temparray1[0]; + @loopvaluearray=split(';',$temparray1[1]); + @loopdata=(); + $loopdepth=$loopdepth+1; + $loopstartnum=$linenum; + $linenum=$linenum+1; + } + elsif ($scsline=~m/END OUTER LOOP/ eq "1" and $loopdepth eq 1) { + $loopdepth=0; + $looplength=$linenum+1-$loopstartnum; + @templooparray=(); + foreach $10 (@loopvaluearray) { + @temparray0=split('&',$10); + foreach $11 (@loopdata) { + if ($11=~m/$loopvariable/ eq "1") { + foreach $12 (@temparray0) { + $loopline=$11; + $loopline=~s/$loopvariable/$12/; + push @templooparray,$loopline; + } + } + else { + push @templooparray,$11; + } + } + } + splice (@scsarray,$loopstartnum,$looplength,@templooparray); + $linenum=$loopstartnum; + } + elsif ($scsline=~m/BEGIN OUTER LOOP/ eq "1" and $loopdepth ne 0) { + $linenum=$linenum+1; + push @loopdata,$scsline; + $loopdepth=$loopdepth+1; + } + elsif ($scsline=~m/END OUTER LOOP/ eq "1" and $loopdepth ne 1) { + $linenum=$linenum+1; + push @loopdata,$scsline; + $loopdepth=$loopdepth-1; + } + elsif ($loopdepth ne 0) { + $linenum=$linenum+1; + push @loopdata,$scsline; + } + else { + if ($scsline=~m/VARIABLE/ eq "1") { + strip_spaces(); + extract_from_brackets(); + $therearevars="Yes"; + @vararraytemp=split('&',$scsline); + foreach $2 (@vararraytemp) { + @vararraytemp2=split('=',$2); + $varhash{$vararraytemp2[0]}=$vararraytemp2[1]; + } + + } + $linenum=$linenum+1; + } + } + if ($loopdepth ne 0) { + die "SYNTAX ERROR: unclosed outer loops" + } + +} + + +################################################################### + +print "This is Stratagems Scripting Language\n"; +$userinput=shift; +process_user_input; +read_library(); +foreach (@filelist) { + $location="none"; + @scsarray=(); + @trigger=(); + @action=(); + @output=(); + $combine=""; + $inputfile=$_; + + $outputfile=$_; + work_out_outputfile(); + + + $inputfile=~s/\\/\//g; + print "\n \n Input file is $inputfile \n"; + read_input(); + + + work_out_outer_loops(); + process_include_blocks(); + + $linenum=0; + $loopdepth=0; + while ($linenum < scalar @scsarray) { + $scsline=$scsarray[$linenum]; + if ($therearevars=="Yes") { + foreach $1 (keys %varhash) { + $old=$1; + $new=$varhash{$old}; + $scsline=~s/$old/$new/; + } + } + strip_spaces(); + if ($scsline=~m/BEGIN LOOP/ eq "1" and $loopdepth eq 0) { + extract_from_brackets; + @temparray1=split('\|\|',$scsline); + $loopvariable=$temparray1[0]; + @loopvaluearray=split(';',$temparray1[1]); + @loopdata=(); + $loopdepth=$loopdepth+1; + $loopstartnum=$linenum; + $linenum=$linenum+1; + } + elsif ($scsline=~m/END LOOP/ eq "1" and $loopdepth eq 1) { + $loopdepth=0; + $looplength=$linenum+1-$loopstartnum; + @templooparray=(); + foreach $10 (@loopvaluearray) { + @temparray0=split('&',$10); + foreach $11 (@loopdata) { + if ($11=~m/$loopvariable/ eq "1") { + foreach $12 (@temparray0) { + $loopline=$11; + $loopline=~s/$loopvariable/$12/; + push @templooparray,$loopline; + } + } + else { + push @templooparray,$11; + } + } + } + splice (@scsarray,$loopstartnum,$looplength,@templooparray); + $linenum=$loopstartnum; + } + elsif ($scsline=~m/BEGIN LOOP/ eq "1" and $loopdepth ne 0) { + $linenum=$linenum+1; + push @loopdata,$scsline; + $loopdepth=$loopdepth+1; + } + elsif ($scsline=~m/END LOOP/ eq "1" and $loopdepth ne 1) { + $linenum=$linenum+1; + push @loopdata,$scsline; + $loopdepth=$loopdepth-1; + } + elsif ($scsline=~m/INCLUDE FILE/ eq "1" and $loopdepth ne 0) { + extract_from_brackets; + die "waargh, we shouldn't be here (1)"; + unless (open (infile, lc $scsline)) { + die "FATAL ERROR (SSL cannot find file requested [$scsline] at line $linenum)"; + } + @temparray=; + close(infile); + push @loopdata,@temparray; + $linenum=$linenum+1; + } + elsif ($loopdepth ne 0) { + $linenum=$linenum+1; + push @loopdata,$scsline; + } + elsif ($scsline eq "IF") { + $linenum=$linenum+1; + splice (@scsarray,$linenum,0,@defaulttrigger); + process_line; + } + elsif ($scsline=~m/INCLUDE FILE/ eq "1") { + extract_from_brackets; + die "waargh, we shouldn't be here (2)"; + print "attempting to open file $scsline ..."; + unless (open (infile, lc $scsline)) { + die "FATAL ERROR (SSL cannot find file requested [$scsline] at line $linenum)"; + } + print "successful!\n"; + @temparray=; + close(infile); + splice(@scsarray,$linenum,1,@temparray); + } + else { + $linenum=$linenum+1; + process_line; + } + } + $outputexists="No"; + if ($loopdepth ne 0) { + die "SYNTAX ERROR: unclosed loops" + } + foreach $outputcheck (@output) { + chomp $outputcheck; + if ($outputcheck ne "") { + $outputexists="Yes" + } + } + if ($outputexists eq "Yes") { + print "\n Output file is $outputfile \n"; + write_output(); + } + else { + print "\n No output file for this input file "; + } +} diff --git a/iwdification/tpa/druid_elf.tpa b/iwdification/tpa/druid_elf.tpa new file mode 100644 index 0000000..7537dd0 --- /dev/null +++ b/iwdification/tpa/druid_elf.tpa @@ -0,0 +1,6 @@ +COPY_EXISTING ~clsrcreq.2da~ ~override~ + PATCH_FOR_EACH class IN DRUID TOTEMIC_DRUID SHAPESHIFTER BEAST_FRIEND FIGHTER_DRUID BEGIN + REPLACE_TEXTUALLY ~^\(%class%[ %TAB%]+[0-9]+[ %TAB%]+\)[0-9]+\([ %TAB%]+.+\)$~ ~\11\2~ + END + PRETTY_PRINT_2DA + BUT_ONLY \ No newline at end of file diff --git a/iwdification/tpa/druid_poly.tpa b/iwdification/tpa/druid_poly.tpa new file mode 100644 index 0000000..80dc995 --- /dev/null +++ b/iwdification/tpa/druid_poly.tpa @@ -0,0 +1,184 @@ + + +OUTER_SET anim_beetle = 0 // 30720 gibb for testing +ACTION_IF enhanced_edition BEGIN + + STRING_SET 9560 @7011 // obg2 class descriptions don't include abilities + OUTER_SET anim_beetle = 57888 + COPY ~iwdification/data/anim/e220.ini~ ~override~ + ~iwdification/dw_iwdspells_resource/anim/bam~ ~override~ + ~iwdification/dw_iwdspells_resource/anim/wav~ ~override~ + +END ELSE BEGIN + + ACTION_IF MOD_IS_INSTALLED ~INFINITYANIMATIONS/SETUP-INFINITYANIMATIONS.TP2~ ~500~ BEGIN // 'more base animations' + + ACTION_IF IDS_OF_SYMBOL (~animate~ ~BEETLE_BLACK~) > 0 THEN BEGIN + OUTER_SET anim_beetle = IDS_OF_SYMBOL (~animate~ ~BEETLE_BLACK~) + END + + END + +END + +OUTER_SPRINT first_ss cdidrbr // if no beetle, keep black bear +ACTION_IF anim_beetle BEGIN OUTER_SPRINT first_ss cdidrbb END + +ACTION_CLEAR_ARRAY cd_druid_poly +ACTION_DEFINE_ASSOCIATIVE_ARRAY cd_druid_poly BEGIN + + // item/creature => spell + cdia480 => cdidrbb + cdia481 => cdidrpb + cdia482 => cdidrww + cdidree => cdidree + cdidrfe => cdidrfe + cdidrwe => cdidrwe + cdidrbr => cdidrbr // alternative black bear for boring beetle + +END + +ACTION_PHP_EACH cd_druid_poly AS res => spell BEGIN + + // clone wolf shapeshifting to others + COPY ~iwdification/spl/cdidree.spl~ ~override/%spell%.spl~ + SAY 0x08 @9005 // boring beetle + SAY 0x50 @9006 + WRITE_ASCIIE 0x3a ~%res%b~ #8 + LPF ALTER_SPELL_HEADER STR_VAR icon = EVAL ~%res%b~ END + LPF ALTER_EFFECT INT_VAR match_opcode = 111 STR_VAR resource = EVAL ~%res%~ END // give weapon + + COPY ~iwdification/bam/%res%.bam~ ~override~ + ~iwdification/bam/%res%b.bam~ ~override~ + ~iwdification/cre/%res%.cre~ ~override~ + ~iwdification/itm/%res%.itm~ ~override~ + +END + +COPY_EXISTING ~cdidrpb.spl~ ~override~ + SAY 0x08 @9007 // polar bear + SAY 0x50 @9008 + +COPY_EXISTING ~cdidrww.spl~ ~override~ + SAY 0x08 @9009 // winter wolf + SAY 0x50 @9010 + +COPY_EXISTING ~cdidree.spl~ ~override~ + SAY 0x08 @7003 // earth elemental + SAY 0x50 @7006 + +COPY_EXISTING ~cdidrfe.spl~ ~override~ + SAY 0x08 @7002 // fire elemental + SAY 0x50 @7005 + +COPY_EXISTING ~cdidrwe.spl~ ~override~ + SAY 0x08 @7004 // water elemental + SAY 0x50 @7007 + +COPY_EXISTING ~cdidrbr.spl~ ~override~ + SAY 0x08 #19792 + SAY 0x50 @7008 + +COPY_EXISTING ~cdia480.cre~ ~override~ + SAY 0x08 @9001 // boring beetle + SAY 0x0c @9001 + WRITE_LONG 0x28 anim_beetle + +COPY_EXISTING ~cdidrwe.cre~ ~override~ + SAY 0x08 @7009 // water elemental + SAY 0x0c @7009 + +COPY ~iwdification/spl/cdidrif.spl~ ~override~ + SAY 0xfe @7010 + +COPY_EXISTING ~clabdr01.2da~ ~override~ + REPLACE_TEXTUALLY ~[ %TAB%]GA_SPCL611[ %TAB%]~ ~ GA_%first_ss% ~ EVALUATE_BUFFER + PATCH_FOR_EACH res IN SPCL612 SPCL613 SPCL924 SPCL925 SPCL926 SPCL927 BEGIN + REPLACE_TEXTUALLY ~[ %TAB%]\(GA\|AP\)_%res%[ %TAB%]~ ~ **** ~ + END + +APPEND ~clabdr01.2da~ +~ABILITYX **** **** **** **** GA_cdidrww **** **** **** GA_cdidrpb **** GA_cdidrfe **** GA_cdidree **** GA_cdidrwe CDREPLACE +ABILITYY **** **** **** **** **** **** **** **** AP_SPCL924 **** **** **** **** **** AP_cdidrif CDREPLACE~ + +COPY_EXISTING ~clabdr01.2da~ ~override~ + COUNT_2DA_COLS cols + FOR (index = 17 ; index < cols ; ++index) BEGIN + REPLACE_TEXTUALLY ~CDREPLACE~ ~**** CDREPLACE~ + END + REPLACE_TEXTUALLY ~CDREPLACE~ ~****~ + PRETTY_PRINT_2DA + BUT_ONLY + +// handing out some abilities +COPY_EXISTING_REGEXP GLOB ~^.+\.cre$~ ~override~ + SET druid_level = 0 + READ_LONG 0x010 dual // block of flags including the dual-class bits + READ_BYTE 0x234 level1 // If dual-classed, this value is put in the next field, and this field is set to 1. + READ_BYTE 0x235 level2 // Highest attained level in secondary class (0-100) + READ_BYTE 0x273 class // V1.0 + READ_SHORT 0x246 kit + PATCH_IF ((class = 11) AND ((kit = 0) OR (kit = 0x4000))) BEGIN // single-class, unkitted druid + SET druid_level = level1 + END ELSE + PATCH_IF class = 16 BEGIN // f/d + PATCH_IF ((dual & BIT3) = BIT3) BEGIN // f > d dual - can't dual into kit, so no kit check + SET druid_level = level1 + END ELSE + PATCH_IF ((dual & BIT7) = BIT7) BEGIN // d > f dual + PATCH_IF ((level1 > level2) AND ((kit = 0) OR (kit = 0x4000))) BEGIN // only set if druid re-activated and unkitted + SET druid_level = level2 + END + END ELSE BEGIN // true multiclass - no kit allowed + SET druid_level = level2 + END + END + PATCH_IF druid_level BEGIN + REMOVE_MEMORIZED_SPELL ~spcl611~ ~spcl612~ ~spcl613~ // remove all shapeshifts + REMOVE_KNOWN_SPELL ~spcl611~ ~spcl612~ ~spcl613~ // remove all shapeshifts + // since poison immunity is being moved up, no reason to remove it (worse case it gets duped); fatigue immunity doesn't mean anything for non-party + PATCH_IF druid_level > 4 BEGIN + ADD_KNOWN_SPELL cdidrww #0 ~innate~ + ADD_MEMORIZED_SPELL cdidrww #0 ~innate~ (1) + PATCH_IF druid_level > 6 BEGIN + ADD_KNOWN_SPELL ~%first_ss%~ #0 ~innate~ + ADD_MEMORIZED_SPELL ~%first_ss%~ #0 ~innate~ (1) + PATCH_IF druid_level > 8 BEGIN + ADD_KNOWN_SPELL cdidrpb #0 ~innate~ + ADD_MEMORIZED_SPELL cdidrpb #0 ~innate~ (1) + LPF ADD_CRE_EFFECT INT_VAR opcode = 206 target = 1 timing = 1 STR_VAR resource = spwi502 effsource = spcl924 END // spell immunity: cloudkill + LPF ADD_CRE_EFFECT INT_VAR opcode = 206 target = 1 timing = 1 STR_VAR resource = spwi016 effsource = spcl924 END // spell immunity: cloudkill + LPF ADD_CRE_EFFECT INT_VAR opcode = 206 target = 1 timing = 1 STR_VAR resource = spin673 effsource = spcl924 END // spell immunity: cloudkill + LPF ADD_CRE_EFFECT INT_VAR opcode = 267 target = 1 timing = 1 parameter1 = 14017 STR_VAR effsource = spcl924 END // string immunity: poison + LPF ADD_CRE_EFFECT INT_VAR opcode = 267 target = 1 timing = 1 parameter1 = 14662 STR_VAR effsource = spcl924 END // string immunity: poisoned + LPF ADD_CRE_EFFECT INT_VAR opcode = 101 target = 1 timing = 1 parameter2 = 25 STR_VAR effsource = spcl924 END // immunity to poison + LPF ADD_CRE_EFFECT INT_VAR opcode = 173 target = 1 timing = 1 parameter1 = 100 STR_VAR effsource = spcl924 END // 100% poison damage resistance + PATCH_IF druid_level > 10 BEGIN + ADD_KNOWN_SPELL cdidrfe #0 ~innate~ + ADD_MEMORIZED_SPELL cdidrfe #0 ~innate~ (1) + PATCH_IF druid_level > 12 BEGIN + ADD_KNOWN_SPELL cdidree #0 ~innate~ + ADD_MEMORIZED_SPELL cdidree #0 ~innate~ (1) + PATCH_IF druid_level > 14 BEGIN + ADD_KNOWN_SPELL cdidrwe #0 ~innate~ + ADD_MEMORIZED_SPELL cdidrwe #0 ~innate~ (1) + LPF ADD_CRE_EFFECT INT_VAR opcode = 101 target = 1 timing = 1 parameter2 = 93 STR_VAR effsource = cdidrif END // immunity to fatigue + LPF ADD_CRE_EFFECT INT_VAR opcode = 93 target = 1 timing = 1 parameter2 = 1 insert_point = 0 STR_VAR effsource = cdidrif END // set fatigue to 0 + PATCH_IF druid_level > 24 BEGIN SET druid_level = 24 END // will kill loop after three goes + FOR (index = 17 ; druid_level > index ; index += 3) BEGIN // drop the +10% elemental bonuses + PATCH_FOR_EACH offset IN 0x59 0x5a 0x5b 0x5c 0x5e 0x5f BEGIN + READ_BYTE offset resist + PATCH_IF ((resist > 9) AND (resist < 100)) BEGIN // only if non-zero and not seemingly immune + WRITE_BYTE offset (resist - 10) + END + END + END // for loop for elemental resist bonuses + END // lev 15 bonuses + END // lev 13 bonuses + END // lev 11 bonuses + END // lev 9 bonuses + END // lev 7 bonuses + END // lev 5 bonuses + END // druid check + BUT_ONLY + \ No newline at end of file diff --git a/iwdification/vvc/cdi7ey.vvc b/iwdification/vvc/cdi7ey.vvc deleted file mode 100644 index e87b355..0000000 Binary files a/iwdification/vvc/cdi7ey.vvc and /dev/null differ diff --git a/iwdification/vvc/cdi7ey1a.vvc b/iwdification/vvc/cdi7ey1a.vvc deleted file mode 100644 index 749a236..0000000 Binary files a/iwdification/vvc/cdi7ey1a.vvc and /dev/null differ diff --git a/iwdification/vvc/cdi7ey1b.vvc b/iwdification/vvc/cdi7ey1b.vvc deleted file mode 100644 index 75e5f74..0000000 Binary files a/iwdification/vvc/cdi7ey1b.vvc and /dev/null differ diff --git a/iwdification/vvc/cdi7ey1c.vvc b/iwdification/vvc/cdi7ey1c.vvc deleted file mode 100644 index 1d8a920..0000000 Binary files a/iwdification/vvc/cdi7ey1c.vvc and /dev/null differ diff --git a/iwdification/vvc/cdi7ey1d.vvc b/iwdification/vvc/cdi7ey1d.vvc deleted file mode 100644 index 8f9797b..0000000 Binary files a/iwdification/vvc/cdi7ey1d.vvc and /dev/null differ diff --git a/iwdification/vvc/cdi7ey1e.vvc b/iwdification/vvc/cdi7ey1e.vvc deleted file mode 100644 index c906c36..0000000 Binary files a/iwdification/vvc/cdi7ey1e.vvc and /dev/null differ diff --git a/iwdification/vvc/cdi7ey1f.vvc b/iwdification/vvc/cdi7ey1f.vvc deleted file mode 100644 index c7b2f03..0000000 Binary files a/iwdification/vvc/cdi7ey1f.vvc and /dev/null differ diff --git a/iwdification/vvc/cdi7ey1g.vvc b/iwdification/vvc/cdi7ey1g.vvc deleted file mode 100644 index bab89f9..0000000 Binary files a/iwdification/vvc/cdi7ey1g.vvc and /dev/null differ diff --git a/iwdification/vvc/cdi7ey2a.vvc b/iwdification/vvc/cdi7ey2a.vvc deleted file mode 100644 index fb2390c..0000000 Binary files a/iwdification/vvc/cdi7ey2a.vvc and /dev/null differ diff --git a/iwdification/vvc/cdi7ey2b.vvc b/iwdification/vvc/cdi7ey2b.vvc deleted file mode 100644 index 5fa05be..0000000 Binary files a/iwdification/vvc/cdi7ey2b.vvc and /dev/null differ diff --git a/iwdification/vvc/cdi7ey2c.vvc b/iwdification/vvc/cdi7ey2c.vvc deleted file mode 100644 index 2e21f9d..0000000 Binary files a/iwdification/vvc/cdi7ey2c.vvc and /dev/null differ diff --git a/iwdification/vvc/cdi7ey2d.vvc b/iwdification/vvc/cdi7ey2d.vvc deleted file mode 100644 index 2165fac..0000000 Binary files a/iwdification/vvc/cdi7ey2d.vvc and /dev/null differ diff --git a/iwdification/vvc/cdi7ey2e.vvc b/iwdification/vvc/cdi7ey2e.vvc deleted file mode 100644 index 21ee1bd..0000000 Binary files a/iwdification/vvc/cdi7ey2e.vvc and /dev/null differ diff --git a/iwdification/vvc/cdi7ey2f.vvc b/iwdification/vvc/cdi7ey2f.vvc deleted file mode 100644 index d840aa1..0000000 Binary files a/iwdification/vvc/cdi7ey2f.vvc and /dev/null differ diff --git a/iwdification/vvc/cdi7ey2g.vvc b/iwdification/vvc/cdi7ey2g.vvc deleted file mode 100644 index be805c5..0000000 Binary files a/iwdification/vvc/cdi7ey2g.vvc and /dev/null differ diff --git a/iwdification/vvc/cdia7240.vvc b/iwdification/vvc/cdia7240.vvc deleted file mode 100644 index c4c39b8..0000000 Binary files a/iwdification/vvc/cdia7240.vvc and /dev/null differ diff --git a/iwdification/vvc/cdia7241.vvc b/iwdification/vvc/cdia7241.vvc deleted file mode 100644 index 1254c8d..0000000 Binary files a/iwdification/vvc/cdia7241.vvc and /dev/null differ diff --git a/iwdification/vvc/cdia7242.vvc b/iwdification/vvc/cdia7242.vvc deleted file mode 100644 index 883c595..0000000 Binary files a/iwdification/vvc/cdia7242.vvc and /dev/null differ diff --git a/iwdification/vvc/cdia7243.vvc b/iwdification/vvc/cdia7243.vvc deleted file mode 100644 index e937a76..0000000 Binary files a/iwdification/vvc/cdia7243.vvc and /dev/null differ diff --git a/iwdification/vvc/cdia7244.vvc b/iwdification/vvc/cdia7244.vvc deleted file mode 100644 index 6a413b5..0000000 Binary files a/iwdification/vvc/cdia7244.vvc and /dev/null differ diff --git a/iwdification/vvc/cdia7245.vvc b/iwdification/vvc/cdia7245.vvc deleted file mode 100644 index d3b5358..0000000 Binary files a/iwdification/vvc/cdia7245.vvc and /dev/null differ diff --git a/iwdification/vvc/cdia7246.vvc b/iwdification/vvc/cdia7246.vvc deleted file mode 100644 index 004c659..0000000 Binary files a/iwdification/vvc/cdia7246.vvc and /dev/null differ diff --git a/iwdification/vvc/cdia7247.vvc b/iwdification/vvc/cdia7247.vvc deleted file mode 100644 index 575fc83..0000000 Binary files a/iwdification/vvc/cdia7247.vvc and /dev/null differ diff --git a/iwdification/vvc/cdia7248.vvc b/iwdification/vvc/cdia7248.vvc deleted file mode 100644 index 07c5ded..0000000 Binary files a/iwdification/vvc/cdia7248.vvc and /dev/null differ diff --git a/iwdification/vvc/cdia7249.vvc b/iwdification/vvc/cdia7249.vvc deleted file mode 100644 index 1cc7c17..0000000 Binary files a/iwdification/vvc/cdia7249.vvc and /dev/null differ diff --git a/iwdification/vvc/cdia724x.vvc b/iwdification/vvc/cdia724x.vvc deleted file mode 100644 index ee0d2bc..0000000 Binary files a/iwdification/vvc/cdia724x.vvc and /dev/null differ diff --git a/iwdification/vvc/cdia724y.vvc b/iwdification/vvc/cdia724y.vvc deleted file mode 100644 index 4fc6bf4..0000000 Binary files a/iwdification/vvc/cdia724y.vvc and /dev/null differ diff --git a/iwdification/vvc/cdia724z.vvc b/iwdification/vvc/cdia724z.vvc deleted file mode 100644 index 006f161..0000000 Binary files a/iwdification/vvc/cdia724z.vvc and /dev/null differ diff --git a/iwdification/vvc/cdiabjur.vvc b/iwdification/vvc/cdiabjur.vvc deleted file mode 100644 index fdb5625..0000000 Binary files a/iwdification/vvc/cdiabjur.vvc and /dev/null differ diff --git a/iwdification/vvc/cdiacid.vvc b/iwdification/vvc/cdiacid.vvc deleted file mode 100644 index e42f005..0000000 Binary files a/iwdification/vvc/cdiacid.vvc and /dev/null differ diff --git a/iwdification/vvc/cdialter.vvc b/iwdification/vvc/cdialter.vvc deleted file mode 100644 index c24496b..0000000 Binary files a/iwdification/vvc/cdialter.vvc and /dev/null differ diff --git a/iwdification/vvc/cdiamags.vvc b/iwdification/vvc/cdiamags.vvc deleted file mode 100644 index e1425a5..0000000 Binary files a/iwdification/vvc/cdiamags.vvc and /dev/null differ diff --git a/iwdification/vvc/cdiasm1x.vvc b/iwdification/vvc/cdiasm1x.vvc deleted file mode 100644 index ca95be2..0000000 Binary files a/iwdification/vvc/cdiasm1x.vvc and /dev/null differ diff --git a/iwdification/vvc/cdibhcld.vvc b/iwdification/vvc/cdibhcld.vvc deleted file mode 100644 index 1bcdffa..0000000 Binary files a/iwdification/vvc/cdibhcld.vvc and /dev/null differ diff --git a/iwdification/vvc/cdibless.vvc b/iwdification/vvc/cdibless.vvc deleted file mode 100644 index 02d7634..0000000 Binary files a/iwdification/vvc/cdibless.vvc and /dev/null differ diff --git a/iwdification/vvc/cdibone1.vvc b/iwdification/vvc/cdibone1.vvc deleted file mode 100644 index be77ec0..0000000 Binary files a/iwdification/vvc/cdibone1.vvc and /dev/null differ diff --git a/iwdification/vvc/cdibone2.vvc b/iwdification/vvc/cdibone2.vvc deleted file mode 100644 index eca1cdd..0000000 Binary files a/iwdification/vvc/cdibone2.vvc and /dev/null differ diff --git a/iwdification/vvc/cdiceelx.vvc b/iwdification/vvc/cdiceelx.vvc deleted file mode 100644 index 597bda5..0000000 Binary files a/iwdification/vvc/cdiceelx.vvc and /dev/null differ diff --git a/iwdification/vvc/cdicfelx.vvc b/iwdification/vvc/cdicfelx.vvc deleted file mode 100644 index 63fcfb8..0000000 Binary files a/iwdification/vvc/cdicfelx.vvc and /dev/null differ diff --git a/iwdification/vvc/cdicldam.vvc b/iwdification/vvc/cdicldam.vvc deleted file mode 100644 index 8d0dc85..0000000 Binary files a/iwdification/vvc/cdicldam.vvc and /dev/null differ diff --git a/iwdification/vvc/cdicmdam.vvc b/iwdification/vvc/cdicmdam.vvc deleted file mode 100644 index 30851f1..0000000 Binary files a/iwdification/vvc/cdicmdam.vvc and /dev/null differ diff --git a/iwdification/vvc/cdicmwou.vvc b/iwdification/vvc/cdicmwou.vvc deleted file mode 100644 index c38e1e5..0000000 Binary files a/iwdification/vvc/cdicmwou.vvc and /dev/null differ diff --git a/iwdification/vvc/cdiconju.vvc b/iwdification/vvc/cdiconju.vvc deleted file mode 100644 index 2c9ee4f..0000000 Binary files a/iwdification/vvc/cdiconju.vvc and /dev/null differ diff --git a/iwdification/vvc/cdicurse.vvc b/iwdification/vvc/cdicurse.vvc deleted file mode 100644 index f93dc44..0000000 Binary files a/iwdification/vvc/cdicurse.vvc and /dev/null differ diff --git a/iwdification/vvc/cdicwelx.vvc b/iwdification/vvc/cdicwelx.vvc deleted file mode 100644 index 54de021..0000000 Binary files a/iwdification/vvc/cdicwelx.vvc and /dev/null differ diff --git a/iwdification/vvc/cdid5120.vvc b/iwdification/vvc/cdid5120.vvc deleted file mode 100644 index 7cd016f..0000000 Binary files a/iwdification/vvc/cdid5120.vvc and /dev/null differ diff --git a/iwdification/vvc/cdid5121.vvc b/iwdification/vvc/cdid5121.vvc deleted file mode 100644 index 1324181..0000000 Binary files a/iwdification/vvc/cdid5121.vvc and /dev/null differ diff --git a/iwdification/vvc/cdid5122.vvc b/iwdification/vvc/cdid5122.vvc deleted file mode 100644 index c7e7295..0000000 Binary files a/iwdification/vvc/cdid5122.vvc and /dev/null differ diff --git a/iwdification/vvc/cdid5123.vvc b/iwdification/vvc/cdid5123.vvc deleted file mode 100644 index bb8ac73..0000000 Binary files a/iwdification/vvc/cdid5123.vvc and /dev/null differ diff --git a/iwdification/vvc/cdid5124.vvc b/iwdification/vvc/cdid5124.vvc deleted file mode 100644 index 29429e8..0000000 Binary files a/iwdification/vvc/cdid5124.vvc and /dev/null differ diff --git a/iwdification/vvc/cdid5125.vvc b/iwdification/vvc/cdid5125.vvc deleted file mode 100644 index d55e9aa..0000000 Binary files a/iwdification/vvc/cdid5125.vvc and /dev/null differ diff --git a/iwdification/vvc/cdid7200.vvc b/iwdification/vvc/cdid7200.vvc deleted file mode 100644 index 7d70bf7..0000000 Binary files a/iwdification/vvc/cdid7200.vvc and /dev/null differ diff --git a/iwdification/vvc/cdid7201.vvc b/iwdification/vvc/cdid7201.vvc deleted file mode 100644 index 3dea338..0000000 Binary files a/iwdification/vvc/cdid7201.vvc and /dev/null differ diff --git a/iwdification/vvc/cdid7202.vvc b/iwdification/vvc/cdid7202.vvc deleted file mode 100644 index 0cdeed0..0000000 Binary files a/iwdification/vvc/cdid7202.vvc and /dev/null differ diff --git a/iwdification/vvc/cdid7203.vvc b/iwdification/vvc/cdid7203.vvc deleted file mode 100644 index 2b1d754..0000000 Binary files a/iwdification/vvc/cdid7203.vvc and /dev/null differ diff --git a/iwdification/vvc/cdid7204.vvc b/iwdification/vvc/cdid7204.vvc deleted file mode 100644 index ef9b52e..0000000 Binary files a/iwdification/vvc/cdid7204.vvc and /dev/null differ diff --git a/iwdification/vvc/cdid7205.vvc b/iwdification/vvc/cdid7205.vvc deleted file mode 100644 index 9ee4a0b..0000000 Binary files a/iwdification/vvc/cdid7205.vvc and /dev/null differ diff --git a/iwdification/vvc/cdid7206.vvc b/iwdification/vvc/cdid7206.vvc deleted file mode 100644 index 14d3049..0000000 Binary files a/iwdification/vvc/cdid7206.vvc and /dev/null differ diff --git a/iwdification/vvc/cdid7207.vvc b/iwdification/vvc/cdid7207.vvc deleted file mode 100644 index eae8785..0000000 Binary files a/iwdification/vvc/cdid7207.vvc and /dev/null differ diff --git a/iwdification/vvc/cdidestr.vvc b/iwdification/vvc/cdidestr.vvc deleted file mode 100644 index c4c9ff1..0000000 Binary files a/iwdification/vvc/cdidestr.vvc and /dev/null differ diff --git a/iwdification/vvc/cdidise.vvc b/iwdification/vvc/cdidise.vvc deleted file mode 100644 index 6fd3634..0000000 Binary files a/iwdification/vvc/cdidise.vvc and /dev/null differ diff --git a/iwdification/vvc/cdidivin.vvc b/iwdification/vvc/cdidivin.vvc deleted file mode 100644 index a325997..0000000 Binary files a/iwdification/vvc/cdidivin.vvc and /dev/null differ diff --git a/iwdification/vvc/cdidoorh.vvc b/iwdification/vvc/cdidoorh.vvc deleted file mode 100644 index 696c2e8..0000000 Binary files a/iwdification/vvc/cdidoorh.vvc and /dev/null differ diff --git a/iwdification/vvc/cdiencha.vvc b/iwdification/vvc/cdiencha.vvc deleted file mode 100644 index 09b4c40..0000000 Binary files a/iwdification/vvc/cdiencha.vvc and /dev/null differ diff --git a/iwdification/vvc/cdientro.vvc b/iwdification/vvc/cdientro.vvc deleted file mode 100644 index 06e71e5..0000000 Binary files a/iwdification/vvc/cdientro.vvc and /dev/null differ diff --git a/iwdification/vvc/cdiexalt.vvc b/iwdification/vvc/cdiexalt.vvc deleted file mode 100644 index a830721..0000000 Binary files a/iwdification/vvc/cdiexalt.vvc and /dev/null differ diff --git a/iwdification/vvc/cdigabju.vvc b/iwdification/vvc/cdigabju.vvc deleted file mode 100644 index bc0da74..0000000 Binary files a/iwdification/vvc/cdigabju.vvc and /dev/null differ diff --git a/iwdification/vvc/cdigench.vvc b/iwdification/vvc/cdigench.vvc deleted file mode 100644 index 3427532..0000000 Binary files a/iwdification/vvc/cdigench.vvc and /dev/null differ diff --git a/iwdification/vvc/cdiinvoc.vvc b/iwdification/vvc/cdiinvoc.vvc deleted file mode 100644 index e7e3e47..0000000 Binary files a/iwdification/vvc/cdiinvoc.vvc and /dev/null differ diff --git a/iwdification/vvc/cdilatg1.vvc b/iwdification/vvc/cdilatg1.vvc deleted file mode 100644 index 9e9c37e..0000000 Binary files a/iwdification/vvc/cdilatg1.vvc and /dev/null differ diff --git a/iwdification/vvc/cdilatg2.vvc b/iwdification/vvc/cdilatg2.vvc deleted file mode 100644 index 7d907f3..0000000 Binary files a/iwdification/vvc/cdilatg2.vvc and /dev/null differ diff --git a/iwdification/vvc/cdilatl1.vvc b/iwdification/vvc/cdilatl1.vvc deleted file mode 100644 index d62d9dd..0000000 Binary files a/iwdification/vvc/cdilatl1.vvc and /dev/null differ diff --git a/iwdification/vvc/cdilatl2.vvc b/iwdification/vvc/cdilatl2.vvc deleted file mode 100644 index 94ab42a..0000000 Binary files a/iwdification/vvc/cdilatl2.vvc and /dev/null differ diff --git a/iwdification/vvc/cdimalrg.vvc b/iwdification/vvc/cdimalrg.vvc deleted file mode 100644 index a567de7..0000000 Binary files a/iwdification/vvc/cdimalrg.vvc and /dev/null differ diff --git a/iwdification/vvc/cdimfmsx.vvc b/iwdification/vvc/cdimfmsx.vvc deleted file mode 100644 index c69f543..0000000 Binary files a/iwdification/vvc/cdimfmsx.vvc and /dev/null differ diff --git a/iwdification/vvc/cdimoldt.vvc b/iwdification/vvc/cdimoldt.vvc deleted file mode 100644 index 27bf9dc..0000000 Binary files a/iwdification/vvc/cdimoldt.vvc and /dev/null differ diff --git a/iwdification/vvc/cdimoonx.vvc b/iwdification/vvc/cdimoonx.vvc deleted file mode 100644 index 24eb4fe..0000000 Binary files a/iwdification/vvc/cdimoonx.vvc and /dev/null differ diff --git a/iwdification/vvc/cdimrage.vvc b/iwdification/vvc/cdimrage.vvc deleted file mode 100644 index 877fabf..0000000 Binary files a/iwdification/vvc/cdimrage.vvc and /dev/null differ diff --git a/iwdification/vvc/cdimsm1h.vvc b/iwdification/vvc/cdimsm1h.vvc deleted file mode 100644 index b14733e..0000000 Binary files a/iwdification/vvc/cdimsm1h.vvc and /dev/null differ diff --git a/iwdification/vvc/cdimsm1x.vvc b/iwdification/vvc/cdimsm1x.vvc deleted file mode 100644 index 4e4f9c5..0000000 Binary files a/iwdification/vvc/cdimsm1x.vvc and /dev/null differ diff --git a/iwdification/vvc/cdinecro.vvc b/iwdification/vvc/cdinecro.vvc deleted file mode 100644 index 30ea3a2..0000000 Binary files a/iwdification/vvc/cdinecro.vvc and /dev/null differ diff --git a/iwdification/vvc/cdiparal.vvc b/iwdification/vvc/cdiparal.vvc deleted file mode 100644 index 98e8e7d..0000000 Binary files a/iwdification/vvc/cdiparal.vvc and /dev/null differ diff --git a/iwdification/vvc/cdiprayg.vvc b/iwdification/vvc/cdiprayg.vvc deleted file mode 100644 index f6237e7..0000000 Binary files a/iwdification/vvc/cdiprayg.vvc and /dev/null differ diff --git a/iwdification/vvc/cdiprayh.vvc b/iwdification/vvc/cdiprayh.vvc deleted file mode 100644 index 2d7a7b8..0000000 Binary files a/iwdification/vvc/cdiprayh.vvc and /dev/null differ diff --git a/iwdification/vvc/cdiprfir.vvc b/iwdification/vvc/cdiprfir.vvc deleted file mode 100644 index 65f2571..0000000 Binary files a/iwdification/vvc/cdiprfir.vvc and /dev/null differ diff --git a/iwdification/vvc/cdirecig.vvc b/iwdification/vvc/cdirecig.vvc deleted file mode 100644 index 5223b4e..0000000 Binary files a/iwdification/vvc/cdirecig.vvc and /dev/null differ diff --git a/iwdification/vvc/cdirecih.vvc b/iwdification/vvc/cdirecih.vvc deleted file mode 100644 index f249b31..0000000 Binary files a/iwdification/vvc/cdirecih.vvc and /dev/null differ diff --git a/iwdification/vvc/cdirwtfg.vvc b/iwdification/vvc/cdirwtfg.vvc deleted file mode 100644 index 7b1d82b..0000000 Binary files a/iwdification/vvc/cdirwtfg.vvc and /dev/null differ diff --git a/iwdification/vvc/cdirwtfh.vvc b/iwdification/vvc/cdirwtfh.vvc deleted file mode 100644 index 60b28de..0000000 Binary files a/iwdification/vvc/cdirwtfh.vvc and /dev/null differ diff --git a/iwdification/vvc/cdisalfi.vvc b/iwdification/vvc/cdisalfi.vvc deleted file mode 100644 index 3266ca1..0000000 Binary files a/iwdification/vvc/cdisalfi.vvc and /dev/null differ diff --git a/iwdification/vvc/cdisalfr.vvc b/iwdification/vvc/cdisalfr.vvc deleted file mode 100644 index 5e0267e..0000000 Binary files a/iwdification/vvc/cdisalfr.vvc and /dev/null differ diff --git a/iwdification/vvc/cdiseata.vvc b/iwdification/vvc/cdiseata.vvc deleted file mode 100644 index 3ccf69e..0000000 Binary files a/iwdification/vvc/cdiseata.vvc and /dev/null differ diff --git a/iwdification/vvc/cdiseath.vvc b/iwdification/vvc/cdiseath.vvc deleted file mode 100644 index 08ac8ef..0000000 Binary files a/iwdification/vvc/cdiseath.vvc and /dev/null differ diff --git a/iwdification/vvc/cdisgrwa.vvc b/iwdification/vvc/cdisgrwa.vvc deleted file mode 100644 index 371d61b..0000000 Binary files a/iwdification/vvc/cdisgrwa.vvc and /dev/null differ diff --git a/iwdification/vvc/cdisgrwx.vvc b/iwdification/vvc/cdisgrwx.vvc deleted file mode 100644 index 9d4d319..0000000 Binary files a/iwdification/vvc/cdisgrwx.vvc and /dev/null differ diff --git a/iwdification/vvc/cdishglp.vvc b/iwdification/vvc/cdishglp.vvc deleted file mode 100644 index be26960..0000000 Binary files a/iwdification/vvc/cdishglp.vvc and /dev/null differ diff --git a/iwdification/vvc/cdisofl.vvc b/iwdification/vvc/cdisofl.vvc deleted file mode 100644 index e870a9b..0000000 Binary files a/iwdification/vvc/cdisofl.vvc and /dev/null differ diff --git a/iwdification/vvc/cdisohx.vvc b/iwdification/vvc/cdisohx.vvc deleted file mode 100644 index b9caa7b..0000000 Binary files a/iwdification/vvc/cdisohx.vvc and /dev/null differ diff --git a/iwdification/vvc/cdissswa.vvc b/iwdification/vvc/cdissswa.vvc deleted file mode 100644 index 088ee8c..0000000 Binary files a/iwdification/vvc/cdissswa.vvc and /dev/null differ diff --git a/iwdification/vvc/cdistath.vvc b/iwdification/vvc/cdistath.vvc deleted file mode 100644 index f2f6d84..0000000 Binary files a/iwdification/vvc/cdistath.vvc and /dev/null differ diff --git a/iwdification/vvc/cdistone.vvc b/iwdification/vvc/cdistone.vvc deleted file mode 100644 index 722aee9..0000000 Binary files a/iwdification/vvc/cdistone.vvc and /dev/null differ diff --git a/iwdification/vvc/cdistorm.vvc b/iwdification/vvc/cdistorm.vvc deleted file mode 100644 index 4fb74f8..0000000 Binary files a/iwdification/vvc/cdistorm.vvc and /dev/null differ diff --git a/iwdification/vvc/cdisuffo.vvc b/iwdification/vvc/cdisuffo.vvc deleted file mode 100644 index cf71013..0000000 Binary files a/iwdification/vvc/cdisuffo.vvc and /dev/null differ diff --git a/iwdification/vvc/cdisunsc.vvc b/iwdification/vvc/cdisunsc.vvc deleted file mode 100644 index 99ad29b..0000000 Binary files a/iwdification/vvc/cdisunsc.vvc and /dev/null differ diff --git a/iwdification/vvc/cdiswavh.vvc b/iwdification/vvc/cdiswavh.vvc deleted file mode 100644 index 1d15061..0000000 Binary files a/iwdification/vvc/cdiswavh.vvc and /dev/null differ diff --git a/iwdification/vvc/cdiuwrdx.vvc b/iwdification/vvc/cdiuwrdx.vvc deleted file mode 100644 index 8aef890..0000000 Binary files a/iwdification/vvc/cdiuwrdx.vvc and /dev/null differ diff --git a/iwdification/vvc/cdivitsx.vvc b/iwdification/vvc/cdivitsx.vvc deleted file mode 100644 index 77f30fa..0000000 Binary files a/iwdification/vvc/cdivitsx.vvc and /dev/null differ diff --git a/iwdification/vvc/cdiwhirx.vvc b/iwdification/vvc/cdiwhirx.vvc deleted file mode 100644 index 2f1d29f..0000000 Binary files a/iwdification/vvc/cdiwhirx.vvc and /dev/null differ diff --git a/iwdification/vvc/coldh.vvc b/iwdification/vvc/coldh.vvc new file mode 100644 index 0000000..0211bc5 Binary files /dev/null and b/iwdification/vvc/coldh.vvc differ diff --git a/iwdification/vvc/electrh.vvc b/iwdification/vvc/electrh.vvc new file mode 100644 index 0000000..9bc0327 Binary files /dev/null and b/iwdification/vvc/electrh.vvc differ diff --git a/iwdification/vvc/fireh.vvc b/iwdification/vvc/fireh.vvc new file mode 100644 index 0000000..aa30d43 Binary files /dev/null and b/iwdification/vvc/fireh.vvc differ diff --git a/iwdification/wav/cdiafm04.ogg b/iwdification/wav/cdiafm04.ogg deleted file mode 100644 index db02c01..0000000 Binary files a/iwdification/wav/cdiafm04.ogg and /dev/null differ diff --git a/iwdification/wav/cdiafm13.ogg b/iwdification/wav/cdiafm13.ogg deleted file mode 100644 index d8980d5..0000000 Binary files a/iwdification/wav/cdiafm13.ogg and /dev/null differ diff --git a/iwdification/wav/cdiafm15.ogg b/iwdification/wav/cdiafm15.ogg deleted file mode 100644 index a58a290..0000000 Binary files a/iwdification/wav/cdiafm15.ogg and /dev/null differ diff --git a/iwdification/wav/cdiafm16.ogg b/iwdification/wav/cdiafm16.ogg deleted file mode 100644 index 0978be2..0000000 Binary files a/iwdification/wav/cdiafm16.ogg and /dev/null differ diff --git a/iwdification/wav/cdiafm17.ogg b/iwdification/wav/cdiafm17.ogg deleted file mode 100644 index 259e896..0000000 Binary files a/iwdification/wav/cdiafm17.ogg and /dev/null differ diff --git a/iwdification/wav/cdiafm18.ogg b/iwdification/wav/cdiafm18.ogg deleted file mode 100644 index 11ed995..0000000 Binary files a/iwdification/wav/cdiafm18.ogg and /dev/null differ diff --git a/iwdification/wav/cdiafp03.ogg b/iwdification/wav/cdiafp03.ogg deleted file mode 100644 index 526db0f..0000000 Binary files a/iwdification/wav/cdiafp03.ogg and /dev/null differ diff --git a/iwdification/wav/cdiafp20.ogg b/iwdification/wav/cdiafp20.ogg deleted file mode 100644 index 56cee87..0000000 Binary files a/iwdification/wav/cdiafp20.ogg and /dev/null differ diff --git a/iwdification/wav/cdiafp21.ogg b/iwdification/wav/cdiafp21.ogg deleted file mode 100644 index db0fe32..0000000 Binary files a/iwdification/wav/cdiafp21.ogg and /dev/null differ diff --git a/iwdification/wav/cdiafp24.ogg b/iwdification/wav/cdiafp24.ogg deleted file mode 100644 index d4c2beb..0000000 Binary files a/iwdification/wav/cdiafp24.ogg and /dev/null differ diff --git a/iwdification/wav/cdiafp25.ogg b/iwdification/wav/cdiafp25.ogg deleted file mode 100644 index 54be08f..0000000 Binary files a/iwdification/wav/cdiafp25.ogg and /dev/null differ diff --git a/iwdification/wav/cdiafp26.ogg b/iwdification/wav/cdiafp26.ogg deleted file mode 100644 index adb8f26..0000000 Binary files a/iwdification/wav/cdiafp26.ogg and /dev/null differ diff --git a/iwdification/wav/cdiarm02.ogg b/iwdification/wav/cdiarm02.ogg deleted file mode 100644 index c640b5f..0000000 Binary files a/iwdification/wav/cdiarm02.ogg and /dev/null differ diff --git a/iwdification/wav/cdiarp03.ogg b/iwdification/wav/cdiarp03.ogg deleted file mode 100644 index cb77613..0000000 Binary files a/iwdification/wav/cdiarp03.ogg and /dev/null differ diff --git a/iwdification/wav/cdiem01.ogg b/iwdification/wav/cdiem01.ogg deleted file mode 100644 index 36f3687..0000000 Binary files a/iwdification/wav/cdiem01.ogg and /dev/null differ diff --git a/iwdification/wav/cdiep101.ogg b/iwdification/wav/cdiep101.ogg deleted file mode 100644 index 07d74cb..0000000 Binary files a/iwdification/wav/cdiep101.ogg and /dev/null differ diff --git a/iwdification/wav/cdiep104.ogg b/iwdification/wav/cdiep104.ogg deleted file mode 100644 index 5bed66d..0000000 Binary files a/iwdification/wav/cdiep104.ogg and /dev/null differ diff --git a/iwdification/wav/cdiep105.ogg b/iwdification/wav/cdiep105.ogg deleted file mode 100644 index fb1d73e..0000000 Binary files a/iwdification/wav/cdiep105.ogg and /dev/null differ diff --git a/iwdification/wav/cdiep42.ogg b/iwdification/wav/cdiep42.ogg deleted file mode 100644 index cc1556e..0000000 Binary files a/iwdification/wav/cdiep42.ogg and /dev/null differ diff --git a/iwdification/wav/cdiep48.ogg b/iwdification/wav/cdiep48.ogg deleted file mode 100644 index 3ac90f0..0000000 Binary files a/iwdification/wav/cdiep48.ogg and /dev/null differ diff --git a/iwdification/wav/cditra18.ogg b/iwdification/wav/cditra18.ogg deleted file mode 100644 index d9f2689..0000000 Binary files a/iwdification/wav/cditra18.ogg and /dev/null differ diff --git a/iwdification/wav/cditra55.ogg b/iwdification/wav/cditra55.ogg deleted file mode 100644 index fbb1b58..0000000 Binary files a/iwdification/wav/cditra55.ogg and /dev/null differ diff --git a/iwdification/wav/cditra56.ogg b/iwdification/wav/cditra56.ogg deleted file mode 100644 index 1c5c59c..0000000 Binary files a/iwdification/wav/cditra56.ogg and /dev/null differ diff --git a/iwdification/wav/eff_m46.wav b/iwdification/wav/eff_m46.wav new file mode 100644 index 0000000..087eb43 Binary files /dev/null and b/iwdification/wav/eff_m46.wav differ diff --git a/iwdification/wav/cdiem47.ogg b/iwdification/wav/eff_m47.wav similarity index 100% rename from iwdification/wav/cdiem47.ogg rename to iwdification/wav/eff_m47.wav diff --git a/iwdification/wav/misc_01c.wav b/iwdification/wav/misc_01c.wav new file mode 100644 index 0000000..c6d87c1 Binary files /dev/null and b/iwdification/wav/misc_01c.wav differ diff --git a/iwdification/wav/misc_02c.wav b/iwdification/wav/misc_02c.wav new file mode 100644 index 0000000..950ca0f Binary files /dev/null and b/iwdification/wav/misc_02c.wav differ diff --git a/package_mod.bat b/package_mod.bat index 272159d..b4f487f 100644 --- a/package_mod.bat +++ b/package_mod.bat @@ -5,13 +5,13 @@ REM /* this initializes the values for the different variables referenced in com call "%~dp0..\ModPackaging\utilities\ie_games.bat" REM /* MODIFY: set the values of the 3 variables below to reflect the current mod version */ -set "mod_name=Iwdification" -set mod_version=Beta_5 +set "mod_name=IWDification" +set mod_version=RC1 set mod_folder=iwdification REM /* MODIFY: list here which IE games the mod is compatible with, from this list of possibilities: */ REM /* %bg1%, %bg2%, %bgt%, %tutu%, %bgee%, %bgiiee%, %iwd1%, %iwdee%, %iwd2%, %iwd2ee%, %iwd-in-bg2%, %pst%, %pstee% */ -set "compatible_games=%bg2%, %bgt%, %tutu%, %bgee%, %bgiiee%" +set "compatible_games=%bg2%, %bgt%, %tutu%, %bgee%, %bgiiee%, or %eet%" REM /* MODIFY: these variables have sensible default values but they may need to be tweaked to match your particular mod */ REM /* the ico_folder is where your .ico files are stored, which is usually the mod's backup or style folder */